Commit 916297aa authored by Josef Bacik's avatar Josef Bacik Committed by Steven Whitehouse

[DLM] keep dlm from panicing when traversing rsb list in debugfs

This problem was originally reported against GFS6.1, but the same issue exists
in upstream DLM.  This patch keeps the rsb iterator assigning under the rsbtbl
list lock.  Each time we process an rsb we grab a reference to it to make sure
it is not freed out from underneath us, and then put it when we get the next rsb
in the list or move onto another list.
Signed-off-by: default avatarJosef Bacik <jwhiter@redhat.com>
Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent 2a87ab08
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include "dlm_internal.h" #include "dlm_internal.h"
#include "lock.h"
#define DLM_DEBUG_BUF_LEN 4096 #define DLM_DEBUG_BUF_LEN 4096
static char debug_buf[DLM_DEBUG_BUF_LEN]; static char debug_buf[DLM_DEBUG_BUF_LEN];
...@@ -166,6 +167,9 @@ static int rsb_iter_next(struct rsb_iter *ri) ...@@ -166,6 +167,9 @@ static int rsb_iter_next(struct rsb_iter *ri)
read_lock(&ls->ls_rsbtbl[i].lock); read_lock(&ls->ls_rsbtbl[i].lock);
if (!list_empty(&ls->ls_rsbtbl[i].list)) { if (!list_empty(&ls->ls_rsbtbl[i].list)) {
ri->next = ls->ls_rsbtbl[i].list.next; ri->next = ls->ls_rsbtbl[i].list.next;
ri->rsb = list_entry(ri->next, struct dlm_rsb,
res_hashchain);
dlm_hold_rsb(ri->rsb);
read_unlock(&ls->ls_rsbtbl[i].lock); read_unlock(&ls->ls_rsbtbl[i].lock);
break; break;
} }
...@@ -176,6 +180,7 @@ static int rsb_iter_next(struct rsb_iter *ri) ...@@ -176,6 +180,7 @@ static int rsb_iter_next(struct rsb_iter *ri)
if (ri->entry >= ls->ls_rsbtbl_size) if (ri->entry >= ls->ls_rsbtbl_size)
return 1; return 1;
} else { } else {
struct dlm_rsb *old = ri->rsb;
i = ri->entry; i = ri->entry;
read_lock(&ls->ls_rsbtbl[i].lock); read_lock(&ls->ls_rsbtbl[i].lock);
ri->next = ri->next->next; ri->next = ri->next->next;
...@@ -184,11 +189,13 @@ static int rsb_iter_next(struct rsb_iter *ri) ...@@ -184,11 +189,13 @@ static int rsb_iter_next(struct rsb_iter *ri)
ri->next = NULL; ri->next = NULL;
ri->entry++; ri->entry++;
read_unlock(&ls->ls_rsbtbl[i].lock); read_unlock(&ls->ls_rsbtbl[i].lock);
dlm_put_rsb(old);
goto top; goto top;
} }
ri->rsb = list_entry(ri->next, struct dlm_rsb, res_hashchain);
read_unlock(&ls->ls_rsbtbl[i].lock); read_unlock(&ls->ls_rsbtbl[i].lock);
dlm_put_rsb(old);
} }
ri->rsb = list_entry(ri->next, struct dlm_rsb, res_hashchain);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment