]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
SUNRPC: Force close the socket when a hard error is reported
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 17 Sep 2023 18:57:39 +0000 (14:57 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 22 Oct 2023 23:47:57 +0000 (19:47 -0400)
Fix up xs_wake_error() to close the socket when a hard error is being
reported. Usually, that means an ECONNRESET was received on a connection
attempt.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/xprtsock.c

index a15bf2ede89bf5f09843022b7b24004b433b4832..58f3dc8d0d71c3b252588a9e6470650a04a7749e 100644 (file)
@@ -1181,6 +1181,7 @@ static void xs_sock_reset_state_flags(struct rpc_xprt *xprt)
 {
        struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
 
+       transport->xprt_err = 0;
        clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
        clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state);
        clear_bit(XPRT_SOCK_WAKE_WRITE, &transport->sock_state);
@@ -2772,18 +2773,13 @@ static void xs_wake_error(struct sock_xprt *transport)
 {
        int sockerr;
 
-       if (!test_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state))
-               return;
-       mutex_lock(&transport->recv_mutex);
-       if (transport->sock == NULL)
-               goto out;
        if (!test_and_clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state))
-               goto out;
+               return;
        sockerr = xchg(&transport->xprt_err, 0);
-       if (sockerr < 0)
+       if (sockerr < 0) {
                xprt_wake_pending_tasks(&transport->xprt, sockerr);
-out:
-       mutex_unlock(&transport->recv_mutex);
+               xs_tcp_force_close(&transport->xprt);
+       }
 }
 
 static void xs_wake_pending(struct sock_xprt *transport)