MPTCP_SKB_CB(skb)->offset = offset;
 }
 
+/* both sockets must be locked */
+static bool mptcp_subflow_dsn_valid(const struct mptcp_sock *msk,
+                                   struct sock *ssk)
+{
+       struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
+       u64 dsn = mptcp_subflow_get_mapped_dsn(subflow);
+
+       /* revalidate data sequence number.
+        *
+        * mptcp_subflow_data_available() is usually called
+        * without msk lock.  Its unlikely (but possible)
+        * that msk->ack_seq has been advanced since the last
+        * call found in-sequence data.
+        */
+       if (likely(dsn == msk->ack_seq))
+               return true;
+
+       subflow->data_avail = 0;
+       return mptcp_subflow_data_available(ssk);
+}
+
 static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,
                                           struct sock *ssk,
                                           unsigned int *bytes)
        struct tcp_sock *tp;
        bool done = false;
 
+       if (!mptcp_subflow_dsn_valid(msk, ssk)) {
+               *bytes = 0;
+               return false;
+       }
+
        if (!(sk->sk_userlocks & SOCK_RCVBUF_LOCK)) {
                int rcvbuf = max(ssk->sk_rcvbuf, sk->sk_rcvbuf);