]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerJiri Slaby <jslaby@suse.cz>
Mon, 16 Feb 2015 14:12:14 +0000 (15:12 +0100)
commit 3601c4a91ebbbf1cf69f66a2abeffc6c64a4fe64 upstream.

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>
Acked-by: NeilBrown <neilb@suse.de>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
net/sunrpc/clnt.c
net/sunrpc/xprtsock.c

index 285040c71f38b8f1f905768a78d95a3d3b590aeb..07a1d5ad2513c157f0d2419cefed5e8d1cba660e 100644 (file)
@@ -1642,6 +1642,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);
@@ -1707,6 +1708,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 */
@@ -1810,6 +1812,7 @@ call_transmit_status(struct rpc_task *task)
        case -ECONNRESET:
        case -ECONNABORTED:
        case -ENOTCONN:
+       case -ENOBUFS:
        case -EPIPE:
                rpc_task_force_reencode(task);
        }
@@ -1922,6 +1925,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 1d034825fcc3cc5f21690b0888316109db49f5a9..8f5c4da51a70ce77d4a1f6cd36efd117484522e7 100644 (file)
@@ -588,6 +588,7 @@ static int xs_local_send_request(struct rpc_task *task)
        }
 
        switch (status) {
+       case -ENOBUFS:
        case -EAGAIN:
                status = xs_nospace(task);
                break;
@@ -655,6 +656,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
@@ -752,6 +754,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;
@@ -1928,6 +1931,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",
@@ -2251,6 +2255,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;
        }