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: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
88de6af24f
commit
1193d58f75
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue