--- /dev/null
+From: Sunil Mushran <sunil.mushran@oracle.com>
+Date: Thu, 26 Feb 2009 15:00:40 -0800
+Subject: ocfs2/dlm: Create and destroy the dlm->master_hash
+Patch-mainline: 2.6.30
+References: bnc#408304
+
+This patch adds code to create and destroy the dlm->master_hash.
+
+Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+---
+ fs/ocfs2/dlm/dlmcommon.h | 8 ++++++++
+ fs/ocfs2/dlm/dlmdomain.c | 18 ++++++++++++++++++
+ 2 files changed, 26 insertions(+), 0 deletions(-)
+
+Index: linux-2.6.27-sle11_ocfs2_update/fs/ocfs2/dlm/dlmcommon.h
+===================================================================
+--- linux-2.6.27-sle11_ocfs2_update.orig/fs/ocfs2/dlm/dlmcommon.h
++++ linux-2.6.27-sle11_ocfs2_update/fs/ocfs2/dlm/dlmcommon.h
+@@ -151,6 +151,7 @@ struct dlm_ctxt
+ unsigned long recovery_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
+ struct dlm_recovery_ctxt reco;
+ spinlock_t master_lock;
++ struct hlist_head **master_hash;
+ struct list_head master_list;
+ struct list_head mle_hb_events;
+
+@@ -195,6 +196,13 @@ static inline struct hlist_head *dlm_loc
+ return dlm->lockres_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + (i % DLM_BUCKETS_PER_PAGE);
+ }
+
++static inline struct hlist_head *dlm_master_hash(struct dlm_ctxt *dlm,
++ unsigned i)
++{
++ return dlm->master_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] +
++ (i % DLM_BUCKETS_PER_PAGE);
++}
++
+ /* these keventd work queue items are for less-frequently
+ * called functions that cannot be directly called from the
+ * net message handlers for some reason, usually because
+Index: linux-2.6.27-sle11_ocfs2_update/fs/ocfs2/dlm/dlmdomain.c
+===================================================================
+--- linux-2.6.27-sle11_ocfs2_update.orig/fs/ocfs2/dlm/dlmdomain.c
++++ linux-2.6.27-sle11_ocfs2_update/fs/ocfs2/dlm/dlmdomain.c
+@@ -304,6 +304,9 @@ static void dlm_free_ctxt_mem(struct dlm
+ if (dlm->lockres_hash)
+ dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
+
++ if (dlm->master_hash)
++ dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES);
++
+ if (dlm->name)
+ kfree(dlm->name);
+
+@@ -1534,12 +1537,27 @@ static struct dlm_ctxt *dlm_alloc_ctxt(c
+ for (i = 0; i < DLM_HASH_BUCKETS; i++)
+ INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i));
+
++ dlm->master_hash = (struct hlist_head **)
++ dlm_alloc_pagevec(DLM_HASH_PAGES);
++ if (!dlm->master_hash) {
++ mlog_errno(-ENOMEM);
++ dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
++ kfree(dlm->name);
++ kfree(dlm);
++ dlm = NULL;
++ goto leave;
++ }
++
++ for (i = 0; i < DLM_HASH_BUCKETS; i++)
++ INIT_HLIST_HEAD(dlm_master_hash(dlm, i));
++
+ strcpy(dlm->name, domain);
+ dlm->key = key;
+ dlm->node_num = o2nm_this_node();
+
+ ret = dlm_create_debugfs_subroot(dlm);
+ if (ret < 0) {
++ dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES);
+ dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
+ kfree(dlm->name);
+ kfree(dlm);