From 1bd17366839e07bba65c6d28b0caf00257fef372 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Wed, 11 Mar 2009 14:37:57 -0400 Subject: [PATCH] --- yaml --- r: 139528 b: refs/heads/master c: 15f081ca8ddfe150fb639c591b18944a539da0fc h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/sunrpc/clnt.c | 26 ++++++++++++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index eacfab8a8e65..d1ad44dc49e0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a67d18f89f5782806135aad4ee012ff78d45aae7 +refs/heads/master: 15f081ca8ddfe150fb639c591b18944a539da0fc diff --git a/trunk/net/sunrpc/clnt.c b/trunk/net/sunrpc/clnt.c index 836f15c0c4a3..07e9b05321e6 100644 --- a/trunk/net/sunrpc/clnt.c +++ b/trunk/net/sunrpc/clnt.c @@ -1105,14 +1105,24 @@ static void call_transmit_status(struct rpc_task *task) { task->tk_action = call_status; - /* - * Special case: if we've been waiting on the socket's write_space() - * callback, then don't call xprt_end_transmit(). - */ - if (task->tk_status == -EAGAIN) - return; - xprt_end_transmit(task); - rpc_task_force_reencode(task); + switch (task->tk_status) { + case -EAGAIN: + break; + default: + xprt_end_transmit(task); + /* + * Special cases: if we've been waiting on the + * socket's write_space() callback, or if the + * socket just returned a connection error, + * then hold onto the transport lock. + */ + case -ECONNREFUSED: + case -ENOTCONN: + case -EHOSTDOWN: + case -EHOSTUNREACH: + case -ENETUNREACH: + rpc_task_force_reencode(task); + } } /*