spin_lock(&imp->imp_lock);
if (!list_empty(&req->rq_list)) {
list_del_init(&req->rq_list);
- atomic_dec(&req->rq_import->imp_inflight);
+ if (atomic_dec_and_test(&req->rq_import->imp_inflight))
+ wake_up(&req->rq_import->imp_recovery_waitq);
}
spin_unlock(&imp->imp_lock);
ptlrpc_rqphase_move(req, RQ_PHASE_NEW);
*/
if (!list_empty(&req->rq_list)) {
list_del_init(&req->rq_list);
- atomic_dec(&imp->imp_inflight);
+ if (atomic_dec_and_test(&imp->imp_inflight))
+ wake_up(&imp->imp_recovery_waitq);
}
list_del_init(&req->rq_unreplied_list);
spin_unlock(&imp->imp_lock);
atomic_dec(&set->set_remaining);
- wake_up_all(&imp->imp_recovery_waitq);
+ wake_up(&imp->imp_recovery_waitq);
if (set->set_producer) {
/* produce a new request if possible */
{
struct list_head *tmp, *n;
struct ptlrpc_request *req;
- struct l_wait_info lwi;
time64_t timeout;
int rc;
* have been locally cancelled by ptlrpc_abort_inflight.
*/
timeout_jiffies = max_t(long, cfs_time_seconds(timeout), 1);
- lwi = LWI_TIMEOUT_INTERVAL(timeout_jiffies,
- (timeout > 1) ? cfs_time_seconds(1) :
- cfs_time_seconds(1) / 2,
- NULL, NULL);
- rc = l_wait_event(imp->imp_recovery_waitq,
- (atomic_read(&imp->imp_inflight) == 0),
- &lwi);
- if (rc) {
+ rc = wait_event_idle_timeout(
+ imp->imp_recovery_waitq,
+ (atomic_read(&imp->imp_inflight) == 0),
+ timeout_jiffies);
+
+ if (rc == 0) {
const char *cli_tgt = obd2cli_tgt(imp->imp_obd);
- CERROR("%s: rc = %d waiting for callback (%d != 0)\n",
- cli_tgt, rc, atomic_read(&imp->imp_inflight));
+ CERROR("%s: timeout waiting for callback (%d != 0)\n",
+ cli_tgt, atomic_read(&imp->imp_inflight));
spin_lock(&imp->imp_lock);
if (atomic_read(&imp->imp_inflight) == 0) {
/* Let's save one loop as soon as inflight have
* dropped to zero. No new inflights possible at
* this point. */
- rc = 0;
+ rc = 1;
} else {
list_for_each_safe(tmp, n,
&imp->imp_sending_list) {
}
spin_unlock(&imp->imp_lock);
}
- } while (rc != 0);
+ } while (rc == 0);
/*
* Let's additionally check that no new rpcs added to import in
sptlrpc_import_flush_all_ctx(imp);
atomic_dec(&imp->imp_inval_count);
- wake_up_all(&imp->imp_recovery_waitq);
+ wake_up(&imp->imp_recovery_waitq);
}
EXPORT_SYMBOL(ptlrpc_invalidate_import);
spin_unlock(&imp->imp_lock);
}
- wake_up_all(&imp->imp_recovery_waitq);
+ wake_up(&imp->imp_recovery_waitq);
RETURN(rc);
}
}
if (imp->imp_state == LUSTRE_IMP_FULL) {
- wake_up_all(&imp->imp_recovery_waitq);
+ wake_up(&imp->imp_recovery_waitq);
ptlrpc_wake_delayed(imp);
}