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: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
parent
e0f2e3a06b
commit
78062cb2e5
|
@ -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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue