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>
This commit is contained in:
Susant Palai 2014-06-30 14:04:34 -04:00 committed by Raghavendra G
parent f3a340694f
commit 010da8e41e
2 changed files with 64 additions and 2 deletions

64
tests/bugs/bug-1110262.t Normal file
View File

@ -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

View File

@ -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);