Skip to contentSkip to conversation

fix dlm_clean_master_list

PATCH New Wengang Wang 2 participants 2 messages Dec 21, 2011 – Dec 22, 2011 OCFS2

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix dlm_clean_master_list

This is a fix on dlm_clean_master_list()

During the hash table browsing, we remove mle from hash table then free the memory on the last reference. So we have to use a _safe() version of the browsing function when doing that.

This fixes Orabug #12798517

---
 fs/ocfs2/dlm/dlmmaster.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
fs/ocfs2/dlm/dlmmaster.c +2 -2
index 11eefb8..86ec9d2 100644
@@ -3182,7 +3182,7 @@ void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node)
 	struct dlm_master_list_entry *mle;
 	struct dlm_lock_resource *res;
 	struct hlist_head *bucket;
-	struct hlist_node *list;
+	struct hlist_node *list, *n;
 	unsigned int i;
 
 	mlog(0, "dlm=%s, dead node=%u\n", dlm->name, dead_node);
@@ -3193,7 +3193,7 @@ top:
 	spin_lock(&dlm->master_lock);
 	for (i = 0; i < DLM_HASH_BUCKETS; i++) {
 		bucket = dlm_master_hash(dlm, i);
-		hlist_for_each(list, bucket) {
+		hlist_for_each_safe(list, n, bucket) {
 			mle = hlist_entry(list, struct dlm_master_list_entry,
 					  master_hash_node);
 
Signature · 1 line
1.7.6.4
#1 lore raw

PATCH 1/1 fix dlm_clean_master_list

Quoted 18 lines · Wengang Wang

This is a fix on dlm_clean_master_list()

During the hash table browsing, we remove mle from hash table then free the memory on the last reference. So we have to use a _safe() version of the browsing function when doing that.

This fixes Orabug #12798517

---
  fs/ocfs2/dlm/dlmmaster.c |    4 ++--
  1 files changed, 2 insertions(+), 2 deletions(-)
fs/ocfs2/dlm/dlmmaster.c +0 -0
index 11eefb8..86ec9d2 100644

fs/ocfs2/dlm/dlmmaster.c void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) · line 3185

Quoted 5 lines
fs/ocfs2/dlm/dlmmaster.c +1 -1
@@ -3182,7 +3182,7 @@ void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node)
  	struct dlm_master_list_entry *mle;
  	struct dlm_lock_resource *res;
  	struct hlist_head *bucket;
-	struct hlist_node *list;
+	struct hlist_node *list, *n;

Single char names are typically used for counters, etc. Call it tmp. Else it looks good.

Quoted 12 lines
fs/ocfs2/dlm/dlmmaster.c +1 -1
  	unsigned int i;
 
  	mlog(0, "dlm=%s, dead node=%u\n", dlm->name, dead_node);
@@ -3193,7 +3193,7 @@ top:
  	spin_lock(&dlm->master_lock);
  	for (i = 0; i<  DLM_HASH_BUCKETS; i++) {
  		bucket = dlm_master_hash(dlm, i);
-		hlist_for_each(list, bucket) {
+		hlist_for_each_safe(list, n, bucket) {
  			mle = hlist_entry(list, struct dlm_master_list_entry,
  					  master_hash_node);