SUNRPC: Ensure that we handle ENOBUFS errors correctly.
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 30 Jun 2014 17:42:19 +0000 (13:42 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 30 Jun 2014 17:42:19 +0000 (13:42 -0400)
Currently, an ENOBUFS error will result in a fatal error for the RPC
call. Normally, we will just want to wait and then retry.

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

index 2e6ab10734f6869af45a422bad6253e9de5cd580..575e63f6c13e8011dc8d250845651aa87fc54ee4 100644 (file)
@@ -1746,6 +1746,7 @@ call_bind_status(struct rpc_task *task)
        case -EHOSTDOWN:
        case -EHOSTUNREACH:
        case -ENETUNREACH:
+       case -ENOBUFS:
        case -EPIPE:
                dprintk("RPC: %5u remote rpcbind unreachable: %d\n",
                                task->tk_pid, task->tk_status);
@@ -1812,6 +1813,7 @@ call_connect_status(struct rpc_task *task)
        case -ECONNABORTED:
        case -ENETUNREACH:
        case -EHOSTUNREACH:
+       case -ENOBUFS:
                if (RPC_IS_SOFTCONN(task))
                        break;
                /* retry with existing socket, after a delay */
@@ -1918,6 +1920,7 @@ call_transmit_status(struct rpc_task *task)
        case -ECONNRESET:
        case -ECONNABORTED:
        case -ENOTCONN:
+       case -ENOBUFS:
        case -EPIPE:
                rpc_task_force_reencode(task);
        }
@@ -2034,6 +2037,7 @@ call_status(struct rpc_task *task)
        case -ECONNRESET:
        case -ECONNABORTED:
                rpc_force_rebind(clnt);
+       case -ENOBUFS:
                rpc_delay(task, 3*HZ);
        case -EPIPE:
        case -ENOTCONN:
index be8bbd5d65ec6914f6178816556ce31ee7ef0883..8f8589fedfdda8a70270ef4fb9960d3bf80fa177 100644 (file)
@@ -594,6 +594,7 @@ static int xs_local_send_request(struct rpc_task *task)
        }
 
        switch (status) {
+       case -ENOBUFS:
        case -EAGAIN:
                status = xs_nospace(task);
                break;
@@ -661,6 +662,7 @@ static int xs_udp_send_request(struct rpc_task *task)
                dprintk("RPC:       sendmsg returned unrecognized error %d\n",
                        -status);
        case -ENETUNREACH:
+       case -ENOBUFS:
        case -EPIPE:
        case -ECONNREFUSED:
                /* When the server has died, an ICMP port unreachable message
@@ -758,6 +760,7 @@ static int xs_tcp_send_request(struct rpc_task *task)
                status = -ENOTCONN;
                /* Should we call xs_close() here? */
                break;
+       case -ENOBUFS:
        case -EAGAIN:
                status = xs_nospace(task);
                break;
@@ -1946,6 +1949,7 @@ static int xs_local_setup_socket(struct sock_xprt *transport)
                dprintk("RPC:       xprt %p connected to %s\n",
                                xprt, xprt->address_strings[RPC_DISPLAY_ADDR]);
                xprt_set_connected(xprt);
+       case -ENOBUFS:
                break;
        case -ENOENT:
                dprintk("RPC:       xprt %p: socket %s does not exist\n",
@@ -2281,6 +2285,7 @@ static void xs_tcp_setup_socket(struct work_struct *work)
        case -ECONNREFUSED:
        case -ECONNRESET:
        case -ENETUNREACH:
+       case -ENOBUFS:
                /* retry with existing socket, after a delay */
                goto out;
        }