|
@@ -873,9 +873,18 @@ bool xprt_prepare_transmit(struct rpc_task *task)
|
|
|
dprintk("RPC: %5u xprt_prepare_transmit\n", task->tk_pid);
|
|
|
|
|
|
spin_lock_bh(&xprt->transport_lock);
|
|
|
- if (req->rq_reply_bytes_recvd && !req->rq_bytes_sent) {
|
|
|
- task->tk_status = req->rq_reply_bytes_recvd;
|
|
|
- goto out_unlock;
|
|
|
+ if (!req->rq_bytes_sent) {
|
|
|
+ if (req->rq_reply_bytes_recvd) {
|
|
|
+ task->tk_status = req->rq_reply_bytes_recvd;
|
|
|
+ goto out_unlock;
|
|
|
+ }
|
|
|
+ if ((task->tk_flags & RPC_TASK_NO_RETRANS_TIMEOUT)
|
|
|
+ && xprt_connected(xprt)
|
|
|
+ && req->rq_connect_cookie == xprt->connect_cookie) {
|
|
|
+ xprt->ops->set_retrans_timeout(task);
|
|
|
+ rpc_sleep_on(&xprt->pending, task, xprt_timer);
|
|
|
+ goto out_unlock;
|
|
|
+ }
|
|
|
}
|
|
|
if (!xprt->ops->reserve_xprt(xprt, task)) {
|
|
|
task->tk_status = -EAGAIN;
|