Commit 3ed5e2a2 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Report network/connection errors correctly for SOFTCONN rpc tasks

In the case of a SOFTCONN rpc task, we really want to ensure that it
reports errors like ENETUNREACH back to the caller. Currently, only
some of these errors are being reported back (connect errors are not),
and they are being converted by the RPC layer into EIO.
Reported-by: default avatarJan Engelhardt <jengelh@inai.de>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 1166fde6
...@@ -1644,22 +1644,26 @@ call_connect_status(struct rpc_task *task) ...@@ -1644,22 +1644,26 @@ call_connect_status(struct rpc_task *task)
dprint_status(task); dprint_status(task);
task->tk_status = 0;
if (status >= 0 || status == -EAGAIN) {
clnt->cl_stats->netreconn++;
task->tk_action = call_transmit;
return;
}
trace_rpc_connect_status(task, status); trace_rpc_connect_status(task, status);
switch (status) { switch (status) {
/* if soft mounted, test if we've timed out */ /* if soft mounted, test if we've timed out */
case -ETIMEDOUT: case -ETIMEDOUT:
task->tk_action = call_timeout; task->tk_action = call_timeout;
break; return;
default: case -ECONNREFUSED:
rpc_exit(task, -EIO); case -ECONNRESET:
case -ENETUNREACH:
if (RPC_IS_SOFTCONN(task))
break;
/* retry with existing socket, after a delay */
case 0:
case -EAGAIN:
task->tk_status = 0;
clnt->cl_stats->netreconn++;
task->tk_action = call_transmit;
return;
} }
rpc_exit(task, status);
} }
/* /*
......
...@@ -2202,10 +2202,6 @@ static void xs_tcp_setup_socket(struct work_struct *work) ...@@ -2202,10 +2202,6 @@ static void xs_tcp_setup_socket(struct work_struct *work)
*/ */
xs_tcp_force_close(xprt); xs_tcp_force_close(xprt);
break; break;
case -ECONNREFUSED:
case -ECONNRESET:
case -ENETUNREACH:
/* retry with existing socket, after a delay */
case 0: case 0:
case -EINPROGRESS: case -EINPROGRESS:
case -EALREADY: case -EALREADY:
...@@ -2216,6 +2212,10 @@ static void xs_tcp_setup_socket(struct work_struct *work) ...@@ -2216,6 +2212,10 @@ static void xs_tcp_setup_socket(struct work_struct *work)
/* Happens, for instance, if the user specified a link /* Happens, for instance, if the user specified a link
* local IPv6 address without a scope-id. * local IPv6 address without a scope-id.
*/ */
case -ECONNREFUSED:
case -ECONNRESET:
case -ENETUNREACH:
/* retry with existing socket, after a delay */
goto out; goto out;
} }
out_eagain: out_eagain:
......
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