diff options
author | Susant Palai <spalai@redhat.com> | 2014-06-30 14:04:34 -0400 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2015-06-01 22:53:55 -0700 |
commit | 010da8e41edc510c4c0236a4ec23e9e628faebe7 (patch) | |
tree | 1119abb7bdf622870cad75ecf7e8ee4799951f20 | |
parent | f3a340694fcb195aa8b546578c348b41fb2208d1 (diff) |
DHT/permissoin: Let setattr consume stat built from lookup in heal path
setattr call post mkdir(selfheal) ends up using the mode bits
returned by mkdir,which miss the required suid, sgid and sticky bit.
Hence, the fix is to use the mode bits from local->stbuf which was used
to create the missing directories.
Change-Id: I478708c80e28edc6509b784b0ad83952fc074a5b
BUG: 1110262
Signed-off-by: Susant Palai <spalai@redhat.com>
Reviewed-on: http://review.gluster.org/8208
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Tested-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r-- | tests/bugs/bug-1110262.t | 64 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-selfheal.c | 2 |
2 files changed, 64 insertions, 2 deletions
diff --git a/tests/bugs/bug-1110262.t b/tests/bugs/bug-1110262.t new file mode 100644 index 00000000000..b6051935b7f --- /dev/null +++ b/tests/bugs/bug-1110262.t @@ -0,0 +1,64 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +## Start glusterd +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +## Lets create volume +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; + +## Verify volume is created +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; +TEST $CLI volume set $V0 client-log-level TRACE +TEST $CLI volume set $V0 brick-log-level TRACE +## Start volume and verify +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST glusterfs -s $H0 --volfile-id=$V0 $M0 + +#kill one of the brick process +TEST kill -9 `ps aux | grep glusterfsd | grep $B0/${V0}2 | awk '{print $2}'`; + +#create a user and group +TEST useradd dev +TEST groupadd QA + +#create a new directory now with special user, group and mode bits +mkdir -m 7777 $M0/dironedown +TEST chown dev $M0/dironedown +TEST chgrp QA $M0/dironedown + +#store the permissions for comparision +permission_onedown=`ls -l $M0 | grep dironedown | awk '{print $1}'` + +#Now bring up the brick process +TEST $CLI volume start $V0 force + +#The updation of directory attrs happens on the revalidate path. Hence, atmax on +#2 lookups the update will happen. +sleep 5 +TEST ls $M0/dironedown; + +#check directory that was created post brick going down +TEST brick_perm=`ls -l $B0/${V0}2 | grep dironedown | awk '{print $1}'` +TEST echo $brick_perm; +TEST [ ${brick_perm} = ${permission_onedown} ] +uid=`ls -l $B0/${V0}2 | grep dironedown | awk '{print $3}'` +TEST echo $uid +TEST [ $uid = dev ] +gid=`ls -l $B0/${V0}2 | grep dironedown | awk '{print $4}'` +TEST echo $gid +TEST [ $gid = QA ] + +#cleanup +TEST userdel --force dev +TEST groupdel QA + +cleanup diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c index 6d3d20823cd..2c2e3ae863e 100644 --- a/xlators/cluster/dht/src/dht-selfheal.c +++ b/xlators/cluster/dht/src/dht-selfheal.c @@ -1106,8 +1106,6 @@ dht_selfheal_dir_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, local->loc.path, gfid ); goto out; } - - dht_iatt_merge (this, &local->stbuf, stbuf, prev->this); dht_iatt_merge (this, &local->preparent, preparent, prev->this); dht_iatt_merge (this, &local->postparent, postparent, prev->this); |