diff options
author | Kaushal M <kaushal@gluster.com> | 2011-11-02 11:27:30 +0530 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2011-11-22 19:46:06 -0800 |
commit | 33477a140fb4e891a05dd9261013e83035155350 (patch) | |
tree | ae7ec0427517bdf516facd5450a6c398f86e2900 /xlators/mount | |
parent | e1de01c3fdde2497cc4a24491b75579624467456 (diff) |
fuse: enable kernel read-only mode
Enables kernel read-only mode on mounting with '-oro' and disables the gluster
read-only translator from being loaded. As a result, '-oro' is reported
correctly in the mount options.
Change-Id: If94d97836b13668974cfac61b6e5d52e19880e10
BUG: 3742
Reviewed-on: http://review.gluster.com/655
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Csaba Henk <csaba@gluster.com>
Diffstat (limited to 'xlators/mount')
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 31 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.h | 1 |
2 files changed, 20 insertions, 12 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 62726b38f41..3e271ff6940 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -3560,6 +3560,7 @@ init (xlator_t *this_xl) int fsname_allocated = 0; glusterfs_ctx_t *ctx = NULL; gf_boolean_t sync_mtab = _gf_false; + char *mnt_args = NULL; if (this_xl == NULL) return -1; @@ -3680,6 +3681,12 @@ init (xlator_t *this_xl) if (priv->uid_map_root) priv->acl = 1; + priv->read_only = 0; + ret = dict_get_str (options, "read-only", &value_string); + if (ret == 0) { + ret = gf_string2boolean (value_string, &priv->read_only); + GF_ASSERT (ret == 0); + } priv->fuse_dump_fd = -1; ret = dict_get_str (options, "dump-fuse", &value_string); @@ -3729,19 +3736,14 @@ init (xlator_t *this_xl) if (!fsname) fsname = "glusterfs"; + gf_asprintf (&mnt_args, "%s%sallow_other,max_read=131072", + priv->read_only ? "ro," : "", + priv->acl ? "" : "default_permissions,"); + if (!mnt_args) + goto cleanup_exit; - if (priv->acl) { - priv->fd = gf_fuse_mount (priv->mount_point, fsname, - "allow_other," - "max_read=131072", - sync_mtab ? &ctx->mtab_pid : NULL); - } else { - priv->fd = gf_fuse_mount (priv->mount_point, fsname, - "allow_other,default_permissions," - "max_read=131072", - sync_mtab ? &ctx->mtab_pid : NULL); - } - + priv->fd = gf_fuse_mount (priv->mount_point, fsname, mnt_args, + sync_mtab ? &ctx->mtab_pid : NULL); if (priv->fd == -1) goto cleanup_exit; @@ -3775,6 +3777,8 @@ cleanup_exit: close (priv->fuse_dump_fd); GF_FREE (priv); } + if (mnt_args) + GF_FREE (mnt_args); return -1; } @@ -3844,5 +3848,8 @@ struct volume_options options[] = { { .key = {"sync-mtab"}, .type = GF_OPTION_TYPE_BOOL }, + { .key = {"read-only"}, + .type = GF_OPTION_TYPE_BOOL + }, { .key = {NULL} }, }; diff --git a/xlators/mount/fuse/src/fuse-bridge.h b/xlators/mount/fuse/src/fuse-bridge.h index 2215ad22f54..2b8323a8c18 100644 --- a/xlators/mount/fuse/src/fuse-bridge.h +++ b/xlators/mount/fuse/src/fuse-bridge.h @@ -108,6 +108,7 @@ struct fuse_private { gf_boolean_t client_pid_set; unsigned uid_map_root; gf_boolean_t acl; + gf_boolean_t read_only; }; typedef struct fuse_private fuse_private_t; |