summaryrefslogtreecommitdiffstats
path: root/xlators/features/read-only/src
diff options
context:
space:
mode:
authorkarthik-us <ksubrahm@redhat.com>2017-04-04 18:57:32 +0530
committerNiels de Vos <ndevos@redhat.com>2017-04-05 04:11:51 -0400
commitc5a4a77848024d2adf8cd4f35d550ba90c174fc7 (patch)
tree30ca6e69fc7f363b396a9c2137716e08483a8e5a /xlators/features/read-only/src
parent61f76f318faed395660f5bbcfe39616b39c158f0 (diff)
features/worm: Adding implementation for ftruncate
Problem: Since the ftruncate fop was not handled in the worm feature, when truncate and write was happening on a worm-retained/worm file, it was giving the EROFS error but truncating the file, which is not correct. Change-Id: I1a7e904655210d78bce9e01652ac56f3783b5aed BUG: 1438810 Signed-off-by: karthik-us <ksubrahm@redhat.com> Reviewed-on: https://review.gluster.org/16995 NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Niels de Vos <ndevos@redhat.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Ravishankar N <ravishankar@redhat.com> Smoke: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Amar Tumballi <amarts@redhat.com> Reviewed-by: Raghavendra Talur <rtalur@redhat.com>
Diffstat (limited to 'xlators/features/read-only/src')
-rw-r--r--xlators/features/read-only/src/worm.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/xlators/features/read-only/src/worm.c b/xlators/features/read-only/src/worm.c
index eec3b384212..c7f9b9288dd 100644
--- a/xlators/features/read-only/src/worm.c
+++ b/xlators/features/read-only/src/worm.c
@@ -35,7 +35,7 @@ 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) &&
- (flags & (O_WRONLY | O_RDWR | O_APPEND))) {
+ (flags & (O_WRONLY | O_RDWR | O_APPEND | O_TRUNC))) {
STACK_UNWIND_STRICT (open, frame, -1, EROFS, NULL, NULL);
return 0;
}
@@ -175,7 +175,7 @@ worm_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,
goto out;
}
op_errno = gf_worm_state_transition (this, _gf_false, loc,
- GF_FOP_TRUNCATE);
+ GF_FOP_TRUNCATE);
out:
if (op_errno)
@@ -190,6 +190,41 @@ out:
static int32_t
+worm_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,
+ dict_t *xdata)
+{
+ int op_errno = EROFS;
+ read_only_priv_t *priv = NULL;
+
+ priv = this->private;
+ GF_ASSERT (priv);
+ if (is_readonly_or_worm_enabled (this))
+ goto out;
+ if (!priv->worm_file) {
+ op_errno = 0;
+ goto out;
+ }
+
+ if (is_wormfile (this, _gf_true, fd)) {
+ op_errno = 0;
+ goto out;
+ }
+ op_errno = gf_worm_state_transition (this, _gf_true, fd,
+ GF_FOP_FTRUNCATE);
+
+out:
+ if (op_errno)
+ STACK_UNWIND_STRICT (ftruncate, frame, -1, op_errno, NULL, NULL,
+ NULL);
+ else
+ STACK_WIND_TAIL (frame, FIRST_CHILD (this),
+ FIRST_CHILD (this)->fops->ftruncate,
+ fd, offset, xdata);
+ return 0;
+}
+
+
+static int32_t
worm_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
struct iatt *stbuf, int32_t valid, dict_t *xdata)
{
@@ -546,6 +581,7 @@ struct xlator_fops fops = {
.link = worm_link,
.unlink = worm_unlink,
.truncate = worm_truncate,
+ .ftruncate = worm_ftruncate,
.create = worm_create,
.rmdir = ro_rmdir,