diff options
| -rwxr-xr-x | tests/features/worm.t | 8 | ||||
| -rw-r--r-- | xlators/features/read-only/src/read-only.h | 1 | ||||
| -rw-r--r-- | xlators/features/read-only/src/worm-helper.c | 2 | ||||
| -rw-r--r-- | xlators/features/read-only/src/worm.c | 10 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-set.c | 8 | 
5 files changed, 28 insertions, 1 deletions
| diff --git a/tests/features/worm.t b/tests/features/worm.t index c725f5858ec..9766dc1ad2b 100755 --- a/tests/features/worm.t +++ b/tests/features/worm.t @@ -64,6 +64,14 @@ TEST `echo "worm 2" >> $M0/file3`  EXPECT 'worm 1' cat $M0/file3  TEST ! rm -f $M0/file3 +## Test for checking if Worm files are undeletable after setting worm-files-deletable as 0. +TEST $CLI volume set $V0 features.worm-files-deletable 0 +TEST `echo "worm 1" > $M0/file4` +TEST chmod 0444 $M0/file4 +sleep 10 +TEST `echo "worm 1" >> $M0/file4` +TEST ! rm -f $M0/file4 +  TEST $CLI volume stop $V0  EXPECT 'Stopped' volinfo_field $V0 'Status' diff --git a/xlators/features/read-only/src/read-only.h b/xlators/features/read-only/src/read-only.h index d0263e74179..aae625f5eaf 100644 --- a/xlators/features/read-only/src/read-only.h +++ b/xlators/features/read-only/src/read-only.h @@ -28,6 +28,7 @@ typedef struct {  typedef struct {          gf_boolean_t          readonly_or_worm_enabled;          gf_boolean_t          worm_file; +        gf_boolean_t          worm_files_deletable;          uint64_t              reten_period;          uint64_t              com_period;          char                  *reten_mode; diff --git a/xlators/features/read-only/src/worm-helper.c b/xlators/features/read-only/src/worm-helper.c index 425e48123b1..0770f9d77c4 100644 --- a/xlators/features/read-only/src/worm-helper.c +++ b/xlators/features/read-only/src/worm-helper.c @@ -379,7 +379,7 @@ gf_worm_state_transition (xlator_t *this, gf_boolean_t fop_with_fd,                                        &reten_state, &stbuf);          }          if (reten_state.worm && !reten_state.retain && -                 op == GF_FOP_UNLINK) { +                priv->worm_files_deletable && op == GF_FOP_UNLINK) {                  op_errno = 0;                  goto out;          } diff --git a/xlators/features/read-only/src/worm.c b/xlators/features/read-only/src/worm.c index a1474b6bc27..cbe7df8e798 100644 --- a/xlators/features/read-only/src/worm.c +++ b/xlators/features/read-only/src/worm.c @@ -542,6 +542,8 @@ init (xlator_t *this)                          uint64, out);          GF_OPTION_INIT ("auto-commit-period", priv->com_period, uint64, out);          GF_OPTION_INIT ("retention-mode", priv->reten_mode, str, out); +        GF_OPTION_INIT ("worm-files-deletable", priv->worm_files_deletable, +                        bool, out);          this->private = priv;          ret = 0; @@ -569,6 +571,8 @@ reconfigure (xlator_t *this, dict_t *options)                            out);          GF_OPTION_RECONF ("auto-commit-period", priv->com_period, options,                            uint64, out); +        GF_OPTION_RECONF ("worm-files-deletable", priv->worm_files_deletable, +                          options, bool, out);          ret = 0;  out:          gf_log (this->name, GF_LOG_DEBUG, "returning %d", ret); @@ -632,6 +636,12 @@ struct volume_options options[] = {            .description = "When \"on\", activates the file level worm. "                           "It is turned \"off\" by default."          }, +        { .key = {"worm-files-deletable"}, +          .type = GF_OPTION_TYPE_BOOL, +          .default_value = "on", +          .description = "When \"off\", doesn't allow the Worm files" +                         "to be deleted. It is turned \"on\" by default." +        },          { .key = {"default-retention-period"},            .type = GF_OPTION_TYPE_TIME,            .default_value = "120", diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index e105783fdb2..fa18ec470cf 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -2738,6 +2738,14 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .op_version  = GD_OP_VERSION_3_8_0,            .flags      = VOLOPT_FLAG_CLIENT_OPT | VOLOPT_FLAG_XLATOR_OPT          }, +        { .key         = "features.worm-files-deletable", +          .voltype     = "features/worm", +          .option      = "worm-files-deletable", +          .value       = "on", +          .validate_fn = validate_boolean, +          .op_version  = GD_OP_VERSION_3_13_0, +          .flags       = VOLOPT_FLAG_CLIENT_OPT | VOLOPT_FLAG_XLATOR_OPT +        },          { .key         = "features.default-retention-period",            .voltype     = "features/worm",            .option      = "default-retention-period", | 
