|
@@ -581,6 +581,7 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm,
|
|
|
atomic_set(&res->asts_reserved, 0);
|
|
|
res->migration_pending = 0;
|
|
|
res->inflight_locks = 0;
|
|
|
+ res->inflight_assert_workers = 0;
|
|
|
|
|
|
res->dlm = dlm;
|
|
|
|
|
@@ -683,6 +684,43 @@ void dlm_lockres_drop_inflight_ref(struct dlm_ctxt *dlm,
|
|
|
wake_up(&res->wq);
|
|
|
}
|
|
|
|
|
|
+void __dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm,
|
|
|
+ struct dlm_lock_resource *res)
|
|
|
+{
|
|
|
+ assert_spin_locked(&res->spinlock);
|
|
|
+ res->inflight_assert_workers++;
|
|
|
+ mlog(0, "%s:%.*s: inflight assert worker++: now %u\n",
|
|
|
+ dlm->name, res->lockname.len, res->lockname.name,
|
|
|
+ res->inflight_assert_workers);
|
|
|
+}
|
|
|
+
|
|
|
+static void dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm,
|
|
|
+ struct dlm_lock_resource *res)
|
|
|
+{
|
|
|
+ spin_lock(&res->spinlock);
|
|
|
+ __dlm_lockres_grab_inflight_worker(dlm, res);
|
|
|
+ spin_unlock(&res->spinlock);
|
|
|
+}
|
|
|
+
|
|
|
+static void __dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm,
|
|
|
+ struct dlm_lock_resource *res)
|
|
|
+{
|
|
|
+ assert_spin_locked(&res->spinlock);
|
|
|
+ BUG_ON(res->inflight_assert_workers == 0);
|
|
|
+ res->inflight_assert_workers--;
|
|
|
+ mlog(0, "%s:%.*s: inflight assert worker--: now %u\n",
|
|
|
+ dlm->name, res->lockname.len, res->lockname.name,
|
|
|
+ res->inflight_assert_workers);
|
|
|
+}
|
|
|
+
|
|
|
+static void dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm,
|
|
|
+ struct dlm_lock_resource *res)
|
|
|
+{
|
|
|
+ spin_lock(&res->spinlock);
|
|
|
+ __dlm_lockres_drop_inflight_worker(dlm, res);
|
|
|
+ spin_unlock(&res->spinlock);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* lookup a lock resource by name.
|
|
|
* may already exist in the hashtable.
|
|
@@ -1603,7 +1641,8 @@ send_response:
|
|
|
mlog(ML_ERROR, "failed to dispatch assert master work\n");
|
|
|
response = DLM_MASTER_RESP_ERROR;
|
|
|
dlm_lockres_put(res);
|
|
|
- }
|
|
|
+ } else
|
|
|
+ dlm_lockres_grab_inflight_worker(dlm, res);
|
|
|
} else {
|
|
|
if (res)
|
|
|
dlm_lockres_put(res);
|
|
@@ -2118,6 +2157,8 @@ static void dlm_assert_master_worker(struct dlm_work_item *item, void *data)
|
|
|
dlm_lockres_release_ast(dlm, res);
|
|
|
|
|
|
put:
|
|
|
+ dlm_lockres_drop_inflight_worker(dlm, res);
|
|
|
+
|
|
|
dlm_lockres_put(res);
|
|
|
|
|
|
mlog(0, "finished with dlm_assert_master_worker\n");
|