SUNRPC: Tweak TCP socket shutdown in the RPC client
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 24 Aug 2021 15:38:18 +0000 (11:38 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 27 Aug 2021 20:36:21 +0000 (16:36 -0400)
We only really need to call shutdown() if we're in the ESTABLISHED TCP
state, since that is the only case where the client is initiating a
close of an established connection.

If the socket is in FIN_WAIT1 or FIN_WAIT2, then we've already initiated
socket shutdown and are waiting for the server's reply, so do nothing.

In all other cases where we've already received a FIN from the server,
we should be able to just close the socket.

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

index 5fb969f..d80793a 100644 (file)
@@ -2104,12 +2104,15 @@ static void xs_tcp_shutdown(struct rpc_xprt *xprt)
                return;
        }
        switch (skst) {
-       default:
+       case TCP_FIN_WAIT1:
+       case TCP_FIN_WAIT2:
+               break;
+       case TCP_ESTABLISHED:
+       case TCP_CLOSE_WAIT:
                kernel_sock_shutdown(sock, SHUT_RDWR);
                trace_rpc_socket_shutdown(xprt, sock);
                break;
-       case TCP_CLOSE:
-       case TCP_TIME_WAIT:
+       default:
                xs_reset_transport(transport);
        }
 }