touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
nlink=$(stat --format=%h $DIR/$tfile)
[ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
- exec 173<$DIR/$tfile
- trap "exec 173<&-" EXIT
- nlink=$(stat --dereference --format=%h /proc/self/fd/173)
+ local fd=$(free_fd)
+ local cmd="exec $fd<$DIR/$tfile"
+ eval $cmd
+ cmd="exec $fd<&-"
+ trap "eval $cmd" EXIT
+ nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
[ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
- nlink=$(stat --dereference --format=%h /proc/self/fd/173)
+ nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
[ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
- exec 173<&-
+ eval $cmd
}
run_test 31n "check link count of unlinked file"
cleanup_test32_mount() {
trap 0
- $UMOUNT $DIR/$tdir/ext2-mountpoint
+ $UMOUNT -d $DIR/$tdir/ext2-mountpoint
}
test_32a() {
cleanup_testdir_mount() {
trap 0
- $UMOUNT $DIR/$tdir
+ $UMOUNT -d $DIR/$tdir
}
test_32q() {
local MDTIDX=1
TESTDIR=$DIR/$tdir/$tfile
[ -e $TESTDIR ] && rm -rf $TESTDIR
- test_mkdir -p $TESTDIR
+ mkdir -p $TESTDIR
cd $TESTDIR
links1=2
ls
dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write"
df $tdir
dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read"
- $UMOUNT $tdir
+ $UMOUNT -d $tdir
losetup -d $loopdev
rm $loopdev
}
test_101a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -ge 2 ] && skip "skip now for >= 2 MDTs" && return #LU-4322
local s
local discard
local nreads=10000
cleanup_test102
+getxattr() { # getxattr path name
+ # Return the base64 encoding of the value of xattr name on path.
+ local path=$1
+ local name=$2
+
+ # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
+ # file: $path
+ # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
+ #
+ # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
+
+ getfattr --absolute-names --encoding=base64 --name=$name $path |
+ awk -F= -v name=$name '$1 == name {
+ print substr($0, index($0, "=") + 1);
+ }'
+}
+
+test_102n() { # LU-4101 mdt: protect internal xattrs
+ local file0=$DIR/$tfile.0
+ local file1=$DIR/$tfile.1
+ local xattr0=$TMP/$tfile.0
+ local xattr1=$TMP/$tfile.1
+ local name
+ local value
+
+ if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.50) ]
+ then
+ skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
+ return
+ fi
+
+ rm -rf $file0 $file1 $xattr0 $xattr1
+ touch $file0 $file1
+
+ # Get 'before' xattrs of $file1.
+ getfattr --absolute-names --dump --match=- $file1 > $xattr0
+
+ for name in lov lma lmv link fid version som hsm lfsck_namespace; do
+ # Try to copy xattr from $file0 to $file1.
+ value=$(getxattr $file0 trusted.$name 2> /dev/null)
+
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr 'trusted.$name' failed"
+
+ # Try to set a garbage xattr.
+ value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
+
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr 'trusted.$name' failed"
+
+ # Try to remove the xattr from $file1. We don't care if this
+ # appears to succeed or fail, we just don't want there to be
+ # any changes or crashes.
+ setfattr --remove=$trusted.$name $file1 2> /dev/null
+ done
+
+ # Get 'after' xattrs of file1.
+ getfattr --absolute-names --dump --match=- $file1 > $xattr1
+
+ if ! diff $xattr0 $xattr1; then
+ error "before and after xattrs of '$file1' differ"
+ fi
+
+ rm -rf $file0 $file1 $xattr0 $xattr1
+
+ return 0
+}
+run_test 102n "silently ignore setxattr on internal trusted xattrs"
+
run_acl_subtest()
{
$LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
run_test 208 "Exclusive open"
test_209() {
- [[ $($LCTL get_param -n mdc.*.connect_flags) == ~disp_stripe ]] &&
+ [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
skip_env "must have disp_stripe" && return
touch $DIR/$tfile
cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
$SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
- exec {FD}<>$file2
+ local fd=$(free_fd)
+ local cmd="exec $fd<>$file2"
+ eval $cmd
rm $file2
- $LFS swap_layouts $file1 /proc/self/fd/${FD} ||
- error "cannot swap layouts of '$file1' and /proc/self/fd/${FD}"
- exec {FD}>&-
+ $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
+ error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
+ cmd="exec $fd>&-"
+ eval $cmd
cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
#cleanup