From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Thu, 17 May 2007 11:12:35 +0100 Subject: [Cluster-devel] [DLM] keep dlm from panicing when traversing rsb list in debugfs In-Reply-To: <20070516195611.GB22671@korben.rdu.redhat.com> References: <20070516195611.GB22671@korben.rdu.redhat.com> Message-ID: <1179396756.7476.173.camel@quoit> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Applied to the -nmw git tree. Thanks, Steve. On Wed, 2007-05-16 at 15:56 -0400, Josef Bacik wrote: > Hello, > > 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. Thank you, > > Josef > > > Signed-off-by: Josef Bacik > > diff --git a/fs/dlm/debug_fs.c b/fs/dlm/debug_fs.c > index 61ba670..9e27a16 100644 > --- a/fs/dlm/debug_fs.c > +++ b/fs/dlm/debug_fs.c > @@ -17,6 +17,7 @@ > #include > > #include "dlm_internal.h" > +#include "lock.h" > > #define DLM_DEBUG_BUF_LEN 4096 > static char debug_buf[DLM_DEBUG_BUF_LEN]; > @@ -166,6 +167,9 @@ static int rsb_iter_next(struct rsb_iter > read_lock(&ls->ls_rsbtbl[i].lock); > if (!list_empty(&ls->ls_rsbtbl[i].list)) { > 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); > break; > } > @@ -176,6 +180,7 @@ static int rsb_iter_next(struct rsb_iter > if (ri->entry >= ls->ls_rsbtbl_size) > return 1; > } else { > + struct dlm_rsb *old = ri->rsb; > i = ri->entry; > read_lock(&ls->ls_rsbtbl[i].lock); > ri->next = ri->next->next; > @@ -184,11 +189,13 @@ static int rsb_iter_next(struct rsb_iter > ri->next = NULL; > ri->entry++; > read_unlock(&ls->ls_rsbtbl[i].lock); > + dlm_put_rsb(old); > goto top; > } > + ri->rsb = list_entry(ri->next, struct dlm_rsb, res_hashchain); > read_unlock(&ls->ls_rsbtbl[i].lock); > + dlm_put_rsb(old); > } > - ri->rsb = list_entry(ri->next, struct dlm_rsb, res_hashchain); > > return 0; > } >