diff options
-rw-r--r-- | contrib/fuse-include/fuse-mount.h | 1 | ||||
-rw-r--r-- | contrib/fuse-lib/mount.c | 46 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 34 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.h | 3 | ||||
-rwxr-xr-x | xlators/mount/fuse/utils/mount.glusterfs.in | 2 |
5 files changed, 82 insertions, 4 deletions
diff --git a/contrib/fuse-include/fuse-mount.h b/contrib/fuse-include/fuse-mount.h index 7a3756d92b8..7d28462de47 100644 --- a/contrib/fuse-include/fuse-mount.h +++ b/contrib/fuse-include/fuse-mount.h @@ -8,5 +8,6 @@ */ void gf_fuse_unmount (const char *mountpoint, int fd); +int gf_fuse_unmount_daemon (const char *mountpoint, int fd); int gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param, pid_t *mtab_pid, int status_fd); diff --git a/contrib/fuse-lib/mount.c b/contrib/fuse-lib/mount.c index 5bdf454686b..05d04b769e5 100644 --- a/contrib/fuse-lib/mount.c +++ b/contrib/fuse-lib/mount.c @@ -75,6 +75,52 @@ gf_fuse_unmount (const char *mountpoint, int fd) /* gluster-specific routines */ +/* Unmounting in a daemon that lurks 'till main process exits */ +int +gf_fuse_unmount_daemon (const char *mountpoint, int fd) +{ + int ret = -1; + pid_t pid = -1; + + if (fd == -1) + return -1; + + int ump[2] = {0,}; + + ret = pipe(ump); + if (ret == -1) { + close (fd); + return -1; + } + + pid = fork (); + switch (pid) { + char c = 0; + sigset_t sigset; + case 0: + + close_fds_except (ump, 1); + + setsid(); + chdir("/"); + sigfillset(&sigset); + sigprocmask(SIG_BLOCK, &sigset, NULL); + + read (ump[0], &c, 1); + + gf_fuse_unmount (mountpoint, fd); + exit (0); + case -1: + close (fd); + fd = -1; + ret = -1; + close (ump[1]); + } + close (ump[0]); + + return ret; +} + static char * escape (char *s) { diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index a0a09a4ec57..03f766082e2 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -5150,7 +5150,7 @@ fuse_thread_proc (void *data) ZR_MOUNTPOINT_OPT)); if (mount_point) { gf_log (this->name, GF_LOG_INFO, - "unmounting %s", mount_point); + "initating unmount of %s", mount_point); } /* Kill the whole process, not just this thread. */ @@ -5779,6 +5779,24 @@ init (xlator_t *this_xl) if (!mnt_args) goto cleanup_exit; + { + char *mnt_tok = NULL; + token_iter_t tit = {0,}; + gf_boolean_t iter_end = _gf_false; + + for (mnt_tok = token_iter_init (mnt_args, ',', &tit) ;;) { + iter_end = next_token (&mnt_tok, &tit); + + if (strcmp (mnt_tok, "auto_unmount") == 0) { + priv->auto_unmount = _gf_true; + drop_token (mnt_tok, &tit); + } + + if (iter_end) + break; + } + } + if (pipe(priv->status_pipe) < 0) { gf_log (this_xl->name, GF_LOG_ERROR, "could not create pipe to separate mount process"); @@ -5790,6 +5808,11 @@ init (xlator_t *this_xl) priv->status_pipe[1]); if (priv->fd == -1) goto cleanup_exit; + if (priv->auto_unmount) { + ret = gf_fuse_unmount_daemon (priv->mount_point, priv->fd); + if (ret ==-1) + goto cleanup_exit; + } event = eh_new (FUSE_EVENT_HISTORY_SIZE, _gf_false, NULL); if (!event) { @@ -5867,10 +5890,15 @@ fini (xlator_t *this_xl) mount_point = data_to_str (dict_get (this_xl->options, ZR_MOUNTPOINT_OPT)); if (mount_point != NULL) { + if (!priv->auto_unmount) { + gf_log (this_xl->name, GF_LOG_INFO, + "Unmounting '%s'.", mount_point); + gf_fuse_unmount (mount_point, priv->fd); + } + gf_log (this_xl->name, GF_LOG_INFO, - "Unmounting '%s'.", mount_point); + "Closing fuse connection to '%s'.", mount_point); - gf_fuse_unmount (mount_point, priv->fd); sys_close (priv->fuse_dump_fd); dict_del (this_xl->options, ZR_MOUNTPOINT_OPT); } diff --git a/xlators/mount/fuse/src/fuse-bridge.h b/xlators/mount/fuse/src/fuse-bridge.h index e4075c83f2c..201b7f6930f 100644 --- a/xlators/mount/fuse/src/fuse-bridge.h +++ b/xlators/mount/fuse/src/fuse-bridge.h @@ -134,6 +134,9 @@ struct fuse_private { /* Enable or disable capability support */ gf_boolean_t capability; + + /* whether to run the unmount daemon */ + gf_boolean_t auto_unmount; }; typedef struct fuse_private fuse_private_t; diff --git a/xlators/mount/fuse/utils/mount.glusterfs.in b/xlators/mount/fuse/utils/mount.glusterfs.in index b5c90ba1dff..66dd7cd960f 100755 --- a/xlators/mount/fuse/utils/mount.glusterfs.in +++ b/xlators/mount/fuse/utils/mount.glusterfs.in @@ -562,7 +562,7 @@ without_options() "atime"|"noatime"|"diratime"|"nodiratime"|\ "relatime"|"norelatime"|\ "strictatime"|"nostrictatime"|"lazyatime"|"nolazyatime"|\ - "dev"|"nodev"|"exec"|"noexec"|"suid"|"nosuid") + "dev"|"nodev"|"exec"|"noexec"|"suid"|"nosuid"|"auto_unmount") [ -z "$fuse_mountopts" ] || fuse_mountopts="$fuse_mountopts," fuse_mountopts="${fuse_mountopts}${option}" ;; |