diff options
-rw-r--r-- | contrib/fuse-include/fuse-mount.h | 3 | ||||
-rw-r--r-- | contrib/fuse-lib/mount.c | 32 | ||||
-rwxr-xr-x | tests/basic/mount.t | 18 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 8 |
4 files changed, 47 insertions, 14 deletions
diff --git a/contrib/fuse-include/fuse-mount.h b/contrib/fuse-include/fuse-mount.h index 7a3756d92b8..9358ac810e1 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_mount (const char *mountpoint, char *fsname, char *mnt_param, +int gf_fuse_mount (const char *mountpoint, char *fsname, + unsigned long mountflags, 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 f02a835b3a8..fedde3fceea 100644 --- a/contrib/fuse-lib/mount.c +++ b/contrib/fuse-lib/mount.c @@ -100,7 +100,8 @@ escape (char *s) } static int -fuse_mount_fusermount (const char *mountpoint, char *fsname, char *mnt_param, +fuse_mount_fusermount (const char *mountpoint, char *fsname, + unsigned long mountflags, char *mnt_param, int fd) { int pid = -1; @@ -124,7 +125,8 @@ fuse_mount_fusermount (const char *mountpoint, char *fsname, char *mnt_param, return -1; } ret = asprintf (&fm_mnt_params, - "%s,fsname=%s,nonempty,subtype=glusterfs", + "%s%s,fsname=%s,nonempty,subtype=glusterfs", + (mountflags & MS_RDONLY) ? "ro," : "", mnt_param, efsname); FREE (efsname); if (ret == -1) { @@ -169,7 +171,8 @@ fuse_mount_fusermount (const char *mountpoint, char *fsname, char *mnt_param, } static int -fuse_mount_sys (const char *mountpoint, char *fsname, char *mnt_param, int fd) +fuse_mount_sys (const char *mountpoint, char *fsname, + unsigned long mountflags, char *mnt_param, int fd) { int ret = -1; unsigned mounted = 0; @@ -185,7 +188,7 @@ fuse_mount_sys (const char *mountpoint, char *fsname, char *mnt_param, int fd) goto out; } - ret = mount (source, mountpoint, fstype, 0, + ret = mount (source, mountpoint, fstype, mountflags, mnt_param_mnt); if (ret == -1 && errno == ENODEV) { /* fs subtype support was added by 79c0b2df aka @@ -209,6 +212,7 @@ fuse_mount_sys (const char *mountpoint, char *fsname, char *mnt_param, int fd) #ifndef __NetBSD__ if (geteuid () == 0) { char *newmnt = fuse_mnt_resolve_path ("fuse", mountpoint); + char *mnt_param_mtab = NULL; if (!newmnt) { ret = -1; @@ -216,8 +220,17 @@ fuse_mount_sys (const char *mountpoint, char *fsname, char *mnt_param, int fd) goto out; } - ret = fuse_mnt_add_mount ("fuse", source, newmnt, fstype, - mnt_param); + ret = asprintf (&mnt_param_mtab, "%s%s", + mountflags & MS_RDONLY ? "ro," : "", + mnt_param); + if (ret == -1) + GFFUSE_LOGERR ("Out of memory"); + else { + ret = fuse_mnt_add_mount ("fuse", source, newmnt, + fstype, mnt_param_mtab); + FREE (mnt_param_mtab); + } + FREE (newmnt); if (ret == -1) { GFFUSE_LOGERR ("failed to add mtab entry"); @@ -240,7 +253,8 @@ out: } int -gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param, +gf_fuse_mount (const char *mountpoint, char *fsname, + unsigned long mountflags, char *mnt_param, pid_t *mnt_pid, int status_fd) { int fd = -1; @@ -268,14 +282,14 @@ gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param, exit (pid == -1 ? 1 : 0); } - ret = fuse_mount_sys (mountpoint, fsname, mnt_param, fd); + ret = fuse_mount_sys (mountpoint, fsname, mountflags, mnt_param, fd); if (ret == -1) { gf_log ("glusterfs-fuse", GF_LOG_INFO, "direct mount failed (%s), " "retry to mount via fusermount", strerror (errno)); - ret = fuse_mount_fusermount (mountpoint, fsname, + ret = fuse_mount_fusermount (mountpoint, fsname, mountflags, mnt_param, fd); } diff --git a/tests/basic/mount.t b/tests/basic/mount.t index 0fdef65de55..7b2769643a8 100755 --- a/tests/basic/mount.t +++ b/tests/basic/mount.t @@ -34,9 +34,20 @@ EXPECT 'Started' volinfo_field $V0 'Status'; ## Make volume tightly consistent for metdata TEST $CLI volume set $V0 performance.stat-prefetch off; -## Mount FUSE with caching disabled +## Mount FUSE with caching disabled (read-write) TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0; +## Check consistent "rw" option +TEST 'mount -t fuse.glusterfs | grep -E "^$H0:$V0 .+ \(rw,"'; +TEST 'grep -E "^$H0:$V0 .+ ,?rw," /proc/mounts'; + +## Mount FUSE with caching disabled (read-only) +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --read-only -s $H0 --volfile-id $V0 $M1; + +## Check consistent "ro" option +TEST 'mount -t fuse.glusterfs | grep -E "^$H0:$V0 .+ \(ro,"'; +TEST 'grep -E "^$H0:$V0 .+ ,?ro,.+" /proc/mounts'; + ## Wait for volume to register with rpc.mountd sleep 5; @@ -45,11 +56,16 @@ TEST mount -t nfs -o vers=3,nolock,soft,intr $H0:/$V0 $N0; ## Test for consistent views between NFS and FUSE mounts +## write access to $M1 should fail TEST ! stat $M0/newfile; +TEST ! touch $M1/newfile; TEST touch $M0/newfile; +TEST stat $M1/newfile; TEST stat $N0/newfile; +TEST ! rm $M1/newfile; TEST rm $N0/newfile; TEST ! stat $M0/newfile; +TEST ! stat $M1/newfile; ## Finish up diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 9be7d91cc45..544dec0c3b5 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -4678,6 +4678,7 @@ init (xlator_t *this_xl) int fsname_allocated = 0; glusterfs_ctx_t *ctx = NULL; gf_boolean_t sync_to_mount = _gf_false; + unsigned long mntflags = 0; char *mnt_args = NULL; eh_t *event = NULL; @@ -4889,8 +4890,9 @@ init (xlator_t *this_xl) goto cleanup_exit; } - gf_asprintf (&mnt_args, "%s%s%s%sallow_other,max_read=131072", - priv->read_only ? "ro," : "", + if (priv->read_only) + mntflags |= MS_RDONLY; + gf_asprintf (&mnt_args, "%s%s%sallow_other,max_read=131072", priv->acl ? "" : "default_permissions,", priv->fuse_mountopts ? priv->fuse_mountopts : "", priv->fuse_mountopts ? "," : ""); @@ -4903,7 +4905,7 @@ init (xlator_t *this_xl) goto cleanup_exit; } - priv->fd = gf_fuse_mount (priv->mount_point, fsname, mnt_args, + priv->fd = gf_fuse_mount (priv->mount_point, fsname, mntflags, mnt_args, sync_to_mount ? &ctx->mnt_pid : NULL, priv->status_pipe[1]); if (priv->fd == -1) |