diff options
author | Atin Mukherjee <amukherj@redhat.com> | 2014-08-30 16:15:36 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-03-24 06:53:11 -0700 |
commit | ef158c75d1d6fac76635e95a9a43145433169b44 (patch) | |
tree | 488c342d2890234017ac7a1ca7ca0d1485580117 /xlators/features/read-only/src/worm.c | |
parent | a20101e2e4d5f5595655544cfc798eb1d445638c (diff) |
read-only: read-only/worm translator should be in brick graph by default
Problem:
read-only/worm translator is not loaded by default in brick graph because of which
when read-only option is set through volume set volume still remains writable
untill the bricks are restarted as the translator does not have an inmemory flag
to decide whether the read-only/worm option is turned or not.
Solution:
read-only/worm should be loaded by default in brick graph and the read-only/worm
option can be toggled through volume set command. read-only/worm translator now'
has an in-memory flag to decide whether the volume is read-only or not and based
on that either reject the fop or proceed.
Change-Id: Ic79328698f6a72c50433cff15ecadb1a92acc643
BUG: 1134822
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-on: http://review.gluster.org/8571
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/features/read-only/src/worm.c')
-rw-r--r-- | xlators/features/read-only/src/worm.c | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/xlators/features/read-only/src/worm.c b/xlators/features/read-only/src/worm.c index 16c3eb3daed..f62ffa3f6f3 100644 --- a/xlators/features/read-only/src/worm.c +++ b/xlators/features/read-only/src/worm.c @@ -15,6 +15,21 @@ #include "xlator.h" #include "defaults.h" #include "read-only-common.h" +#include "read-only-mem-types.h" +#include "read-only.h" + +int32_t +mem_acct_init (xlator_t *this) +{ + int ret = -1; + + ret = xlator_mem_acct_init (this, gf_read_only_mt_end + 1); + if (ret) + gf_log (this->name, GF_LOG_ERROR, "Memory accounting " + "initialization failed."); + + return ret; +} static int32_t worm_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, @@ -28,9 +43,10 @@ int32_t worm_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, fd_t *fd, dict_t *xdata) { - if ((((flags & O_ACCMODE) == O_WRONLY) || + if (is_readonly_or_worm_enabled (this) && + ((((flags & O_ACCMODE) == O_WRONLY) || ((flags & O_ACCMODE) == O_RDWR)) && - !(flags & O_APPEND)) { + !(flags & O_APPEND))) { STACK_UNWIND_STRICT (open, frame, -1, EROFS, NULL, NULL); return 0; } @@ -43,6 +59,9 @@ worm_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, int32_t init (xlator_t *this) { + int ret = -1; + read_only_priv_t *priv = NULL; + if (!this->children || this->children->next) { gf_log (this->name, GF_LOG_ERROR, "translator not configured with exactly one child"); @@ -54,13 +73,49 @@ init (xlator_t *this) "dangling volume. check volfile "); } - return 0; + priv = GF_CALLOC (1, sizeof (*priv), gf_read_only_mt_priv_t); + if (!priv) + goto out; + + GF_OPTION_INIT ("worm", priv->readonly_or_worm_enabled, bool, out); + + this->private = priv; + ret = 0; +out: + return ret; } +int +reconfigure (xlator_t *this, dict_t *options) +{ + read_only_priv_t *priv = NULL; + int ret = -1; + gf_boolean_t readonly_or_worm_enabled = _gf_false; + + priv = this->private; + GF_ASSERT (priv); + + GF_OPTION_RECONF ("worm", readonly_or_worm_enabled, options, bool, out); + + priv->readonly_or_worm_enabled = readonly_or_worm_enabled; + ret = 0; +out: + gf_log (this->name, GF_LOG_DEBUG, "returning %d", ret); + return ret; +} void fini (xlator_t *this) { + read_only_priv_t *priv = NULL; + + priv = this->private; + if (!priv) + return; + + this->private = NULL; + GF_FREE (priv); + return; } @@ -84,6 +139,11 @@ struct xlator_fops fops = { struct xlator_cbks cbks; struct volume_options options[] = { - { .key = {NULL} }, + { .key = {"worm"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "off", + .description = "When \"on\", makes a volume get write once read many " + " feature. It is turned \"off\" by default." + }, }; |