diff mbox

SUNRPC: Ensure call_connect_status() deals correctly with SOFTCONN tasks

Message ID 1395328983-20477-1-git-send-email-steved@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Steve Dickson March 20, 2014, 3:23 p.m. UTC
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 <steved@redhat.com>
---
 net/sunrpc/clnt.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

Comments

Trond Myklebust March 20, 2014, 3:36 p.m. UTC | #1
On Mar 20, 2014, at 11:23, Steve Dickson <steved@redhat.com> 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 <steved@redhat.com>
> ---
> 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...
diff mbox

Patch

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: