{
        struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
        bool fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN;
-       u32 incr;
+       struct tcp_sock *tp = tcp_sk(ssk);
+       u32 offset, incr, avail_len;
 
-       incr = limit >= skb->len ? skb->len + fin : limit;
+       offset = tp->copied_seq - TCP_SKB_CB(skb)->seq;
+       if (WARN_ON_ONCE(offset > skb->len))
+               goto out;
+
+       avail_len = skb->len - offset;
+       incr = limit >= avail_len ? avail_len + fin : limit;
 
-       pr_debug("discarding=%d len=%d seq=%d", incr, skb->len,
-                subflow->map_subflow_seq);
+       pr_debug("discarding=%d len=%d offset=%d seq=%d", incr, skb->len,
+                offset, subflow->map_subflow_seq);
        MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DUPDATA);
        tcp_sk(ssk)->copied_seq += incr;
+
+out:
        if (!before(tcp_sk(ssk)->copied_seq, TCP_SKB_CB(skb)->end_seq))
                sk_eat_skb(ssk, skb);
        if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len)