SUNRPC: Handle connection issues correctly on the back channel
authorTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 19 Jun 2015 17:04:13 +0000 (13:04 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 19 Jun 2015 17:04:13 +0000 (13:04 -0400)
If the back channel is disconnected, we can and should just fail the
transmission. The expectation is that the NFSv4.1 server will always
retransmit any outstanding callbacks once the connection is
re-established.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
net/sunrpc/clnt.c

index f41ed882ed3cd0d149131cbcf5bc6bdcd3b159e8..cbc6af923dd1cb0baabc95161989133150269d4f 100644 (file)
@@ -1031,6 +1031,7 @@ struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req)
        struct xdr_buf *xbufp = &req->rq_snd_buf;
        struct rpc_task_setup task_setup_data = {
                .callback_ops = &rpc_default_ops,
+               .flags = RPC_TASK_SOFTCONN,
        };
 
        dprintk("RPC: rpc_run_bc_task req= %p\n", req);
@@ -1964,10 +1965,15 @@ call_bc_transmit(struct rpc_task *task)
        switch (task->tk_status) {
        case 0:
                /* Success */
-               break;
        case -EHOSTDOWN:
        case -EHOSTUNREACH:
        case -ENETUNREACH:
+       case -ECONNRESET:
+       case -ECONNREFUSED:
+       case -EADDRINUSE:
+       case -ENOTCONN:
+       case -EPIPE:
+               break;
        case -ETIMEDOUT:
                /*
                 * Problem reaching the server.  Disconnect and let the