list_add_tail(&req->rq_set_chain, &set->set_requests);
req->rq_set = set;
set->set_remaining++;
-
- atomic_inc(&req->rq_import->imp_inflight);
}
/**
spin_unlock (&req->rq_lock);
DEBUG_REQ(D_HA, req, "req from PID %d waiting for recovery: "
- "(%s != %s)",
- lustre_msg_get_status(req->rq_reqmsg) ,
+ "(%s != %s)", lustre_msg_get_status(req->rq_reqmsg),
ptlrpc_import_state_name(req->rq_send_state),
ptlrpc_import_state_name(imp->imp_state));
- LASSERT(list_empty (&req->rq_list));
-
+ LASSERT(list_empty(&req->rq_list));
list_add_tail(&req->rq_list, &imp->imp_delayed_list);
+ atomic_inc(&req->rq_import->imp_inflight);
spin_unlock(&imp->imp_lock);
RETURN(0);
}
RETURN(rc);
}
- /* XXX this is the same as ptlrpc_queue_wait */
LASSERT(list_empty(&req->rq_list));
list_add_tail(&req->rq_list, &imp->imp_sending_list);
+ atomic_inc(&req->rq_import->imp_inflight);
spin_unlock(&imp->imp_lock);
lustre_msg_set_status(req->rq_reqmsg, cfs_curproc_pid());
lustre_msg_get_opc(req->rq_reqmsg));
spin_lock(&imp->imp_lock);
- if (!list_empty(&req->rq_list))
+ /* Request already may be not on sending or delaying list. This
+ * may happen in the case of marking it errorneous for the case
+ * ptlrpc_import_delay_req(req, status) find it impossible to
+ * allow sending this rpc and returns *status != 0. */
+ if (!list_empty(&req->rq_list)) {
list_del_init(&req->rq_list);
- atomic_dec(&imp->imp_inflight);
+ atomic_dec(&imp->imp_inflight);
+ }
spin_unlock(&imp->imp_lock);
set->set_remaining--;
LASSERT(req->rq_set == NULL);
LASSERT(!req->rq_receiving_reply);
- atomic_inc(&imp->imp_inflight);
/* for distributed debugging */
lustre_msg_set_status(req->rq_reqmsg, cfs_curproc_pid());
restart:
if (ptlrpc_import_delay_req(imp, req, &rc)) {
list_del(&req->rq_list);
-
list_add_tail(&req->rq_list, &imp->imp_delayed_list);
+ atomic_inc(&imp->imp_inflight);
spin_unlock(&imp->imp_lock);
DEBUG_REQ(D_HA, req, "\"%s\" waiting for recovery: (%s != %s)",
spin_lock(&imp->imp_lock);
list_del_init(&req->rq_list);
+ atomic_dec(&imp->imp_inflight);
if (req->rq_err) {
/* rq_status was set locally */
}
if (rc != 0) {
- list_del_init(&req->rq_list);
spin_unlock(&imp->imp_lock);
req->rq_status = rc; // XXX this ok?
GOTO(out, rc);
/* XXX this is the same as ptlrpc_set_wait */
LASSERT(list_empty(&req->rq_list));
list_add_tail(&req->rq_list, &imp->imp_sending_list);
+ atomic_inc(&imp->imp_inflight);
spin_unlock(&imp->imp_lock);
rc = sptlrpc_req_refresh_ctx(req, 0);
libcfs_nid2str(imp->imp_connection->c_peer.nid),
lustre_msg_get_opc(req->rq_reqmsg));
- spin_lock(&imp->imp_lock);
- list_del_init(&req->rq_list);
- spin_unlock(&imp->imp_lock);
-
/* If the reply was received normally, this just grabs the spinlock
* (ensuring the reply callback has returned), sees that
* req->rq_receiving_reply is clear and returns. */
ptlrpc_unregister_reply(req, 0);
+ spin_lock(&imp->imp_lock);
+ list_del_init(&req->rq_list);
+ atomic_dec(&imp->imp_inflight);
+ spin_unlock(&imp->imp_lock);
+
if (req->rq_err) {
DEBUG_REQ(D_RPCTRACE, req, "err rc=%d status=%d",
rc, req->rq_status);
LASSERT(!req->rq_receiving_reply);
ptlrpc_rqphase_move(req, RQ_PHASE_INTERPRET);
-
- atomic_dec(&imp->imp_inflight);
cfs_waitq_signal(&imp->imp_recovery_waitq);
RETURN(rc);
}
struct ptlrpc_request *req;
struct ptlrpc_request_set *set;
struct list_head *iter;
+ struct obd_import *imp;
struct pinger_data *pd = &pinger_args;
int rc;
if (req->rq_phase == RQ_PHASE_COMPLETE)
continue;
- ptlrpc_rqphase_move(req, RQ_PHASE_COMPLETE);
- atomic_dec(&req->rq_import->imp_inflight);
- set->set_remaining--;
- /* If it was disconnected, don't sweat it. */
- if (list_empty(&req->rq_import->imp_pinger_chain)) {
- ptlrpc_unregister_reply(req, 0);
- continue;
- }
+ CDEBUG(D_RPCTRACE, "Pinger initiate expire request(%p)\n",
+ req);
- CDEBUG(D_RPCTRACE, "pinger initiate expire_one_request\n");
+ /* This will also unregister reply. */
ptlrpc_expire_one_request(req, 0);
+
+ /* We're done with this req, let's finally move it to complete
+ * phase and take care of inflights. */
+ ptlrpc_rqphase_move(req, RQ_PHASE_COMPLETE);
+ imp = req->rq_import;
+ spin_lock(&imp->imp_lock);
+ if (!list_empty(&req->rq_list)) {
+ list_del_init(&req->rq_list);
+ atomic_dec(&imp->imp_inflight);
+ }
+ spin_unlock(&imp->imp_lock);
+ set->set_remaining--;
}
mutex_up(&pinger_sem);