summaryrefslogtreecommitdiffstats
path: root/xlators/mount
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/mount')
-rw-r--r--xlators/mount/fuse/src/fuse-bridge.c105
-rw-r--r--xlators/mount/fuse/src/fuse-bridge.h5
-rwxr-xr-xxlators/mount/fuse/utils/mount.glusterfs.in55
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