[Cluster-devel] cluster/gfs-kernel/src/dlm lock_dlm.h main.c p ...

rpeterso at sourceware.org rpeterso at sourceware.org
Fri Mar 23 18:05:18 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	STABLE
Changes by:	rpeterso at sourceware.org	2007-03-23 18:05:15

Modified files:
	gfs-kernel/src/dlm: lock_dlm.h main.c plock.c 

Log message:
	Resolves: Bugzilla Bug 233167: [CitiStreet] Kernel Panic when spawn
	listener processes on GFS.  Patch written by Josef Bacik (Whiter).

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/dlm/lock_dlm.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.18.2.3.6.4&r2=1.18.2.3.6.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/dlm/main.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.7&r2=1.7.8.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/dlm/plock.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.12.8.3&r2=1.12.8.4

--- cluster/gfs-kernel/src/dlm/Attic/lock_dlm.h	2007/02/07 15:25:05	1.18.2.3.6.4
+++ cluster/gfs-kernel/src/dlm/Attic/lock_dlm.h	2007/03/23 18:05:14	1.18.2.3.6.5
@@ -46,6 +46,7 @@
 #define LOCK_DLM_STRNAME_BYTES	(24)
 
 #define LOCK_DLM_MAX_NODES	(128)
+#define LOCK_DLM_MAX_PLOCK	(1024)
 
 #define DROP_LOCKS_COUNT	(200000)
 #define DROP_LOCKS_PERIOD	(60)
--- cluster/gfs-kernel/src/dlm/Attic/main.c	2004/11/02 04:50:49	1.7
+++ cluster/gfs-kernel/src/dlm/Attic/main.c	2007/03/23 18:05:14	1.7.8.1
@@ -27,6 +27,7 @@
 int				lock_dlm_max_nodes;
 int				lock_dlm_drop_count;
 int				lock_dlm_drop_period;
+int				lock_dlm_max_plock_get;
 
 static char *                   debug_buf;
 static unsigned int             debug_size;
@@ -153,6 +154,11 @@
 	return sprintf(b, "%d\n", lock_dlm_max_nodes);
 }
 
+static int max_plock_info(char *b, char **start, off_t offset, int length)
+{
+	return sprintf(b, "%d\n", lock_dlm_max_plock_get);
+}
+
 static int drop_count_info(char *b, char **start, off_t offset, int length)
 {
 	return sprintf(b, "%d\n", lock_dlm_drop_count);
@@ -188,6 +194,16 @@
 	return rv;
 }
 
+static int max_plock_write(struct file *file, const char *buffer,
+			   unsigned long count, void *data)
+{
+	int rv = copy_string(buffer, count);
+	if (rv < 0)
+		return rv;
+	lock_dlm_max_plock_get = (int) simple_strtol(proc_str, NULL, 0);
+	return rv;
+}
+
 static int drop_count_write(struct file *file, const char *buffer,
 			    unsigned long count, void *data)
 {
@@ -210,7 +226,8 @@
 
 static void create_proc_entries(void)
 {
-	struct proc_dir_entry *p, *debug, *drop_count, *drop_period, *max_nodes;
+	struct proc_dir_entry *p, *debug, *drop_count, *drop_period,
+		*max_nodes, *plock_get;
 
 	debug = drop_count = drop_period = max_nodes = NULL;
 
@@ -227,6 +244,14 @@
 	p->write_proc = max_nodes_write;
 	max_nodes = p;
 
+	p = create_proc_entry("max_plock_get", 0666, proc_dir);
+	if (!p)
+		goto out;
+	p->owner = THIS_MODULE;
+	p->get_info = max_plock_info;
+	p->write_proc = max_plock_write;
+	plock_get = p;
+
 	p = create_proc_entry("debug", 0444, proc_dir);
 	if (!p)
 		goto out;
@@ -259,6 +284,8 @@
 		remove_proc_entry("drop_count", proc_dir);
 	if (debug)
 		remove_proc_entry("debug", proc_dir);
+	if (plock_get)
+		remove_proc_entry("max_plock_get", proc_dir);
 	if (max_nodes)
 		remove_proc_entry("max_nodes", proc_dir);
 
@@ -270,6 +297,7 @@
 {
 	if (proc_dir) {
 		remove_proc_entry("max_nodes", proc_dir);
+		remove_proc_entry("max_plock_get", proc_dir);
 		remove_proc_entry("debug", proc_dir);
 		remove_proc_entry("drop_period", proc_dir);
 		remove_proc_entry("drop_count", proc_dir);
@@ -298,6 +326,7 @@
 	lock_dlm_max_nodes = LOCK_DLM_MAX_NODES;
 	lock_dlm_drop_count = DROP_LOCKS_COUNT;
 	lock_dlm_drop_period = DROP_LOCKS_PERIOD;
+	lock_dlm_max_plock_get = LOCK_DLM_MAX_PLOCK;
 
 #ifdef CONFIG_PROC_FS
 	create_proc_entries();
--- cluster/gfs-kernel/src/dlm/Attic/plock.c	2006/09/15 17:43:41	1.12.8.3
+++ cluster/gfs-kernel/src/dlm/Attic/plock.c	2007/03/23 18:05:14	1.12.8.4
@@ -30,6 +30,8 @@
 
 #define HEAD      1
 
+extern int lock_dlm_max_plock_get;
+
 static int local_conflict(dlm_t *dlm, struct dlm_resource *r,
 			  struct lm_lockname *name, unsigned long owner,
 			  uint64_t start, uint64_t end, int ex);
@@ -1055,7 +1057,7 @@
 	dlm_lock_t *lp;
 	struct dlm_queryinfo qinfo;
 	struct dlm_lockinfo *lki;
-	int query = 0, s, error;
+	int query = 0, s = 0, error;
 
 	/* acquire a null lock on which to base the query */
 
@@ -1076,14 +1078,13 @@
 	query = DLM_LOCK_THIS | DLM_QUERY_QUEUE_GRANTED |
 		DLM_QUERY_LOCKS_HIGHER;
 
-	for (s = 16; s < dlm->max_nodes + 1; s += 16) {
-
-		lki = kmalloc(s * sizeof(struct dlm_lockinfo), GFP_KERNEL);
+	do {
+		s += 16;
+		lki = kzalloc(s * sizeof(struct dlm_lockinfo), GFP_KERNEL);
 		if (!lki) {
 			error = -ENOMEM;
 			goto out;
 		}
-		memset(lki, 0, s * sizeof(struct dlm_lockinfo));
 		memset(&qinfo, 0, sizeof(qinfo));
 		qinfo.gqi_locksize = s;
 		qinfo.gqi_lockinfo = lki;
@@ -1103,11 +1104,14 @@
 		kfree(lki);
 		if (error != -E2BIG)
 			goto out;
-	}
+	} while (error == -E2BIG && s < lock_dlm_max_plock_get);
 
 	/* check query results for blocking locks */
 
-	error = 0;
+	if (error) {
+		error = -EAGAIN;
+		goto out;
+	}
 
 	for (s = 0; s < qinfo.gqi_lockcount; s++) {
 




More information about the Cluster-devel mailing list