Commit 80f455da authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Handle EADDRINUSE and ENOBUFS correctly

If a connect or bind attempt returns EADDRINUSE, that means we want to
retry with a different port. It is not a fatal connection error.
Similarly, ENOBUFS is not fatal, but just indicates a memory allocation
issue. Retry after a short delay.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent bf2bf9b8
...@@ -2005,6 +2005,9 @@ call_bind_status(struct rpc_task *task) ...@@ -2005,6 +2005,9 @@ call_bind_status(struct rpc_task *task)
task->tk_rebind_retry--; task->tk_rebind_retry--;
rpc_delay(task, 3*HZ); rpc_delay(task, 3*HZ);
goto retry_timeout; goto retry_timeout;
case -ENOBUFS:
rpc_delay(task, HZ >> 2);
goto retry_timeout;
case -EAGAIN: case -EAGAIN:
goto retry_timeout; goto retry_timeout;
case -ETIMEDOUT: case -ETIMEDOUT:
...@@ -2028,7 +2031,6 @@ call_bind_status(struct rpc_task *task) ...@@ -2028,7 +2031,6 @@ call_bind_status(struct rpc_task *task)
case -ENETDOWN: case -ENETDOWN:
case -EHOSTUNREACH: case -EHOSTUNREACH:
case -ENETUNREACH: case -ENETUNREACH:
case -ENOBUFS:
case -EPIPE: case -EPIPE:
dprintk("RPC: %5u remote rpcbind unreachable: %d\n", dprintk("RPC: %5u remote rpcbind unreachable: %d\n",
task->tk_pid, task->tk_status); task->tk_pid, task->tk_status);
...@@ -2131,8 +2133,6 @@ call_connect_status(struct rpc_task *task) ...@@ -2131,8 +2133,6 @@ call_connect_status(struct rpc_task *task)
case -ENETDOWN: case -ENETDOWN:
case -ENETUNREACH: case -ENETUNREACH:
case -EHOSTUNREACH: case -EHOSTUNREACH:
case -EADDRINUSE:
case -ENOBUFS:
case -EPIPE: case -EPIPE:
xprt_conditional_disconnect(task->tk_rqstp->rq_xprt, xprt_conditional_disconnect(task->tk_rqstp->rq_xprt,
task->tk_rqstp->rq_connect_cookie); task->tk_rqstp->rq_connect_cookie);
...@@ -2141,10 +2141,14 @@ call_connect_status(struct rpc_task *task) ...@@ -2141,10 +2141,14 @@ call_connect_status(struct rpc_task *task)
/* retry with existing socket, after a delay */ /* retry with existing socket, after a delay */
rpc_delay(task, 3*HZ); rpc_delay(task, 3*HZ);
/* fall through */ /* fall through */
case -EADDRINUSE:
case -ENOTCONN: case -ENOTCONN:
case -EAGAIN: case -EAGAIN:
case -ETIMEDOUT: case -ETIMEDOUT:
goto out_retry; goto out_retry;
case -ENOBUFS:
rpc_delay(task, HZ >> 2);
goto out_retry;
} }
rpc_call_rpcerror(task, status); rpc_call_rpcerror(task, status);
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment