diff options
author | Venkatesh Somyajulu <vsomyaju@redhat.com> | 2014-11-14 12:06:39 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-11-14 01:43:07 -0800 |
commit | 3e0a9c04ed86153a2822b92d69b31e20ef5c63f6 (patch) | |
tree | 5714aacbf9c9b74ea1827288e4fc7c3818fa64ef | |
parent | 7c9e95f1876ca0d209509358e6d4e58c910dd71e (diff) |
posix: Changed order of chown and chmod
Problem:
Rebalance process runs in the root mode. If a normal
user create a file and if it requires migration then
because the migrated file is created by root, its owner and
mode should be changed to the source normal user and
permission should be changed the previous mode. If
the suid bit is also set, then at the destination
suid bit should also be set.
Two operations are performed in the given order:
1. chmod
2. chown
But chown resets the suid bit. So changed the order
of these two operations so that first chown will be
performed and then chmod will be performd so that
suid bit will be preserved.
Change-Id: Ib63b5cf528f8336b69bf090ad43bb02eec1d1602
BUG: 1086228
Signed-off-by: Venkatesh Somyajulu <vsomyaju@redhat.com>
Reviewed-on: http://review.gluster.org/7435
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
-rwxr-xr-x | tests/bugs/bug-1086228.t | 34 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix.c | 14 |
2 files changed, 41 insertions, 7 deletions
diff --git a/tests/bugs/bug-1086228.t b/tests/bugs/bug-1086228.t new file mode 100755 index 00000000000..4c77a851b88 --- /dev/null +++ b/tests/bugs/bug-1086228.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../fileio.rc +. $(dirname $0)/../dht.rc +cleanup; + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2} +TEST $CLI volume start $V0; +TEST glusterfs --direct-io-mode=yes --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0; + +echo "D" > $M0/file1; +TEST chmod +st $M0/file1; + +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}"3" +TEST $CLI volume rebalance $V0 start force + +EXPECT_WITHIN "10" "0" rebalance_completed +count=0 +for i in `ls $B0/$V0"3"`; + do + var=`stat -c %A $B0/$V0"3"/$i | cut -c 4`; + echo $B0/$V0"3"/$i $var + if [ "$var" != "S" ]; then + count=$((count + 1)) + fi + done + +TEST [[ $count == 0 ]] +cleanup diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index cd9889260ee..0bf6c6f57ff 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -527,27 +527,27 @@ posix_fsetattr (call_frame_t *frame, xlator_t *this, goto out; } - if (valid & GF_SET_ATTR_MODE) { - op_ret = posix_do_fchmod (this, pfd->fd, stbuf); + if (valid & (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) { + op_ret = posix_do_fchown (this, pfd->fd, stbuf, valid); if (op_ret == -1) { op_errno = errno; gf_log (this->name, GF_LOG_ERROR, - "fsetattr (fchmod) failed on fd=%p: %s", + "fsetattr (fchown) failed on fd=%p: %s", fd, strerror (op_errno)); goto out; } + } - if (valid & (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) { - op_ret = posix_do_fchown (this, pfd->fd, stbuf, valid); + if (valid & GF_SET_ATTR_MODE) { + op_ret = posix_do_fchmod (this, pfd->fd, stbuf); if (op_ret == -1) { op_errno = errno; gf_log (this->name, GF_LOG_ERROR, - "fsetattr (fchown) failed on fd=%p: %s", + "fsetattr (fchmod) failed on fd=%p: %s", fd, strerror (op_errno)); goto out; } - } if (valid & (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME)) { |