From mboxrd@z Thu Jan 1 00:00:00 1970 From: teigland@sourceware.org Date: 13 Oct 2006 20:01:19 -0000 Subject: [Cluster-devel] cluster/gfs2/mount mount.gfs2.c util.c util.h Message-ID: <20061013200119.31673.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: teigland at 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);