diff options
Diffstat (limited to 'xlators/mount')
-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 0b9ee1765..ee3b9f680 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 3711ca54d..cdb2ad1f7 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 37cc2f9f6..3ca09b03b 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 |