--- /dev/null
+From: Sunil Mushran <sunil.mushran@oracle.com>
+Date: Thu, 26 Feb 2009 15:00:44 -0800
+Subject: ocfs2/dlm: Improve lockres counts
+Patch-mainline: 2.6.30
+References: bnc#408304
+
+This patch replaces the lockres counts that tracked the number number of
+locally and remotely mastered lockres' with a current and total count. The
+total count is the number of lockres' that have been created since the dlm
+domain was created.
+
+The number of locally and remotely mastered counts can be computed using
+the locking_state output.
+
+Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+---
+ fs/ocfs2/dlm/dlmcommon.h | 5 ++---
+ fs/ocfs2/dlm/dlmdebug.c | 12 ------------
+ fs/ocfs2/dlm/dlmdomain.c | 5 ++---
+ fs/ocfs2/dlm/dlmmaster.c | 27 +++++++--------------------
+ 4 files changed, 11 insertions(+), 38 deletions(-)
+
+diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h
+index 67b3447..e5026ce 100644
+--- a/fs/ocfs2/dlm/dlmcommon.h
++++ b/fs/ocfs2/dlm/dlmcommon.h
+@@ -159,9 +159,8 @@ struct dlm_ctxt
+ /* these give a really vague idea of the system load */
+ atomic_t mle_tot_count[DLM_MLE_NUM_TYPES];
+ atomic_t mle_cur_count[DLM_MLE_NUM_TYPES];
+- atomic_t local_resources;
+- atomic_t remote_resources;
+- atomic_t unknown_resources;
++ atomic_t res_tot_count;
++ atomic_t res_cur_count;
+
+ struct dlm_debug_ctxt *dlm_debug_ctxt;
+ struct dentry *dlm_debugfs_subroot;
+diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c
+index 336a98e..d7decaa 100644
+--- a/fs/ocfs2/dlm/dlmdebug.c
++++ b/fs/ocfs2/dlm/dlmdebug.c
+@@ -763,12 +763,6 @@ static int debug_state_print(struct dlm_ctxt *dlm, struct debug_buffer *db)
+ int out = 0;
+ struct dlm_reco_node_data *node;
+ char *state;
+- int lres, rres, ures, tres;
+-
+- lres = atomic_read(&dlm->local_resources);
+- rres = atomic_read(&dlm->remote_resources);
+- ures = atomic_read(&dlm->unknown_resources);
+- tres = lres + rres + ures;
+
+ spin_lock(&dlm->spinlock);
+
+@@ -811,12 +805,6 @@ static int debug_state_print(struct dlm_ctxt *dlm, struct debug_buffer *db)
+ db->buf + out, db->len - out);
+ out += snprintf(db->buf + out, db->len - out, "\n");
+
+- /* Mastered Resources Total: xxx Locally: xxx Remotely: ... */
+- out += snprintf(db->buf + out, db->len - out,
+- "Mastered Resources Total: %d Locally: %d "
+- "Remotely: %d Unknown: %d\n",
+- tres, lres, rres, ures);
+-
+ /* Lists: Dirty=Empty Purge=InUse PendingASTs=Empty ... */
+ out += snprintf(db->buf + out, db->len - out,
+ "Lists: Dirty=%s Purge=%s PendingASTs=%s "
+diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c
+index 0479bdf..4d9e6b2 100644
+--- a/fs/ocfs2/dlm/dlmdomain.c
++++ b/fs/ocfs2/dlm/dlmdomain.c
+@@ -1604,10 +1604,9 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
+
+ dlm->reco.new_master = O2NM_INVALID_NODE_NUM;
+ dlm->reco.dead_node = O2NM_INVALID_NODE_NUM;
+- atomic_set(&dlm->local_resources, 0);
+- atomic_set(&dlm->remote_resources, 0);
+- atomic_set(&dlm->unknown_resources, 0);
+
++ atomic_set(&dlm->res_tot_count, 0);
++ atomic_set(&dlm->res_cur_count, 0);
+ for (i = 0; i < DLM_MLE_NUM_TYPES; ++i) {
+ atomic_set(&dlm->mle_tot_count[i], 0);
+ atomic_set(&dlm->mle_cur_count[i], 0);
+diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
+index acfc928..d70cdd5 100644
+--- a/fs/ocfs2/dlm/dlmmaster.c
++++ b/fs/ocfs2/dlm/dlmmaster.c
+@@ -517,15 +517,6 @@ static void dlm_set_lockres_owner(struct dlm_ctxt *dlm,
+ {
+ assert_spin_locked(&res->spinlock);
+
+- mlog_entry("%.*s, %u\n", res->lockname.len, res->lockname.name, owner);
+-
+- if (owner == dlm->node_num)
+- atomic_inc(&dlm->local_resources);
+- else if (owner == DLM_LOCK_RES_OWNER_UNKNOWN)
+- atomic_inc(&dlm->unknown_resources);
+- else
+- atomic_inc(&dlm->remote_resources);
+-
+ res->owner = owner;
+ }
+
+@@ -534,17 +525,8 @@ void dlm_change_lockres_owner(struct dlm_ctxt *dlm,
+ {
+ assert_spin_locked(&res->spinlock);
+
+- if (owner == res->owner)
+- return;
+-
+- if (res->owner == dlm->node_num)
+- atomic_dec(&dlm->local_resources);
+- else if (res->owner == DLM_LOCK_RES_OWNER_UNKNOWN)
+- atomic_dec(&dlm->unknown_resources);
+- else
+- atomic_dec(&dlm->remote_resources);
+-
+- dlm_set_lockres_owner(dlm, res, owner);
++ if (owner != res->owner)
++ dlm_set_lockres_owner(dlm, res, owner);
+ }
+
+
+@@ -573,6 +555,8 @@ static void dlm_lockres_release(struct kref *kref)
+ }
+ spin_unlock(&dlm->track_lock);
+
++ atomic_dec(&dlm->res_cur_count);
++
+ dlm_put(dlm);
+
+ if (!hlist_unhashed(&res->hash_node) ||
+@@ -653,6 +637,9 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm,
+
+ kref_init(&res->refs);
+
++ atomic_inc(&dlm->res_tot_count);
++ atomic_inc(&dlm->res_cur_count);
++
+ /* just for consistency */
+ spin_lock(&res->spinlock);
+ dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN);
+--
+1.5.6
+