Skip to content

Commit

Permalink
SUNRPC: Backchannel handle socket nospace
Browse files Browse the repository at this point in the history
If the socket was busy due to a socket nospace error, then we should
retry the send.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
  • Loading branch information
Trond Myklebust committed Jun 2, 2015
1 parent 88de6af commit 1193d58
Showing 1 changed file with 16 additions and 11 deletions.
27 changes: 16 additions & 11 deletions net/sunrpc/clnt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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 */

Expand Down

0 comments on commit 1193d58

Please sign in to comment.