]> git.hungrycats.org Git - linux/commitdiff
SUNRPC: call_connect_status should recheck bind and connect status on error
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 26 Sep 2013 19:22:45 +0000 (15:22 -0400)
committerJiri Slaby <jslaby@suse.cz>
Mon, 16 Feb 2015 14:07:42 +0000 (15:07 +0100)
commit 561ec1603171cd9b38dcf6cac53e8710f437a48d upstream.

Currently, we go directly to call_transmit which sends us to call_status
on error. If we know that the connect attempt failed, we should rather
just jump straight back to call_bind and call_connect.

Ditto for EAGAIN, except do not delay.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Acked-by: NeilBrown <neilb@suse.de>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
net/sunrpc/clnt.c

index f318a95ec64d45621857a256a0ac3a799b0812b2..27826e1471ff0ce88f5ee041e089dae9b5a21050 100644 (file)
@@ -1699,6 +1699,7 @@ call_connect_status(struct rpc_task *task)
        dprint_status(task);
 
        trace_rpc_connect_status(task, status);
+       task->tk_status = 0;
        switch (status) {
                /* if soft mounted, test if we've timed out */
        case -ETIMEDOUT:
@@ -1707,12 +1708,14 @@ call_connect_status(struct rpc_task *task)
        case -ECONNREFUSED:
        case -ECONNRESET:
        case -ENETUNREACH:
+               /* 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 */
-       case 0:
        case -EAGAIN:
-               task->tk_status = 0;
+               task->tk_action = call_bind;
+               return;
+       case 0:
                clnt->cl_stats->netreconn++;
                task->tk_action = call_transmit;
                return;