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>
This commit is contained in:
Kaushal M 2011-11-02 11:27:30 +05:30 committed by Vijay Bellur
parent e1de01c3fd
commit 33477a140f
4 changed files with 29 additions and 37 deletions

View File

@ -322,6 +322,15 @@ create_fuse_mount (glusterfs_ctx_t *ctx)
}
}
if (cmd_args->read_only) {
ret = dict_set_static_ptr (master->options, "read-only", "on");
if (ret < 0) {
gf_log ("glusterfsd", GF_LOG_ERROR,
"failed to set dict value for key read-only");
goto err;
}
}
switch (cmd_args->fuse_direct_io_mode) {
case GF_OPTION_DISABLE: /* disable */
ret = dict_set_static_ptr (master->options, ZR_DIRECT_IO_OPT,

View File

@ -175,24 +175,6 @@ err:
return -1;
}
int
glusterfs_graph_readonly (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)
{
int ret = 0;
cmd_args_t *cmd_args = NULL;
cmd_args = &ctx->cmd_args;
if (!cmd_args->read_only)
return 0;
ret = glusterfs_graph_insert (graph, ctx, "features/read-only",
"readonly-autoload");
return ret;
}
int
glusterfs_graph_acl (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)
{
@ -453,13 +435,6 @@ glusterfs_graph_prepare (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)
return -1;
}
/* XXX: RO VOLUME */
ret = glusterfs_graph_readonly (graph, ctx);
if (ret) {
gf_log ("graph", GF_LOG_ERROR, "glusterfs graph readonly failed");
return -1;
}
/* XXX: WORM VOLUME */
ret = glusterfs_graph_worm (graph, ctx);
if (ret) {

View File

@ -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} },
};

View File

@ -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;