unsigned int rq_intr:1, rq_replied:1, rq_err:1,
rq_timedout:1, rq_resend:1, rq_restart:1, rq_replay:1,
rq_no_resend:1, rq_waiting:1, rq_receiving_reply:1,
- rq_no_delay:1;
+ rq_no_delay:1, rq_net_err:1;
int rq_phase;
/* client-side refcount for SENT race */
atomic_t rq_refcount;
DEBUG_REQ(D_NET, req, "REPLIED:");
GOTO(out, rc = 1);
}
+
+ if (req->rq_net_err && !req->rq_timedout) {
+ spin_unlock_irqrestore (&req->rq_lock, flags);
+ rc = ptlrpc_expire_one_request(req);
+ spin_lock_irqsave (&req->rq_lock, flags);
+ GOTO(out, rc);
+ }
if (req->rq_err) {
DEBUG_REQ(D_ERROR, req, "ABORTED:");
rc = ptl_send_rpc(req);
if (rc) {
DEBUG_REQ(D_HA, req, "send failed (%d); expect timeout", rc);
- req->rq_timeout = 1;
+ req->rq_net_err = 1;
RETURN(rc);
}
RETURN(0);
if (req->rq_phase == RQ_PHASE_INTERPRET)
GOTO(interpret, req->rq_status);
+ if (req->rq_net_err && !req->rq_timedout)
+ ptlrpc_expire_one_request(req);
+
if (req->rq_err) {
ptlrpc_unregister_reply(req);
if (req->rq_status == 0)
DEBUG_REQ(D_HA, req, "send failed (%d)",
rc);
force_timer_recalc = 1;
- req->rq_timeout = 0;
+ req->rq_net_err = 1;
}
/* need to reset the timeout */
force_timer_recalc = 1;
spin_lock_irqsave (&req->rq_lock, flags);
req->rq_resend = 1;
+ req->rq_net_err = 0;
req->rq_timedout = 0;
if (req->rq_bulk) {
__u64 old_xid = req->rq_xid;
* like failing sends in client.c does currently... */
spin_lock_irqsave(&req->rq_lock, flags);
- req->rq_timeout = 0;
+ req->rq_net_err = 1;
spin_unlock_irqrestore(&req->rq_lock, flags);
ptlrpc_wake_client_req(req);