summaryrefslogtreecommitdiffstats
path: root/net/sunrpc/clnt.c
diff options
context:
space:
mode:
authorTrond Myklebust2015-02-09 03:44:04 +0100
committerTrond Myklebust2015-02-09 03:47:27 +0100
commit3913c78c3ab61500ddf7c2c9617cc4f8e2c583e0 (patch)
tree9b77984e4d37c5a6aa79d3adcd32866604163e3b /net/sunrpc/clnt.c
parentSUNRPC: Set SO_REUSEPORT socket option for TCP connections (diff)
downloadkernel-qcow2-linux-3913c78c3ab61500ddf7c2c9617cc4f8e2c583e0.tar.gz
kernel-qcow2-linux-3913c78c3ab61500ddf7c2c9617cc4f8e2c583e0.tar.xz
kernel-qcow2-linux-3913c78c3ab61500ddf7c2c9617cc4f8e2c583e0.zip
SUNRPC: Handle EADDRINUSE on connect
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>
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r--net/sunrpc/clnt.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 3f5d4d48f0cb..612aa73bbc60 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -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: