fix dlm_clean_master_list
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
@@ -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
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
Signed-off-by Wengang Wang<[email protected]>--- fs/ocfs2/dlm/dlmmaster.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)fs/ocfs2/dlm/dlmmaster.c +0
-0
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
-1unsigned 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);