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>
This commit is contained in:
parent
61f76f318f
commit
c5a4a77848
@ -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)
|
||||
@ -189,6 +189,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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user