SUNRPC: Handle EADDRINUSE on connect
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 9 Feb 2015 02:44:04 +0000 (21:44 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 9 Feb 2015 02:47:27 +0000 (21:47 -0500)
Now that we're setting SO_REUSEPORT, we still need to handle the
case where a connect() is attempted, but the old socket is still
lingering.
Essentially, all we want to do here is handle the error by waiting
a few seconds and then retrying.

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

index 3f5d4d4..612aa73 100644 (file)
@@ -1826,6 +1826,7 @@ call_connect_status(struct rpc_task *task)
        case -ECONNABORTED:
        case -ENETUNREACH:
        case -EHOSTUNREACH:
+       case -EADDRINUSE:
        case -ENOBUFS:
        case -EPIPE:
                if (RPC_IS_SOFTCONN(task))
@@ -1934,6 +1935,7 @@ call_transmit_status(struct rpc_task *task)
                }
        case -ECONNRESET:
        case -ECONNABORTED:
+       case -EADDRINUSE:
        case -ENOTCONN:
        case -ENOBUFS:
        case -EPIPE:
@@ -2053,6 +2055,7 @@ call_status(struct rpc_task *task)
        case -ECONNRESET:
        case -ECONNABORTED:
                rpc_force_rebind(clnt);
+       case -EADDRINUSE:
        case -ENOBUFS:
                rpc_delay(task, 3*HZ);
        case -EPIPE:
index 484c504..20f25a8 100644 (file)
@@ -721,6 +721,7 @@ static int xs_tcp_send_request(struct rpc_task *task)
                xs_tcp_shutdown(xprt);
        case -ECONNREFUSED:
        case -ENOTCONN:
+       case -EADDRINUSE:
        case -EPIPE:
                clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags);
        }
@@ -2299,6 +2300,7 @@ static void xs_tcp_setup_socket(struct work_struct *work)
        case -ECONNREFUSED:
        case -ECONNRESET:
        case -ENETUNREACH:
+       case -EADDRINUSE:
        case -ENOBUFS:
                /* retry with existing socket, after a delay */
                goto out;