SUNRPC: Handle EADDRNOTAVAIL on connection failures
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 1 Aug 2016 17:36:08 +0000 (13:36 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 1 Aug 2016 19:03:02 +0000 (15:03 -0400)
If the connect attempt immediately fails with an EADDRNOTAVAIL error, then
that means our choice of source port number was bad.
This error is expected when we set the SO_REUSEPORT socket option and we
have 2 sockets sharing the same source and destination address and port
combinations.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Fixes: 402e23b4ed9ed ("SUNRPC: Fix stupid typo in xs_sock_set_reuseport")
Cc: stable@vger.kernel.org # v4.0+
net/sunrpc/xprtsock.c

index 111767ab124aa4037dfe8c7040866d7196343292..c6b1d48c4319814a1588fda06ce77563d677450a 100644 (file)
@@ -2295,6 +2295,10 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
                /* SYN_SENT! */
                if (xprt->reestablish_timeout < XS_TCP_INIT_REEST_TO)
                        xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO;
+               break;
+       case -EADDRNOTAVAIL:
+               /* Source port number is unavailable. Try a new one! */
+               transport->srcport = 0;
        }
 out:
        return ret;