2014-03-20 15:23:08

by Steve Dickson

[permalink] [raw]
Subject: [PATCH] SUNRPC: Ensure call_connect_status() deals correctly with SOFTCONN tasks

Don't schedule an rpc_delay before checking to see if the task
is a SOFTCON because the tk_callback from the delay (__rpc_atrun)
clears the task status before the rpc_exit_task can be run.

Signed-off-by: Steve Dickson <[email protected]>
---
net/sunrpc/clnt.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index cea1308..cb76099 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -1802,10 +1802,10 @@ call_connect_status(struct rpc_task *task)
case -ECONNABORTED:
case -ENETUNREACH:
case -EHOSTUNREACH:
- /* retry with existing socket, after a delay */
- rpc_delay(task, 3*HZ);
if (RPC_IS_SOFTCONN(task))
break;
+ /* retry with existing socket, after a delay */
+ rpc_delay(task, 3*HZ);
case -EAGAIN:
/* Check for timeouts before looping back to call_bind */
case -ETIMEDOUT:
--
1.7.1



2014-03-20 15:37:59

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH] SUNRPC: Ensure call_connect_status() deals correctly with SOFTCONN tasks


On Mar 20, 2014, at 11:23, Steve Dickson <[email protected]> wrote:

> Don't schedule an rpc_delay before checking to see if the task
> is a SOFTCON because the tk_callback from the delay (__rpc_atrun)
> clears the task status before the rpc_exit_task can be run.
>
> Signed-off-by: Steve Dickson <[email protected]>
> ---
> net/sunrpc/clnt.c | 4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
> index cea1308..cb76099 100644
> --- a/net/sunrpc/clnt.c
> +++ b/net/sunrpc/clnt.c
> @@ -1802,10 +1802,10 @@ call_connect_status(struct rpc_task *task)
> case -ECONNABORTED:
> case -ENETUNREACH:
> case -EHOSTUNREACH:
> - /* retry with existing socket, after a delay */
> - rpc_delay(task, 3*HZ);
> if (RPC_IS_SOFTCONN(task))
> break;
> + /* retry with existing socket, after a delay */
> + rpc_delay(task, 3*HZ);
> case -EAGAIN:
> /* Check for timeouts before looping back to call_bind */
> case -ETIMEDOUT:

Doh! Good catch!

Applied...

_________________________________
Trond Myklebust
Linux NFS client maintainer, PrimaryData
[email protected]