summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2017-03-06 10:19:54 -0500
committerJeff Darcy <jeff@pl.atyp.us>2017-07-11 15:01:51 +0000
commit9ab249130a5dd442044e787f1e171e7a17839906 (patch)
treee5a5dc92b211701a19ce1a787ab69f5a68814c46
parent09f9c6c1c9c565d54c257e58c46004326ec1c495 (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>
-rw-r--r--xlators/features/read-only/src/read-only-common.c45
-rw-r--r--xlators/features/read-only/src/read-only-common.h2
-rw-r--r--xlators/features/read-only/src/worm.c12
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;