diff options
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." + }, }; |