lock_sock_nested(ssk, SINGLE_DEPTH_NESTING);
 
-       if (flags & MPTCP_CF_FASTCLOSE)
+       if (flags & MPTCP_CF_FASTCLOSE) {
+               /* be sure to force the tcp_disconnect() path,
+                * to generate the egress reset
+                */
+               ssk->sk_lingertime = 0;
+               sock_set_flag(ssk, SOCK_LINGER);
                subflow->send_fastclose = 1;
+       }
 
        need_push = (flags & MPTCP_CF_PUSH) && __mptcp_retransmit_pending_data(sk);
        if (!dispose_it) {
        mptcp_reset_timeout(msk, 0);
 }
 
+static void mptcp_do_fastclose(struct sock *sk)
+{
+       struct mptcp_subflow_context *subflow, *tmp;
+       struct mptcp_sock *msk = mptcp_sk(sk);
+
+       mptcp_for_each_subflow_safe(msk, subflow, tmp)
+               __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow),
+                                 subflow, MPTCP_CF_FASTCLOSE);
+}
+
 static void mptcp_worker(struct work_struct *work)
 {
        struct mptcp_sock *msk = container_of(work, struct mptcp_sock, work);
         * closed, but we need the msk around to reply to incoming DATA_FIN,
         * even if it is orphaned and in FIN_WAIT2 state
         */
-       if (sock_flag(sk, SOCK_DEAD) &&
-           (mptcp_check_close_timeout(sk) || sk->sk_state == TCP_CLOSE)) {
-               inet_sk_state_store(sk, TCP_CLOSE);
-               __mptcp_destroy_sock(sk);
-               goto unlock;
+       if (sock_flag(sk, SOCK_DEAD)) {
+               if (mptcp_check_close_timeout(sk)) {
+                       inet_sk_state_store(sk, TCP_CLOSE);
+                       mptcp_do_fastclose(sk);
+               }
+               if (sk->sk_state == TCP_CLOSE) {
+                       __mptcp_destroy_sock(sk);
+                       goto unlock;
+               }
        }
 
        if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
        sock_put(sk);
 }
 
+static __poll_t mptcp_check_readable(struct mptcp_sock *msk)
+{
+       /* Concurrent splices from sk_receive_queue into receive_queue will
+        * always show at least one non-empty queue when checked in this order.
+        */
+       if (skb_queue_empty_lockless(&((struct sock *)msk)->sk_receive_queue) &&
+           skb_queue_empty_lockless(&msk->receive_queue))
+               return 0;
+
+       return EPOLLIN | EPOLLRDNORM;
+}
+
 bool __mptcp_close(struct sock *sk, long timeout)
 {
        struct mptcp_subflow_context *subflow;
                goto cleanup;
        }
 
-       if (mptcp_close_state(sk))
+       if (mptcp_check_readable(msk)) {
+               /* the msk has read data, do the MPTCP equivalent of TCP reset */
+               inet_sk_state_store(sk, TCP_CLOSE);
+               mptcp_do_fastclose(sk);
+       } else if (mptcp_close_state(sk)) {
                __mptcp_wr_shutdown(sk);
+       }
 
        sk_stream_wait_close(sk, timeout);
 
        return err;
 }
 
-static __poll_t mptcp_check_readable(struct mptcp_sock *msk)
-{
-       /* Concurrent splices from sk_receive_queue into receive_queue will
-        * always show at least one non-empty queue when checked in this order.
-        */
-       if (skb_queue_empty_lockless(&((struct sock *)msk)->sk_receive_queue) &&
-           skb_queue_empty_lockless(&msk->receive_queue))
-               return 0;
-
-       return EPOLLIN | EPOLLRDNORM;
-}
-
 static __poll_t mptcp_check_writeable(struct mptcp_sock *msk)
 {
        struct sock *sk = (struct sock *)msk;