diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 096fd6309077..3b8e31f456c1 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -4739,9 +4739,13 @@ int tcp_abort(struct sock *sk, int err) bh_lock_sock(sk); if (!sock_flag(sk, SOCK_DEAD)) { + WRITE_ONCE(sk->sk_err, err); + /* This barrier is coupled with smp_rmb() in tcp_poll() */ + smp_wmb(); + sk_error_report(sk); if (tcp_need_reset(sk->sk_state)) tcp_send_active_reset(sk, GFP_ATOMIC); - tcp_done_with_error(sk, err); + tcp_done(sk); } bh_unlock_sock(sk);