From mboxrd@z Thu Jan 1 00:00:00 1970 From: teigland@sourceware.org Date: 30 May 2007 18:04:18 -0000 Subject: [Cluster-devel] cluster/dlm-kernel/src proc.c Message-ID: <20070530180418.14549.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL4 Changes by: teigland at sourceware.org 2007-05-30 18:04:17 Modified files: dlm-kernel/src : proc.c Log message: From jwhiter at redhat.com in bz 240356: Basically when you cat /proc/cluster/dlm_locks theres a possibility that while traversing the rsb list that an rsb could end up deleted before you print it out. This patch moves the assigning of the di->rsb under the rsbtbl lock for that list and then grabs a reference to that rsb so it does not get removed out from underneath us, then we release the reference to the rsb after we've grabbed the next one. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/proc.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.12.2.1&r2=1.12.2.2 --- cluster/dlm-kernel/src/Attic/proc.c 2006/02/15 18:43:28 1.12.2.1 +++ cluster/dlm-kernel/src/Attic/proc.c 2007/05/30 18:04:17 1.12.2.2 @@ -18,6 +18,7 @@ #include #include "dlm_internal.h" +#include "rsb.h" #include "lockspace.h" #if defined(DLM_DEBUG) @@ -102,6 +103,9 @@ read_lock(&di->ls->ls_rsbtbl[i].lock); if (!list_empty(&di->ls->ls_rsbtbl[i].list)) { di->next = di->ls->ls_rsbtbl[i].list.next; + di->rsb = list_entry(di->next, struct dlm_rsb, + res_hashchain); + hold_rsb(di->rsb); read_unlock(&di->ls->ls_rsbtbl[i].lock); break; } @@ -112,6 +116,7 @@ if (di->entry >= di->ls->ls_rsbtbl_size) return NULL; /* End of hash list */ } else { /* Find the next entry in the list */ + struct dlm_rsb *old = di->rsb; i = di->entry; read_lock(&di->ls->ls_rsbtbl[i].lock); di->next = di->next->next; @@ -120,11 +125,14 @@ di->next = NULL; di->entry++; read_unlock(&di->ls->ls_rsbtbl[i].lock); + release_rsb(old); return next_rsb(di); /* do the top half of this conditional */ } + di->rsb = list_entry(di->next, struct dlm_rsb, res_hashchain); + hold_rsb(di->rsb); read_unlock(&di->ls->ls_rsbtbl[i].lock); + release_rsb(old); } - di->rsb = list_entry(di->next, struct dlm_rsb, res_hashchain); return di; }