diff options
-rw-r--r-- | tests/basic/gfid-access.t | 18 | ||||
-rw-r--r-- | xlators/features/gfid-access/src/gfid-access.c | 13 |
2 files changed, 24 insertions, 7 deletions
diff --git a/tests/basic/gfid-access.t b/tests/basic/gfid-access.t index 24477acba5c..00e14235fee 100644 --- a/tests/basic/gfid-access.t +++ b/tests/basic/gfid-access.t @@ -36,6 +36,24 @@ TEST chmod 0777 $M0/.gfid/$a_gfid_str EXPECT "777" stat -c "%a" $M0/a EXPECT "777" stat -c "%a" $M0/.gfid/$a_gfid_str +#Entry operations on directory +#Test that virtual directories are not allowed to be deleted. +TEST ! mkdir $M0/.gfid +TEST ! rmdir $M0/.gfid +TEST ! touch $M0/.gfid +TEST ! rm -f $M0/.gfid +TEST ! mv $M0/.gfid $M0/dont-rename +TEST ! ln -s $M0/symlink $M0/.gfid +TEST ! ln $M0/.gfid $M0/hlink +TEST ! mknod $M0/.gfid b 0 0 + +#Test that first level directory/file creations inside .gfid are not allowed. +TEST ! mkdir $M0/.gfid/a +TEST ! touch $M0/.gfid/a +TEST ! mv /etc/passwd $M0/.gfid +TEST ! mv $M0/a $M0/.gfid +TEST ! mknod $M0/.gfid/b b 0 0 + #Operations on File TEST setfattr -n trusted.abc -v abc $M0/b EXPECT "abc" echo $(getfattr -n trusted.abc $M0/b) diff --git a/xlators/features/gfid-access/src/gfid-access.c b/xlators/features/gfid-access/src/gfid-access.c index 8b699ffc9d4..52c137c342f 100644 --- a/xlators/features/gfid-access/src/gfid-access.c +++ b/xlators/features/gfid-access/src/gfid-access.c @@ -30,6 +30,9 @@ ga_valid_inode_loc_copy (loc_t *dst, loc_t *src, xlator_t *this) if (ret < 0) goto out; + /* + * Change ALL virtual inodes with real-inodes in loc + */ if (dst->parent) { ret = inode_ctx_get (dst->parent, this, &value); if (ret < 0) { @@ -38,14 +41,9 @@ ga_valid_inode_loc_copy (loc_t *dst, loc_t *src, xlator_t *this) } inode_unref (dst->parent); dst->parent = inode_ref ((inode_t*)value); - /* if parent is virtual, no need to handle */ - /* loc->inode */ - goto out; + uuid_copy (dst->pargfid, dst->parent->gfid); } - /* if its an inode operation, on the virtual */ - /* directory inode itself, we need to handle */ - /* it properly */ if (dst->inode) { ret = inode_ctx_get (dst->inode, this, &value); if (ret < 0) { @@ -54,9 +52,10 @@ ga_valid_inode_loc_copy (loc_t *dst, loc_t *src, xlator_t *this) } inode_unref (dst->inode); dst->inode = inode_ref ((inode_t*)value); - goto out; + uuid_copy (dst->gfid, dst->inode->gfid); } out: + return ret; } |