[Cluster-devel] cluster/group/gfs_controld lock_dlm.h main.c r ...

teigland at sourceware.org teigland at sourceware.org
Thu Jul 20 20:19:44 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	teigland at sourceware.org	2006-07-20 20:19:44

Modified files:
	group/gfs_controld: lock_dlm.h main.c recover.c 

Log message:
	if mount.gfs is unmounting/leaving the group because the kernel mount
	failed, then don't wait for the kernel mount to complete before doing
	the leave

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/gfs_controld/lock_dlm.h.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/gfs_controld/main.c.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/gfs_controld/recover.c.diff?cvsroot=cluster&r1=1.3&r2=1.4

--- cluster/group/gfs_controld/lock_dlm.h	2006/07/19 14:44:40	1.6
+++ cluster/group/gfs_controld/lock_dlm.h	2006/07/20 20:19:44	1.7
@@ -133,6 +133,7 @@
 	int			mount_client_notified;
 	int			mount_client_delay;
 	int			delay_send_journals;
+	int			kernel_mount_error;
 	int			got_kernel_mount;
 	int			first_mounter;
 	int			first_mounter_done;
@@ -235,7 +236,7 @@
 
 int do_mount(int ci, char *dir, char *type, char *proto, char *table,
 	     char *options);
-int do_unmount(int ci, char *dir);
+int do_unmount(int ci, char *dir, int mnterr);
 int do_remount(int ci, char *dir, char *mode);
 int do_withdraw(char *name);
 int kernel_recovery_done(char *name);
--- cluster/group/gfs_controld/main.c	2006/07/14 18:56:10	1.5
+++ cluster/group/gfs_controld/main.c	2006/07/20 20:19:44	1.6
@@ -178,7 +178,7 @@
 	if (!strcmp(cmd, "join"))
 		rv = do_mount(ci, dir, type, proto, table, extra);
 	else if (!strcmp(cmd, "leave"))
-		rv = do_unmount(ci, dir);
+		rv = do_unmount(ci, dir, atoi(proto));
 	else if (!strcmp(cmd, "remount"))
 		rv = do_remount(ci, dir, argv[3]);
 	else if (!strcmp(cmd, "dump")) {
--- cluster/group/gfs_controld/recover.c	2006/06/15 20:41:46	1.3
+++ cluster/group/gfs_controld/recover.c	2006/07/20 20:19:44	1.4
@@ -1447,7 +1447,7 @@
 	return 0;
 }
 
-int do_unmount(int ci, char *dir)
+int do_unmount(int ci, char *dir, int mnterr)
 {
 	struct mountgroup *mg;
 
@@ -1466,11 +1466,17 @@
 		return -1;
 	}
 
+	if (mnterr) {
+		log_group(mg, "do_unmount: kernel mount error %d", mnterr);
+		mg->kernel_mount_error = mnterr;
+		goto out;
+	}
+
 	if (mg->withdraw) {
 		log_error("do_unmount: fs on %s is withdrawing", dir);
 		return -1;
 	}
-	
+
 	/* Check to see if we're waiting for a kernel recovery_done to do a
 	   start_done().  If so, call the start_done() here because we won't be
 	   getting anything else from gfs-kernel which is now gone. */
@@ -1479,7 +1485,7 @@
 		log_group(mg, "do_unmount: fill in start_done");
 		start_done(mg);
 	}
-
+ out:
 	group_leave(gh, mg->name);
 	return 0;
 }
@@ -1600,9 +1606,22 @@
 		if (mg->got_kernel_mount)
 			break;
 
-		if (mg->mount_client_notified)
-			wait_for_kernel_mount(mg);
-		else {
+		if (mg->mount_client_notified) {
+
+			/* this kernel_mount_error check isn't perfect, we
+			   could still 1) notify mount.gfs, 2) get a stop cb,
+			   3) kernel mount fails, 4) mount.gfs sends a leave
+			   with mnterr, 5) we don't recv it and don't set
+			   kernel_mount_error because we're stuck in
+			   wait_for_kernel_mount() from do_stop */
+
+			if (!mg->kernel_mount_error)
+				wait_for_kernel_mount(mg);
+			else {
+				log_group(mg, "ignore stop, failed mount");
+				break;
+			}
+		} else {
 			mg->mount_client_delay = 1;
 			break;
 		}




More information about the Cluster-devel mailing list