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

Commit 1193d58f authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Backchannel handle socket nospace



If the socket was busy due to a socket nospace error, then we should
retry the send.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 88de6af2
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -1951,24 +1951,22 @@ call_bc_transmit(struct rpc_task *task)
{
	struct rpc_rqst *req = task->tk_rqstp;

	if (!xprt_prepare_transmit(task)) {
		/*
		 * Could not reserve the transport. Try again after the
		 * transport is released.
		 */
		task->tk_status = 0;
		task->tk_action = call_bc_transmit;
		return;
	}
	if (!xprt_prepare_transmit(task))
		goto out_retry;

	task->tk_action = rpc_exit_task;
	if (task->tk_status < 0) {
		printk(KERN_NOTICE "RPC: Could not send backchannel reply "
			"error: %d\n", task->tk_status);
		return;
		goto out_done;
	}
	if (req->rq_connect_cookie != req->rq_xprt->connect_cookie)
		req->rq_bytes_sent = 0;

	xprt_transmit(task);

	if (task->tk_status == -EAGAIN)
		goto out_nospace;

	xprt_end_transmit(task);
	dprint_status(task);
	switch (task->tk_status) {
@@ -2002,6 +2000,13 @@ call_bc_transmit(struct rpc_task *task)
		break;
	}
	rpc_wake_up_queued_task(&req->rq_xprt->pending, task);
out_done:
	task->tk_action = rpc_exit_task;
	return;
out_nospace:
	req->rq_connect_cookie = req->rq_xprt->connect_cookie;
out_retry:
	task->tk_status = 0;
}
#endif /* CONFIG_SUNRPC_BACKCHANNEL */