*/
                ext->use_map = 1;
                ext->dsn64 = 1;
-               ext->data_seq = mptcp_sk(subflow->conn)->write_seq;
+               ext->data_seq = subflow->data_fin_tx_seq;
                ext->subflow_seq = 0;
                ext->data_len = 1;
        } else {
                if (mpext)
                        opts->ext_copy = *mpext;
 
-               if (skb && tcp_fin &&
-                   subflow->conn->sk_state != TCP_ESTABLISHED)
+               if (skb && tcp_fin && subflow->data_fin_tx_enable)
                        mptcp_write_data_fin(subflow, &opts->ext_copy);
                ret = true;
        }
 
                sock_put(sk);
 }
 
-static void mptcp_subflow_shutdown(struct sock *ssk, int how)
+static void mptcp_subflow_shutdown(struct sock *ssk, int how,
+                                  bool data_fin_tx_enable, u64 data_fin_tx_seq)
 {
        lock_sock(ssk);
 
                tcp_disconnect(ssk, O_NONBLOCK);
                break;
        default:
+               if (data_fin_tx_enable) {
+                       struct mptcp_subflow_context *subflow;
+
+                       subflow = mptcp_subflow_ctx(ssk);
+                       subflow->data_fin_tx_seq = data_fin_tx_seq;
+                       subflow->data_fin_tx_enable = 1;
+               }
+
                ssk->sk_shutdown |= how;
                tcp_shutdown(ssk, how);
                break;
        struct mptcp_subflow_context *subflow, *tmp;
        struct mptcp_sock *msk = mptcp_sk(sk);
        LIST_HEAD(conn_list);
+       u64 data_fin_tx_seq;
 
        lock_sock(sk);
 
 
        list_splice_init(&msk->conn_list, &conn_list);
 
+       data_fin_tx_seq = msk->write_seq;
+
        release_sock(sk);
 
        list_for_each_entry_safe(subflow, tmp, &conn_list, node) {
                struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
 
+               subflow->data_fin_tx_seq = data_fin_tx_seq;
+               subflow->data_fin_tx_enable = 1;
                __mptcp_close_ssk(sk, ssk, subflow, timeout);
        }
 
                        *err = -ENOBUFS;
                        local_bh_enable();
                        release_sock(sk);
-                       mptcp_subflow_shutdown(newsk, SHUT_RDWR + 1);
+                       mptcp_subflow_shutdown(newsk, SHUT_RDWR + 1, 0, 0);
                        tcp_close(newsk, 0);
                        return NULL;
                }
        mptcp_for_each_subflow(msk, subflow) {
                struct sock *tcp_sk = mptcp_subflow_tcp_sock(subflow);
 
-               mptcp_subflow_shutdown(tcp_sk, how);
+               mptcp_subflow_shutdown(tcp_sk, how, 1, msk->write_seq);
        }
 
 out_unlock: