diff options
Diffstat (limited to 'xlators/mount/fuse')
| -rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 105 | ||||
| -rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.h | 5 | ||||
| -rwxr-xr-x | xlators/mount/fuse/utils/mount.glusterfs.in | 55 | 
3 files changed, 29 insertions, 136 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 0b9ee176588..ee3b9f680ff 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -17,7 +17,6 @@     <http://www.gnu.org/licenses/>.  */ -#include <sys/wait.h>  #include "fuse-bridge.h"  static int gf_fuse_conn_err_log; @@ -3876,50 +3875,20 @@ unlock:          return 0;  } -int -fuse_get_mount_status (xlator_t *this) -{ -        int             kid_status = -1; -        pid_t           kid_pid = -1; -        fuse_private_t *priv = this->private; -        int             our_status = -1; - -        if (read(priv->status_pipe[0],&kid_status, sizeof(kid_status)) < 0) { -                gf_log (this->name, GF_LOG_ERROR, "could not get mount status"); -                goto out; -        } -        gf_log (this->name, GF_LOG_DEBUG, "mount status is %d", kid_status); - -        if (read(priv->status_pipe[0],&kid_pid, sizeof(kid_pid)) < 0) { -                gf_log (this->name, GF_LOG_ERROR, "could not get mount PID"); -                goto out; -        } -        gf_log (this->name, GF_LOG_DEBUG, "mount PID is %d", kid_pid); - -        (void)waitpid(kid_pid,NULL,0); -        our_status = kid_status; - -out: -        close(priv->status_pipe[0]); -        close(priv->status_pipe[1]); -        return our_status; -}  static void *  fuse_thread_proc (void *data)  { -        char                     *mount_point = NULL; -        xlator_t                 *this = NULL; -        fuse_private_t           *priv = NULL; -        ssize_t                   res = 0; -        struct iobuf             *iobuf = NULL; -        fuse_in_header_t         *finh; -        struct iovec              iov_in[2]; -        void                     *msg = NULL; -        const size_t              msg0_size = sizeof (*finh) + 128; -        fuse_handler_t          **fuse_ops = NULL; -        struct pollfd             pfd[2] = {{0,}}; -        gf_boolean_t              mount_finished = _gf_false; +        char           *mount_point = NULL; +        xlator_t       *this = NULL; +        fuse_private_t *priv = NULL; +        ssize_t         res = 0; +        struct iobuf   *iobuf = NULL; +        fuse_in_header_t *finh; +        struct iovec iov_in[2]; +        void *msg = NULL; +        const size_t msg0_size = sizeof (*finh) + 128; +        fuse_handler_t **fuse_ops = NULL;          this = data;          priv = this->private; @@ -3936,41 +3905,6 @@ fuse_thread_proc (void *data)                  /* THIS has to be reset here */                  THIS = this; -                if (!mount_finished) { -                        memset(pfd,0,sizeof(pfd)); -                        pfd[0].fd = priv->status_pipe[0]; -                        pfd[0].events = POLLIN | POLLHUP | POLLERR; -                        pfd[1].fd = priv->fd; -                        pfd[1].events = POLLIN | POLLHUP | POLLERR; -                        if (poll(pfd,2,-1) < 0) { -                                gf_log (this->name, GF_LOG_ERROR, -                                        "poll error %s", strerror(errno)); -                                break; -                        } -                        if (pfd[0].revents & POLLIN) { -                                if (fuse_get_mount_status(this) != 0) { -                                        break; -                                } -                                mount_finished = _gf_true; -                        } -                        else if (pfd[0].revents) { -                                gf_log (this->name, GF_LOG_ERROR, -                                        "mount pipe closed without status"); -                                break; -                        } -                        if (!pfd[1].revents) { -                                continue; -                        } -                } - -                /* -                 * We don't want to block on readv while we're still waiting -                 * for mount status.  That means we only want to get here if -                 * mount_status is true (meaning that our wait completed -                 * already) or if we already called poll(2) on priv->fd to -                 * make sure it's ready. -                 */ -                  if (priv->init_recvd)                          fuse_graph_sync (this); @@ -4092,11 +4026,8 @@ fuse_thread_proc (void *data)                  GF_FREE (iov_in[0].iov_base);          } -        /* -         * We could be in all sorts of states with respect to iobuf and iov_in -         * by the time we get here, and it's just not worth untangling them if -         * we're about to kill ourselves anyway. -         */ +        iobuf_unref (iobuf); +        GF_FREE (iov_in[0].iov_base);          if (dict_get (this->options, ZR_MOUNTPOINT_OPT))                  mount_point = data_to_str (dict_get (this->options, @@ -4104,10 +4035,11 @@ fuse_thread_proc (void *data)          if (mount_point) {                  gf_log (this->name, GF_LOG_INFO,                          "unmounting %s", mount_point); +                dict_del (this->options, ZR_MOUNTPOINT_OPT);          } -        /* Kill the whole process, not just this thread. */          kill (getpid(), SIGTERM); +          return NULL;  } @@ -4576,15 +4508,8 @@ init (xlator_t *this_xl)          if (!mnt_args)                  goto cleanup_exit; -        if (pipe(priv->status_pipe) < 0) { -                gf_log (this_xl->name, GF_LOG_ERROR, -                        "could not create pipe to separate mount process"); -                goto cleanup_exit; -        } -          priv->fd = gf_fuse_mount (priv->mount_point, fsname, mnt_args, -                                  sync_mtab ? &ctx->mtab_pid : NULL, -                                  priv->status_pipe[1]); +                                  sync_mtab ? &ctx->mtab_pid : NULL);          if (priv->fd == -1)                  goto cleanup_exit; diff --git a/xlators/mount/fuse/src/fuse-bridge.h b/xlators/mount/fuse/src/fuse-bridge.h index 3711ca54da0..cdb2ad1f74c 100644 --- a/xlators/mount/fuse/src/fuse-bridge.h +++ b/xlators/mount/fuse/src/fuse-bridge.h @@ -66,7 +66,7 @@  #define MAX_FUSE_PROC_DELAY 1 -//#define DISABLE_SELINUX 1 +#define DISABLE_SELINUX 1  typedef struct fuse_in_header fuse_in_header_t;  typedef void (fuse_handler_t) (xlator_t *this, fuse_in_header_t *finh, @@ -116,9 +116,6 @@ struct fuse_private {          int                  revchan_in;          int                  revchan_out;          gf_boolean_t         reverse_fuse_thread_started; - -        /* For communicating with separate mount thread. */ -        int                  status_pipe[2];  };  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 37cc2f9f60a..3ca09b03b1d 100755 --- a/xlators/mount/fuse/utils/mount.glusterfs.in +++ b/xlators/mount/fuse/utils/mount.glusterfs.in @@ -34,36 +34,6 @@ _init ()      UPDATEDBCONF=/etc/updatedb.conf  } -# Mount happens asynchronously, so the command status alone will never be -# sufficient.  Instead, we have to wait for multiple events representing -# different possible outcomes. -wait_for () -{ -    local daemon_pid=$1 -    local mount_point=$2 - -    waited=0 -    while true; do -        kill -s 0 $daemon_pid -        if [ $? != 0 ]; then -                echo "Gluster client daemon exited unexpectedly." -                umount $mount_point &> /dev/null -                exit 1 -        fi -        inode=$(stat -c %i $mount_point 2>/dev/null); -        if [ "$inode" = "1" ]; then -            break -        fi -        if [ $waited -ge 10 ]; then -            break -        fi -        sleep 1 -        waited=$((waited+1)) -    done - -    echo "$inode" -} -  start_glusterfs ()  {      if [ -n "$log_level_str" ]; then @@ -151,33 +121,34 @@ start_glusterfs ()          cmd_line=$(echo "$cmd_line --volfile=$volfile_loc");      fi -    cmd_line=$(echo "$cmd_line $mount_point") -    err=0 -    $cmd_line -    daemon_pid=$$ +    cmd_line=$(echo "$cmd_line $mount_point"); +    err=0; +    $cmd_line; + + +    inode=$(stat -c %i $mount_point 2>/dev/null); -    # Wait for the inode to change *or* for the daemon to exit (indicating a -    # problem with the mount). -    inode=$(wait_for $daemon_pid $mount_point)      # this is required if the stat returns error      if [ -z "$inode" ]; then -        inode="0" +        inode="0";      fi      # retry the failover +    # if [ $? != "0" ]; then # <--- TODO: Once glusterfs returns proper error code, change it.      if [ $inode -ne 1 ]; then +        err=1;          if [ -n "$cmd_line1" ]; then              cmd_line1=$(echo "$cmd_line1 $mount_point"); -            $cmd_line1 -            daemon_pid=$$ +            $cmd_line1; +            err=0; -            inode=$(wait_for $daemon_pid $mount_point) +            inode=$(stat -c %i $mount_point 2>/dev/null);              # this is required if the stat returns error              if [ -z "$inode" ]; then                  inode="0";              fi              if [ $inode -ne 1 ]; then -                err=1 +                err=1;              fi          fi      fi  | 
