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}"              ;;  | 
