From 33477a140fb4e891a05dd9261013e83035155350 Mon Sep 17 00:00:00 2001 From: Kaushal M Date: Wed, 2 Nov 2011 11:27:30 +0530 Subject: 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 Reviewed-by: Jeff Darcy Reviewed-by: Csaba Henk --- xlators/mount/fuse/src/fuse-bridge.c | 31 +++++++++++++++++++------------ xlators/mount/fuse/src/fuse-bridge.h | 1 + 2 files changed, 20 insertions(+), 12 deletions(-) (limited to 'xlators/mount') diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 62726b38f..3e271ff69 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 2215ad22f..2b8323a8c 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; -- cgit