[Cluster-devel] cluster/dlm-kernel/src proc.c

teigland at sourceware.org teigland at sourceware.org
Wed May 30 18:04:18 UTC 2007


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 <linux/module.h>
 
 #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;
 }




More information about the Cluster-devel mailing list