Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -138,9 +138,11 @@ static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm);

void __dlm_unhash_lockres(struct dlm_lock_resource *lockres)
{
	if (!hlist_unhashed(&lockres->hash_node)) {
		hlist_del_init(&lockres->hash_node);
		dlm_lockres_put(lockres);
	}
}

void __dlm_insert_lockres(struct dlm_ctxt *dlm,
		       struct dlm_lock_resource *res)
+2 −8
Original line number Diff line number Diff line
@@ -256,20 +256,14 @@ static void dlm_run_purge_list(struct dlm_ctxt *dlm,
			break;
		}

		mlog(0, "removing lockres %.*s:%p from purgelist\n",
		     lockres->lockname.len, lockres->lockname.name, lockres);
		list_del_init(&lockres->purge);
		dlm_lockres_put(lockres);
		dlm->purge_count--;
		dlm_lockres_get(lockres);

		/* This may drop and reacquire the dlm spinlock if it
		 * has to do migration. */
		mlog(0, "calling dlm_purge_lockres!\n");
		dlm_lockres_get(lockres);
		if (dlm_purge_lockres(dlm, lockres))
			BUG();

		dlm_lockres_put(lockres);
		mlog(0, "DONE calling dlm_purge_lockres!\n");

		/* Avoid adding any scheduling latencies */
		cond_resched_lock(&dlm->spinlock);