summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorluneo7 <luneo7@gmail.com>2017-08-23 15:25:57 -0300
committerAmar Tumballi <amarts@redhat.com>2017-09-18 07:14:59 +0000
commit00a4dc058a0573d18e9c1bd3692fecee151a9285 (patch)
treee61afa029aea080d04e47b71314b492c256ee0bc
parentdabfc3116ae59b331f967c090c0c51eb3f0355fd (diff)
features/worm: Adding check to newloc when doing rename
Problem: Since rename didn't check if newloc exists and it's retention state it was possible to rename a new file that wasn't in retention over a existing file that was in read-only state. Change-Id: I63c6bbabb7bb456ebedf201cc77b878ffda62229 BUG: 1484490 Signed-off-by: luneo7 <luneo7@gmail.com> Reviewed-on: https://review.gluster.org/18104 Tested-by: jiffin tony Thottan <jthottan@redhat.com> Tested-by: Prashanth Pai <ppai@redhat.com> Smoke: Gluster Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Prashanth Pai <ppai@redhat.com> Reviewed-by: Karthik U S <ksubrahm@redhat.com> Reviewed-by: Amar Tumballi <amarts@redhat.com>
-rwxr-xr-xtests/features/worm.t9
-rw-r--r--xlators/features/read-only/src/worm.c18
2 files changed, 25 insertions, 2 deletions
diff --git a/tests/features/worm.t b/tests/features/worm.t
index 407b49a79ce..f8f05065918 100755
--- a/tests/features/worm.t
+++ b/tests/features/worm.t
@@ -48,6 +48,15 @@ TEST ! link $M0/file1 $M0/file2
sleep 5
TEST rm -f $M0/file1
+## Test for mv over WORM/Reatined state
+TEST `echo "worm 1" > $M0/file1`
+TEST chmod 0444 $M0/file1
+TEST `echo "worm 2" > $M0/file2`
+TEST ! mv $M0/file2 $M0/file1
+TEST rm -f $M0/file2
+sleep 10
+TEST rm -f $M0/file1
+
TEST $CLI volume stop $V0
EXPECT 'Stopped' volinfo_field $V0 'Status'
diff --git a/xlators/features/read-only/src/worm.c b/xlators/features/read-only/src/worm.c
index 74bf0072e4c..e4916402f8e 100644
--- a/xlators/features/read-only/src/worm.c
+++ b/xlators/features/read-only/src/worm.c
@@ -137,10 +137,24 @@ worm_rename (call_frame_t *frame, xlator_t *this,
gf_uuid_copy (oldloc->gfid, oldloc->inode->gfid);
if (is_wormfile (this, _gf_false, oldloc)) {
op_errno = 0;
- goto out;
+ goto check_newloc;
}
op_errno = gf_worm_state_transition (this, _gf_false, oldloc,
- GF_FOP_RENAME);
+ GF_FOP_RENAME);
+
+ if (op_errno == 0) {
+check_newloc:
+ if (newloc->inode != NULL) {
+ gf_uuid_copy (newloc->gfid, newloc->inode->gfid);
+ if (is_wormfile (this, _gf_false, newloc)) {
+ op_errno = 0;
+ goto out;
+ }
+ op_errno = gf_worm_state_transition (this, _gf_false,
+ newloc,
+ GF_FOP_RENAME);
+ }
+ }
out:
if (op_errno)