SUNRPC: Don't retry using the same source port if connection failed
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 27 Sep 2023 16:59:13 +0000 (12:59 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 28 Feb 2024 20:00:14 +0000 (15:00 -0500)
If the TCP connection attempt fails without ever establishing a
connection, then assume the problem may be the server is rejecting us
due to port reuse.

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

index 58f3dc8d0d71c3b252588a9e6470650a04a7749e..1a961314b7377e6b76e1e0eac3c080934497c8ba 100644 (file)
@@ -62,6 +62,7 @@
 #include "sunrpc.h"
 
 static void xs_close(struct rpc_xprt *xprt);
+static void xs_reset_srcport(struct sock_xprt *transport);
 static void xs_set_srcport(struct sock_xprt *transport, struct socket *sock);
 static void xs_tcp_set_socket_timeouts(struct rpc_xprt *xprt,
                struct socket *sock);
@@ -1565,8 +1566,10 @@ static void xs_tcp_state_change(struct sock *sk)
                break;
        case TCP_CLOSE:
                if (test_and_clear_bit(XPRT_SOCK_CONNECTING,
-                                       &transport->sock_state))
+                                      &transport->sock_state)) {
+                       xs_reset_srcport(transport);
                        xprt_clear_connecting(xprt);
+               }
                clear_bit(XPRT_CLOSING, &xprt->state);
                /* Trigger the socket release */
                xs_run_error_worker(transport, XPRT_SOCK_WAKE_DISCONNECT);
@@ -1722,6 +1725,11 @@ static void xs_set_port(struct rpc_xprt *xprt, unsigned short port)
        xs_update_peer_port(xprt);
 }
 
+static void xs_reset_srcport(struct sock_xprt *transport)
+{
+       transport->srcport = 0;
+}
+
 static void xs_set_srcport(struct sock_xprt *transport, struct socket *sock)
 {
        if (transport->srcport == 0 && transport->xprt.reuseport)