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

Commit 8b219809 authored by Kurt Hackel's avatar Kurt Hackel Committed by Mark Fasheh
Browse files

ocfs2: purge lockres' sooner



Immediately purge a lockress that the local node is not the master of.

Signed-off-by: default avatarKurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: default avatarMark Fasheh <mark.fasheh@oracle.com>
parent 343e26a4
Loading
Loading
Loading
Loading
+35 −2
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@
#include "cluster/masklog.h"

static int dlm_thread(void *data);
static void dlm_purge_lockres_now(struct dlm_ctxt *dlm,
				  struct dlm_lock_resource *lockres);

static void dlm_flush_asts(struct dlm_ctxt *dlm);

@@ -111,10 +113,23 @@ void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm,
			res->last_used = jiffies;
			list_add_tail(&res->purge, &dlm->purge_list);
			dlm->purge_count++;

			/* if this node is not the owner, there is
			 * no way to keep track of who the owner could be.
			 * unhash it to avoid serious problems. */
			if (res->owner != dlm->node_num) {
				mlog(0, "%s:%.*s: doing immediate "
				     "purge of lockres owned by %u\n",
				     dlm->name, res->lockname.len,
				     res->lockname.name, res->owner);

				dlm_purge_lockres_now(dlm, res);
			}
		}
	} else if (!list_empty(&res->purge)) {
		mlog(0, "removing lockres %.*s from purge list\n",
		     res->lockname.len, res->lockname.name);
		mlog(0, "removing lockres %.*s from purge list, "
		     "owner=%u\n", res->lockname.len, res->lockname.name,
		     res->owner);

		list_del_init(&res->purge);
		dlm->purge_count--;
@@ -180,6 +195,24 @@ void dlm_purge_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *lockres)
	__dlm_unhash_lockres(lockres);
}

/* make an unused lockres go away immediately.
 * as soon as the dlm spinlock is dropped, this lockres
 * will not be found. kfree still happens on last put. */
static void dlm_purge_lockres_now(struct dlm_ctxt *dlm,
				  struct dlm_lock_resource *lockres)
{
	assert_spin_locked(&dlm->spinlock);
	assert_spin_locked(&lockres->spinlock);

	BUG_ON(!__dlm_lockres_unused(lockres));

	if (!list_empty(&lockres->purge)) {
		list_del_init(&lockres->purge);
		dlm->purge_count--;
	}
	__dlm_unhash_lockres(lockres);
}

static void dlm_run_purge_list(struct dlm_ctxt *dlm,
			       int purge_now)
{