Commit 78062cb2 authored by Sunil Mushran's avatar Sunil Mushran Committed by Mark Fasheh

ocfs2_dlm: Fix lockres ref counting bug

During umount, the umount thread migrates the lockres' and the dlm_thread
frees the empty lockres'. Due to a race, the reference counting on the
lockres goes awry leading to extra puts.
Signed-off-by: default avatarSunil Mushran <sunil.mushran@oracle.com>
Signed-off-by: default avatarMark Fasheh <mark.fasheh@oracle.com>
parent e0f2e3a0
...@@ -138,8 +138,10 @@ static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm); ...@@ -138,8 +138,10 @@ static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm);
void __dlm_unhash_lockres(struct dlm_lock_resource *lockres) void __dlm_unhash_lockres(struct dlm_lock_resource *lockres)
{ {
hlist_del_init(&lockres->hash_node); if (!hlist_unhashed(&lockres->hash_node)) {
dlm_lockres_put(lockres); hlist_del_init(&lockres->hash_node);
dlm_lockres_put(lockres);
}
} }
void __dlm_insert_lockres(struct dlm_ctxt *dlm, void __dlm_insert_lockres(struct dlm_ctxt *dlm,
......
...@@ -256,20 +256,14 @@ static void dlm_run_purge_list(struct dlm_ctxt *dlm, ...@@ -256,20 +256,14 @@ static void dlm_run_purge_list(struct dlm_ctxt *dlm,
break; break;
} }
mlog(0, "removing lockres %.*s:%p from purgelist\n", dlm_lockres_get(lockres);
lockres->lockname.len, lockres->lockname.name, lockres);
list_del_init(&lockres->purge);
dlm_lockres_put(lockres);
dlm->purge_count--;
/* This may drop and reacquire the dlm spinlock if it /* This may drop and reacquire the dlm spinlock if it
* has to do migration. */ * has to do migration. */
mlog(0, "calling dlm_purge_lockres!\n");
dlm_lockres_get(lockres);
if (dlm_purge_lockres(dlm, lockres)) if (dlm_purge_lockres(dlm, lockres))
BUG(); BUG();
dlm_lockres_put(lockres); dlm_lockres_put(lockres);
mlog(0, "DONE calling dlm_purge_lockres!\n");
/* Avoid adding any scheduling latencies */ /* Avoid adding any scheduling latencies */
cond_resched_lock(&dlm->spinlock); cond_resched_lock(&dlm->spinlock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment