diff options
author | Kotresh HR <khiremat@redhat.com> | 2017-03-06 10:19:54 -0500 |
---|---|---|
committer | Jeff Darcy <jeff@pl.atyp.us> | 2017-07-11 15:01:51 +0000 |
commit | 9ab249130a5dd442044e787f1e171e7a17839906 (patch) | |
tree | e5a5dc92b211701a19ce1a787ab69f5a68814c46 /xlators/features | |
parent | 09f9c6c1c9c565d54c257e58c46004326ec1c495 (diff) |
features/read-only: Allow internal clients to r/w
If the "read-only" volume option is set, it would
make the volume "read-only". But it also makes it
read-only to gluster internal clients such as
gsyncd, self heal, bitd, rebalance etc. In which
case, all the internal operations would fail. This
patch allows internal clients to read and write
when "read-only" option is set.
Change-Id: I8110e8d9eac8def403bb29f235000ddc79eaa433
BUG: 1430608
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: https://review.gluster.org/16855
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Karthik U S <ksubrahm@redhat.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Diffstat (limited to 'xlators/features')
-rw-r--r-- | xlators/features/read-only/src/read-only-common.c | 45 | ||||
-rw-r--r-- | xlators/features/read-only/src/read-only-common.h | 2 | ||||
-rw-r--r-- | xlators/features/read-only/src/worm.c | 12 |
3 files changed, 31 insertions, 28 deletions
diff --git a/xlators/features/read-only/src/read-only-common.c b/xlators/features/read-only/src/read-only-common.c index ad2eaaa5e26..b4e4289356b 100644 --- a/xlators/features/read-only/src/read-only-common.c +++ b/xlators/features/read-only/src/read-only-common.c @@ -12,7 +12,7 @@ #include "defaults.h" gf_boolean_t -is_readonly_or_worm_enabled (xlator_t *this) +is_readonly_or_worm_enabled (call_frame_t *frame, xlator_t *this) { read_only_priv_t *priv = NULL; gf_boolean_t readonly_or_worm_enabled = _gf_false; @@ -22,6 +22,9 @@ is_readonly_or_worm_enabled (xlator_t *this) readonly_or_worm_enabled = priv->readonly_or_worm_enabled; + if (frame->root->pid < GF_CLIENT_PID_MAX) + readonly_or_worm_enabled = _gf_false; + return readonly_or_worm_enabled; } @@ -47,7 +50,7 @@ ro_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, if (ret == 0) allzero = _gf_true; - if (is_readonly_or_worm_enabled (this) && !allzero) + if (is_readonly_or_worm_enabled (frame, this) && !allzero) STACK_UNWIND_STRICT (xattrop, frame, -1, EROFS, NULL, xdata); else STACK_WIND_TAIL (frame, FIRST_CHILD (this), @@ -67,7 +70,7 @@ ro_fxattrop (call_frame_t *frame, xlator_t *this, if (ret == 0) allzero = _gf_true; - if (is_readonly_or_worm_enabled (this) && !allzero) + if (is_readonly_or_worm_enabled (frame, this) && !allzero) STACK_UNWIND_STRICT (fxattrop, frame, -1, EROFS, NULL, xdata); else STACK_WIND_TAIL (frame, FIRST_CHILD (this), @@ -138,7 +141,7 @@ int32_t ro_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf, int32_t valid, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (setattr, frame, -1, EROFS, NULL, NULL, xdata); else @@ -153,7 +156,7 @@ int32_t ro_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf, int32_t valid, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (fsetattr, frame, -1, EROFS, NULL, NULL, xdata); else @@ -168,7 +171,7 @@ ro_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t ro_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (truncate, frame, -1, EROFS, NULL, NULL, xdata); else @@ -182,7 +185,7 @@ ro_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, dict int32_t ro_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (ftruncate, frame, -1, EROFS, NULL, NULL, xdata); else @@ -197,7 +200,7 @@ int ro_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, dev_t rdev, mode_t umask, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (mknod, frame, -1, EROFS, NULL, NULL, NULL, NULL, xdata); else @@ -213,7 +216,7 @@ int ro_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, mode_t umask, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (mkdir, frame, -1, EROFS, NULL, NULL, NULL, NULL, xdata); else @@ -228,7 +231,7 @@ int32_t ro_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (unlink, frame, -1, EROFS, NULL, NULL, xdata); else @@ -244,7 +247,7 @@ int ro_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (rmdir, frame, -1, EROFS, NULL, NULL, xdata); else @@ -260,7 +263,7 @@ int ro_symlink (call_frame_t *frame, xlator_t *this, const char *linkpath, loc_t *loc, mode_t umask, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (symlink, frame, -1, EROFS, NULL, NULL, NULL, NULL, xdata); else @@ -277,7 +280,7 @@ int32_t ro_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (rename, frame, -1, EROFS, NULL, NULL, NULL, NULL, NULL, xdata); else @@ -292,7 +295,7 @@ ro_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, int32_t ro_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (link, frame, -1, EROFS, NULL, NULL, NULL, NULL, xdata); else @@ -307,7 +310,7 @@ int32_t ro_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (create, frame, -1, EROFS, NULL, NULL, NULL, NULL, NULL, xdata); else @@ -331,7 +334,7 @@ int32_t ro_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, fd_t *fd, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this) && + if (is_readonly_or_worm_enabled (frame, this) && (((flags & O_ACCMODE) == O_WRONLY) || ((flags & O_ACCMODE) == O_RDWR))) { STACK_UNWIND_STRICT (open, frame, -1, EROFS, NULL, xdata); @@ -347,7 +350,7 @@ int32_t ro_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict, int32_t flags, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (fsetxattr, frame, -1, EROFS, xdata); else STACK_WIND_TAIL (frame, FIRST_CHILD (this), @@ -361,7 +364,7 @@ int32_t ro_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (fsyncdir, frame, -1, EROFS, xdata); else STACK_WIND_TAIL (frame, FIRST_CHILD (this), @@ -376,7 +379,7 @@ ro_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector, int32_t count, off_t off, uint32_t flags, struct iobref *iobref, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (writev, frame, -1, EROFS, NULL, NULL, xdata); else @@ -392,7 +395,7 @@ int32_t ro_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, int32_t flags, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (setxattr, frame, -1, EROFS, xdata); else STACK_WIND_TAIL (frame, FIRST_CHILD (this), @@ -406,7 +409,7 @@ int32_t ro_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) STACK_UNWIND_STRICT (removexattr, frame, -1, EROFS, xdata); else STACK_WIND_TAIL (frame, FIRST_CHILD (this), diff --git a/xlators/features/read-only/src/read-only-common.h b/xlators/features/read-only/src/read-only-common.h index 248ca47b660..6d8c38faeb8 100644 --- a/xlators/features/read-only/src/read-only-common.h +++ b/xlators/features/read-only/src/read-only-common.h @@ -11,7 +11,7 @@ #include "defaults.h" gf_boolean_t -is_readonly_or_worm_enabled (xlator_t *this); +is_readonly_or_worm_enabled (call_frame_t *frame, xlator_t *this); int32_t ro_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, diff --git a/xlators/features/read-only/src/worm.c b/xlators/features/read-only/src/worm.c index 0f481ec766a..74bf0072e4c 100644 --- a/xlators/features/read-only/src/worm.c +++ b/xlators/features/read-only/src/worm.c @@ -34,7 +34,7 @@ static int32_t worm_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, fd_t *fd, dict_t *xdata) { - if (is_readonly_or_worm_enabled (this) && + if (is_readonly_or_worm_enabled (frame, this) && (flags & (O_WRONLY | O_RDWR | O_APPEND | O_TRUNC))) { STACK_UNWIND_STRICT (open, frame, -1, EROFS, NULL, NULL); return 0; @@ -55,7 +55,7 @@ worm_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, priv = this->private; GF_ASSERT (priv); - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) goto out; if (!priv->worm_file || (frame->root->pid < 0)) { op_errno = 0; @@ -91,7 +91,7 @@ worm_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, priv = this->private; GF_ASSERT (priv); - if (is_readonly_or_worm_enabled (this)) { + if (is_readonly_or_worm_enabled (frame, this)) { goto out; } if (!priv->worm_file || (frame->root->pid < 0)) { @@ -127,7 +127,7 @@ worm_rename (call_frame_t *frame, xlator_t *this, priv = this->private; GF_ASSERT (priv); - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) goto out; if (!priv->worm_file || (frame->root->pid < 0)) { op_errno = 0; @@ -163,7 +163,7 @@ worm_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, priv = this->private; GF_ASSERT (priv); - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) goto out; if (!priv->worm_file || (frame->root->pid < 0)) { op_errno = 0; @@ -198,7 +198,7 @@ worm_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, priv = this->private; GF_ASSERT (priv); - if (is_readonly_or_worm_enabled (this)) + if (is_readonly_or_worm_enabled (frame, this)) goto out; if (!priv->worm_file || (frame->root->pid < 0)) { op_errno = 0; |