[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