SUNRPC: Only save the TCP source port after the connection is complete
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 16 Mar 2022 23:18:25 +0000 (19:18 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 22 Mar 2022 19:52:55 +0000 (15:52 -0400)
Since the RPC client uses a non-blocking connect(), we do not expect to
see it return '0' under normal circumstances.

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

index 8f8a03c..d2bf3b4 100644 (file)
@@ -58,6 +58,7 @@
 #include "sunrpc.h"
 
 static void xs_close(struct rpc_xprt *xprt);
+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);
 
@@ -1025,6 +1026,8 @@ static int xs_tcp_send_request(struct rpc_rqst *req)
        if (test_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state))
                xs_tcp_set_socket_timeouts(xprt, transport->sock);
 
+       xs_set_srcport(transport, transport->sock);
+
        /* Continue transmitting the packet/record. We must be careful
         * to cope with writespace callbacks arriving _after_ we have
         * called sendmsg(). */
@@ -2263,8 +2266,6 @@ static void xs_tcp_setup_socket(struct work_struct *work)
                        sock->sk->sk_state);
        switch (status) {
        case 0:
-               xs_set_srcport(transport, sock);
-               fallthrough;
        case -EINPROGRESS:
                /* SYN_SENT! */
                set_bit(XPRT_SOCK_CONNECT_SENT, &transport->sock_state);