Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3601c4a9 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Ensure that we handle ENOBUFS errors correctly.



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: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent f15b5041
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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:
+5 −0
Original line number Diff line number Diff line
@@ -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;
	}