[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Cluster-devel] cluster/gfs2/mount mount.gfs2.c util.c util.h



CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	teigland sourceware org	2006-10-13 20:01:19

Modified files:
	gfs2/mount     : mount.gfs2.c util.c util.h 

Log message:
	The corresponding changes to the gfs_controld changes in handling
	mixed mounts and recoveries and failed mounts.  We now tell
	gfs_controld when our mount has completed and the result using the
	same connection that we created when requesting the mount.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mount/mount.gfs2.c.diff?cvsroot=cluster&r1=1.17&r2=1.18
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mount/util.c.diff?cvsroot=cluster&r1=1.13&r2=1.14
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/mount/util.h.diff?cvsroot=cluster&r1=1.9&r2=1.10

--- cluster/gfs2/mount/mount.gfs2.c	2006/08/11 16:59:03	1.17
+++ cluster/gfs2/mount/mount.gfs2.c	2006/10/13 20:01:19	1.18
@@ -130,6 +130,13 @@
 	return rv;
 }
 
+static void mount_result_lockproto(char *proto, struct mount_options *mo,
+			     	    struct gen_sb *sb, int result)
+{
+	if (!strcmp(proto, "lock_dlm"))
+		lock_dlm_mount_result(mo, sb, result);
+}
+
 static void umount_lockproto(char *proto, struct mount_options *mo,
 			     struct gen_sb *sb, int mnterr)
 {
@@ -175,14 +182,16 @@
 	rv = mount(mo.dev, mo.dir, fsname, mo.flags, mo.extra_plus);
 	if (rv) {
 		log_debug("mount(2) failed error %d errno %d", rv, errno);
+		mount_result_lockproto(proto, &mo, &sb, rv);
+
 		if (!(mo.flags & MS_REMOUNT))
 			umount_lockproto(proto, &mo, &sb, errno);
 
 		block_signals(SIG_UNBLOCK);
-
 		die("error %d mounting %s on %s\n", errno, mo.dev, mo.dir);
 	}
 	log_debug("mount(2) ok");
+	mount_result_lockproto(proto, &mo, &sb, 0);
 
 	block_signals(SIG_UNBLOCK);
 
--- cluster/gfs2/mount/util.c	2006/08/14 17:22:53	1.13
+++ cluster/gfs2/mount/util.c	2006/10/13 20:01:19	1.14
@@ -11,7 +11,7 @@
 extern char *prog_name;
 extern char *fsname;
 extern int verbose;
-static int mount_error_fd;
+static int gfs_controld_fd;
 
 #define LOCK_DLM_SOCK_PATH "gfs_controld_sock"	/* FIXME: use a header */
 #define MAXLINE 256			/* size of messages with gfs_controld */
@@ -311,6 +311,7 @@
 	return fd;
 }
 
+#if 0
 /* We create a pipe and pass the receiving end to gfs_controld.  If the
    mount fails, we write an error message to this pipe.  gfs_controld monitors
    this fd outside its main poll loop because it may need to detect a mount
@@ -361,6 +362,7 @@
 
 	log_debug("setup_mount_error_fd %d %d", fds[0], fds[1]);
 }
+#endif
 
 int lock_dlm_join(struct mount_options *mo, struct gen_sb *sb)
 {
@@ -370,10 +372,11 @@
 
 	i = 0;
 	do {
-		sleep(1);
 		fd = gfs_controld_connect();
-		if (fd < 0)
+		if (fd < 0) {
 			warn("waiting for gfs_controld to start");
+			sleep(1);
+		}
 	} while (fd < 0 && ++i < 10);
 
 	/* FIXME: should we start the daemon here? */
@@ -415,7 +418,9 @@
 		goto out;
 	}
 
+#if 0
 	setup_mount_error_fd(fd);
+#endif
 
 	/*
 	 * read response from gfs_controld to our join request:
@@ -491,10 +496,38 @@
 	log_debug("lock_dlm_join: extra_plus: \"%s\"", mo->extra_plus);
 	rv = 0;
  out:
+#if 0
 	close(fd);
+#endif
+	gfs_controld_fd = fd;
 	return rv;
 }
 
+void lock_dlm_mount_result(struct mount_options *mo, struct gen_sb *sb,
+			   int result)
+{
+	int rv;
+	char buf[MAXLINE];
+
+	memset(buf, 0, sizeof(buf));
+	rv = snprintf(buf, MAXLINE, "mount_result %s %s %d", mo->dir, fsname,
+		      result);
+	if (rv >= MAXLINE) {
+		warn("lock_dlm_mount_result: message too long: %d \"%s\"\n",
+		     rv, buf);
+		goto out;
+	}
+
+	log_debug("lock_dlm_mount_result: write \"%s\"", buf);
+
+	rv = write(gfs_controld_fd, buf, sizeof(buf));
+	if (rv < 0) {
+		warn("lock_dlm_mount_result: gfs_controld write error: %d", rv);
+	}
+ out:
+	close(gfs_controld_fd);
+}
+
 int lock_dlm_leave(struct mount_options *mo, struct gen_sb *sb, int mnterr)
 {
 	int i, fd, rv;
@@ -502,13 +535,14 @@
 
 	i = 0;
 	do {
-		sleep(1);
 		fd = gfs_controld_connect();
-		if (!fd)
+		if (fd < 0) {
 			warn("waiting for gfs_controld to start");
+			sleep(1);
+		}
 	} while (!fd && ++i < 10);
 
-	if (!fd) {
+	if (fd < 0) {
 		warn("gfs_controld not running");
 		rv = -1;
 		goto out;
@@ -535,10 +569,12 @@
 	log_debug("message to gfs_controld: asking to leave mountgroup:");
 	log_debug("lock_dlm_leave: write \"%s\"", buf);
 
+#if 0
 	if (mnterr && mount_error_fd) {
 		rv = write(mount_error_fd, buf, sizeof(buf));
 		log_debug("lock_dlm_leave: write to mount_error_fd %d", rv);
 	}
+#endif
 
 	rv = write(fd, buf, sizeof(buf));
 	if (rv < 0) {
--- cluster/gfs2/mount/util.h	2006/07/20 20:19:04	1.9
+++ cluster/gfs2/mount/util.h	2006/10/13 20:01:19	1.10
@@ -87,6 +87,7 @@
 void read_proc_mounts(struct mount_options *mo);
 int get_sb(char *device, struct gen_sb *sb_out);
 int lock_dlm_join(struct mount_options *mo, struct gen_sb *sb);
+void lock_dlm_mount_result(struct mount_options *mo, struct gen_sb *sb, int result);
 int lock_dlm_leave(struct mount_options *mo, struct gen_sb *sb, int mnterr);
 int lock_dlm_remount(struct mount_options *mo, struct gen_sb *sb);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]