Quellcode durchsuchen

ocfs2/dlm: Create and destroy the dlm->master_hash

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>
Sunil Mushran vor 16 Jahren
Ursprung
Commit
e2b66ddcce
2 geänderte Dateien mit 26 neuen und 0 gelöschten Zeilen
  1. 8 0
      fs/ocfs2/dlm/dlmcommon.h
  2. 18 0
      fs/ocfs2/dlm/dlmdomain.c

+ 8 - 0
fs/ocfs2/dlm/dlmcommon.h

@@ -151,6 +151,7 @@ struct dlm_ctxt
 	unsigned long recovery_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
 	unsigned long recovery_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
 	struct dlm_recovery_ctxt reco;
 	struct dlm_recovery_ctxt reco;
 	spinlock_t master_lock;
 	spinlock_t master_lock;
+	struct hlist_head **master_hash;
 	struct list_head master_list;
 	struct list_head master_list;
 	struct list_head mle_hb_events;
 	struct list_head mle_hb_events;
 
 
@@ -195,6 +196,13 @@ static inline struct hlist_head *dlm_lockres_hash(struct dlm_ctxt *dlm, unsigned
 	return dlm->lockres_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + (i % DLM_BUCKETS_PER_PAGE);
 	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
 /* these keventd work queue items are for less-frequently
  * called functions that cannot be directly called from the
  * called functions that cannot be directly called from the
  * net message handlers for some reason, usually because
  * net message handlers for some reason, usually because

+ 18 - 0
fs/ocfs2/dlm/dlmdomain.c

@@ -304,6 +304,9 @@ static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm)
 	if (dlm->lockres_hash)
 	if (dlm->lockres_hash)
 		dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
 		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)
 	if (dlm->name)
 		kfree(dlm->name);
 		kfree(dlm->name);
 
 
@@ -1534,12 +1537,27 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
 	for (i = 0; i < DLM_HASH_BUCKETS; i++)
 	for (i = 0; i < DLM_HASH_BUCKETS; i++)
 		INIT_HLIST_HEAD(dlm_lockres_hash(dlm, 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);
 	strcpy(dlm->name, domain);
 	dlm->key = key;
 	dlm->key = key;
 	dlm->node_num = o2nm_this_node();
 	dlm->node_num = o2nm_this_node();
 
 
 	ret = dlm_create_debugfs_subroot(dlm);
 	ret = dlm_create_debugfs_subroot(dlm);
 	if (ret < 0) {
 	if (ret < 0) {
+		dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES);
 		dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
 		dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES);
 		kfree(dlm->name);
 		kfree(dlm->name);
 		kfree(dlm);
 		kfree(dlm);