diff options
-rw-r--r-- | fs/ocfs2/dlm/dlmcommon.h | 8 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmdomain.c | 18 |
2 files changed, 26 insertions, 0 deletions
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index b232aa0b3345..425653f88e98 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h | |||
@@ -151,6 +151,7 @@ struct dlm_ctxt | |||
151 | unsigned long recovery_map[BITS_TO_LONGS(O2NM_MAX_NODES)]; | 151 | unsigned long recovery_map[BITS_TO_LONGS(O2NM_MAX_NODES)]; |
152 | struct dlm_recovery_ctxt reco; | 152 | struct dlm_recovery_ctxt reco; |
153 | spinlock_t master_lock; | 153 | spinlock_t master_lock; |
154 | struct hlist_head **master_hash; | ||
154 | struct list_head master_list; | 155 | struct list_head master_list; |
155 | struct list_head mle_hb_events; | 156 | struct list_head mle_hb_events; |
156 | 157 | ||
@@ -195,6 +196,13 @@ static inline struct hlist_head *dlm_lockres_hash(struct dlm_ctxt *dlm, unsigned | |||
195 | return dlm->lockres_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + (i % DLM_BUCKETS_PER_PAGE); | 196 | return dlm->lockres_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + (i % DLM_BUCKETS_PER_PAGE); |
196 | } | 197 | } |
197 | 198 | ||
199 | static inline struct hlist_head *dlm_master_hash(struct dlm_ctxt *dlm, | ||
200 | unsigned i) | ||
201 | { | ||
202 | return dlm->master_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + | ||
203 | (i % DLM_BUCKETS_PER_PAGE); | ||
204 | } | ||
205 | |||
198 | /* these keventd work queue items are for less-frequently | 206 | /* these keventd work queue items are for less-frequently |
199 | * called functions that cannot be directly called from the | 207 | * called functions that cannot be directly called from the |
200 | * net message handlers for some reason, usually because | 208 | * net message handlers for some reason, usually because |
diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index d8d578f45613..45315046daf5 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c | |||
@@ -304,6 +304,9 @@ static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm) | |||
304 | if (dlm->lockres_hash) | 304 | if (dlm->lockres_hash) |
305 | dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); | 305 | dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); |
306 | 306 | ||
307 | if (dlm->master_hash) | ||
308 | dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES); | ||
309 | |||
307 | if (dlm->name) | 310 | if (dlm->name) |
308 | kfree(dlm->name); | 311 | kfree(dlm->name); |
309 | 312 | ||
@@ -1534,12 +1537,27 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain, | |||
1534 | for (i = 0; i < DLM_HASH_BUCKETS; i++) | 1537 | for (i = 0; i < DLM_HASH_BUCKETS; i++) |
1535 | INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i)); | 1538 | INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i)); |
1536 | 1539 | ||
1540 | dlm->master_hash = (struct hlist_head **) | ||
1541 | dlm_alloc_pagevec(DLM_HASH_PAGES); | ||
1542 | if (!dlm->master_hash) { | ||
1543 | mlog_errno(-ENOMEM); | ||
1544 | dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); | ||
1545 | kfree(dlm->name); | ||
1546 | kfree(dlm); | ||
1547 | dlm = NULL; | ||
1548 | goto leave; | ||
1549 | } | ||
1550 | |||
1551 | for (i = 0; i < DLM_HASH_BUCKETS; i++) | ||
1552 | INIT_HLIST_HEAD(dlm_master_hash(dlm, i)); | ||
1553 | |||
1537 | strcpy(dlm->name, domain); | 1554 | strcpy(dlm->name, domain); |
1538 | dlm->key = key; | 1555 | dlm->key = key; |
1539 | dlm->node_num = o2nm_this_node(); | 1556 | dlm->node_num = o2nm_this_node(); |
1540 | 1557 | ||
1541 | ret = dlm_create_debugfs_subroot(dlm); | 1558 | ret = dlm_create_debugfs_subroot(dlm); |
1542 | if (ret < 0) { | 1559 | if (ret < 0) { |
1560 | dlm_free_pagevec((void **)dlm->master_hash, DLM_HASH_PAGES); | ||
1543 | dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); | 1561 | dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); |
1544 | kfree(dlm->name); | 1562 | kfree(dlm->name); |
1545 | kfree(dlm); | 1563 | kfree(dlm); |