X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=2d6bcdd78953fec9de2eb4c4fc48a7de0c0e892b;hb=892c2251d854f480c272ab2999cdc6f4c87fecf0;hp=bdc08f27818316f874cf5863af32f5f3a1abb653;hpb=07b271c0972757772a129e9a6370dbb163f16a06;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh old mode 100755 new mode 100644 index bdc08f2..2d6bcdd --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -1144,7 +1144,7 @@ run_test 24u "create stripe file" simple_cleanup_common() { local rc=0 trap 0 - [ -z "$DIR" -o -z "$tdir" ] && return 0 + [ -z "$DIR" ] || [ -z "$tdir" ] && return 0 local start=$SECONDS rm -rf $DIR/$tdir @@ -1186,10 +1186,10 @@ test_24v() { local num_ls=$(ls $DIR/$tdir | wc -l) local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l) local num_all=$(ls -a $DIR/$tdir | wc -l) - if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \ - $num_all -ne $((nrfiles + 2)) ]; then - error "Expected $nrfiles files, got $num_ls " \ - "($num_uniq unique $num_all .&..)" + if [ $num_ls -ne $nrfiles ] || [ $num_uniq -ne $nrfiles ] || + [ $num_all -ne $((nrfiles + 2)) ]; then + error "Expected $nrfiles files, got $num_ls " \ + "($num_uniq unique $num_all .&..)" fi # LU-5 large readdir # dirent_size = 32 bytes for sizeof(struct lu_dirent) + @@ -1284,6 +1284,36 @@ test_24y() { } run_test 24y "rename/link on the same dir should succeed" +test_24z() { + [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" + [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] && + skip "Need MDS version at least 2.12.51" + + local index + + for index in 0 1; do + $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed" + touch $DIR/$tdir.0/$tfile.$index || error "touch failed" + done + + mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed" + + index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0) + [ $index -eq 0 ] || error "$tfile.0 is on MDT$index" + + local mdts=$(comma_list $(mdts_nodes)) + + do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0 + stack_trap "do_nodes $mdts $LCTL \ + set_param mdt.*.enable_remote_rename=1" EXIT + + mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed" + + index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1) + [ $index -eq 1 ] || error "$tfile.1 is on MDT$index" +} +run_test 24z "cross-MDT rename is done as cp" + test_24A() { # LU-3182 local NFILES=5000 @@ -1294,7 +1324,8 @@ test_24A() { # LU-3182 local t=$(ls $DIR/$tdir | wc -l) local u=$(ls $DIR/$tdir | sort -u | wc -l) local v=$(ls -ai $DIR/$tdir | sort -u | wc -l) - if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then + if [ $t -ne $NFILES ] || [ $u -ne $NFILES ] || + [ $v -ne $((NFILES + 2)) ] ; then error "Expected $NFILES files, got $t ($u unique $v .&..)" fi @@ -1502,6 +1533,112 @@ test_27b() { } run_test 27b "create and write to two stripe file" +# 27c family tests specific striping, setstripe -o +test_27ca() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" + test_mkdir -p $DIR/$tdir + local osts="1" + + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + $LFS getstripe -i $DIR/$tdir/$tfile + [ $($LFS getstripe -i $DIR/$tdir/$tfile ) -eq $osts ] || + error "stripe not on specified OST" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27ca "one stripe on specified OST" + +test_27cb() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" + test_mkdir -p $DIR/$tdir + local osts="1,0" + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + local getstripe=$($LFS getstripe $DIR/$tdir/$tfile) + echo "$getstripe" + + # Strip getstripe output to a space separated list of OSTs + local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\ + awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//') + [ "$getstripe_osts" = "${osts//,/ }" ] || + error "stripes not on specified OSTs" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27cb "two stripes on specified OSTs" + +test_27cc() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + + test_mkdir -p $DIR/$tdir + local osts="0,0" + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + local getstripe=$($LFS getstripe $DIR/$tdir/$tfile) + echo "$getstripe" + + # Strip getstripe output to a space separated list of OSTs + local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\ + awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//') + [ "$getstripe_osts" = "${osts//,/ }" ] || + error "stripes not on specified OSTs" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27cc "two stripes on the same OST" + +test_27cd() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + test_mkdir -p $DIR/$tdir + local osts="0,1,1,0" + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + local getstripe=$($LFS getstripe $DIR/$tdir/$tfile) + echo "$getstripe" + + # Strip getstripe output to a space separated list of OSTs + local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\ + awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//') + [ "$getstripe_osts" = "${osts//,/ }" ] || + error "stripes not on specified OSTs" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27cd "four stripes on two OSTs" + +test_27ce() { + [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && + skip_env "too many osts, skipping" + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + # We do one more stripe than we have OSTs + [ $OSTCOUNT -ge 159 ] || large_xattr_enabled || + skip_env "ea_inode feature disabled" + + test_mkdir -p $DIR/$tdir + local osts="" + for i in $(seq 0 $OSTCOUNT); + do + osts=$osts"0" + if [ $i -ne $OSTCOUNT ]; then + osts=$osts"," + fi + done + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + local getstripe=$($LFS getstripe $DIR/$tdir/$tfile) + echo "$getstripe" + + # Strip getstripe output to a space separated list of OSTs + local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\ + awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//') + [ "$getstripe_osts" = "${osts//,/ }" ] || + error "stripes not on specified OSTs" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27ce "more stripes than OSTs with -o" + test_27d() { test_mkdir $DIR/$tdir $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile || @@ -1542,6 +1679,16 @@ test_27g() { } run_test 27g "$LFS getstripe with no objects" +test_27ga() { + test_mkdir $DIR/$tdir + touch $DIR/$tdir/$tfile || error "touch failed" + ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed" + $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2 + local rc=$? + (( rc == 2 )) || error "getstripe did not return ENOENT" +} +run_test 27ga "$LFS getstripe with missing file (should return error)" + test_27i() { test_mkdir $DIR/$tdir touch $DIR/$tdir/$tfile || error "touch failed" @@ -1580,6 +1727,9 @@ run_test 27l "check setstripe permissions (should return error)" test_27m() { [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" + [ -n "$RCLIENTS" -o -n "$MOUNT_2" ] && + skip_env "multiple clients -- skipping" + ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail | head -n1) if [[ $ORIGFREE -gt $MAXFREE ]]; then @@ -2144,7 +2294,8 @@ test_27B() { # LU-2523 } run_test 27B "call setstripe on open unlinked file/rename victim" -test_27C() { #LU-2871 +# 27C family tests full striping and overstriping +test_27Ca() { #LU-2871 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" declare -a ost_idx @@ -2180,7 +2331,143 @@ test_27C() { #LU-2871 done done } -run_test 27C "check full striping across all OSTs" +run_test 27Ca "check full striping across all OSTs" + +test_27Cb() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && + skip_env "too many osts, skipping" + + test_mkdir -p $DIR/$tdir + local setcount=$(($OSTCOUNT * 2)) + [ $setcount -ge 160 ] || large_xattr_enabled || + skip_env "ea_inode feature disabled" + + $LFS setstripe -C $setcount $DIR/$tdir/$tfile || + error "setstripe failed" + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" || + error "overstriped should be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" +} +run_test 27Cb "more stripes than OSTs with -C" + +test_27Cc() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST" + + test_mkdir -p $DIR/$tdir + local setcount=$(($OSTCOUNT - 1)) + + [ $setcount -ge 160 ] || large_xattr_enabled || + skip_env "ea_inode feature disabled" + + $LFS setstripe -C $setcount $DIR/$tdir/$tfile || + error "setstripe failed" + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" && + error "overstriped should not be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" +} +run_test 27Cc "fewer stripes than OSTs does not set overstriping" + +test_27Cd() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST" + large_xattr_enabled || skip_env "ea_inode feature disabled" + + test_mkdir -p $DIR/$tdir + local setcount=$LOV_MAX_STRIPE_COUNT + + $LFS setstripe -C $setcount $DIR/$tdir/$tfile || + error "setstripe failed" + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" || + error "overstriped should be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" + + rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed" +} +run_test 27Cd "test maximum stripe count" + +test_27Ce() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + test_mkdir -p $DIR/$tdir + + pool_add $TESTNAME || error "Pool creation failed" + pool_add_targets $TESTNAME 0 || error "pool_add_targets failed" + + local setcount=8 + + $LFS setstripe -C $setcount -p "$TESTNAME" $DIR/$tdir/$tfile || + error "setstripe failed" + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" || + error "overstriped should be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" + + rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed" +} +run_test 27Ce "test pool with overstriping" + +test_27Cf() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && + skip_env "too many osts, skipping" + + test_mkdir -p $DIR/$tdir + + local setcount=$(($OSTCOUNT * 2)) + [ $setcount -ge 160 ] || large_xattr_enabled || + skip_env "ea_inode feature disabled" + + $LFS setstripe -C $setcount $DIR/$tdir/ || + error "setstripe failed" + + echo 1 > $DIR/$tdir/$tfile + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" || + error "overstriped should be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" + + rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed" +} +run_test 27Cf "test default inheritance with overstriping" test_27D() { [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs" @@ -2205,9 +2492,12 @@ test_27D() { local skip27D [ $MDS1_VERSION -lt $(version_code 2.8.55) ] && skip27D+="-s 29" - [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \ - $CLIENT_VERSION -lt $(version_code 2.9.55) ] && - skip27D+=" -s 30,31" + [ $MDS1_VERSION -lt $(version_code 2.9.55) ] || + [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] && + skip27D+=" -s 30,31" + [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping || + $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && + skip27D+=" -s 32,33" llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D || error "llapi_layout_test failed" @@ -2240,8 +2530,12 @@ test_27E() { $LFS setstripe -c $OSTCOUNT $DIR/$tfile || error "setstripe failed" - cat $DIR/$tfile - rm $DIR/$tfile + # In order to ensure stat() call actually talks to MDS we need to + # do something drastic to this file to shake off all lock, e.g. + # rename it (kills lookup lock forcing cache cleaning) + mv $DIR/$tfile $DIR/${tfile}-1 + ls -l $DIR/${tfile}-1 + rm $DIR/${tfile}-1 easize=$($LCTL get_param -n llite.*.default_easize) @@ -2344,6 +2638,199 @@ test_27H() { } run_test 27H "Set specific OSTs stripe" +test_27I() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" + local pool=$TESTNAME + local ostrange="1 1 1" + + save_layout_restore_at_exit $MOUNT + $LFS setstripe -c 2 -i 0 $MOUNT + pool_add $pool || error "pool_add failed" + pool_add_targets $pool $ostrange || "pool_add_targets failed" + test_mkdir $DIR/$tdir + $LFS setstripe -p $pool $DIR/$tdir + $MULTIOP $DIR/$tdir/$tfile Oc || error "multiop failed" + $LFS getstripe $DIR/$tdir/$tfile +} +run_test 27I "check that root dir striping does not break parent dir one" + +test_27J() { + [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.51) ]] && + skip "Need MDS version newer than 2.12.51" + + test_mkdir $DIR/$tdir + local uuid1=$(cat /proc/sys/kernel/random/uuid) + local uuid2=$(cat /proc/sys/kernel/random/uuid) + + # create foreign file (raw way) + create_foreign_file -f $DIR/$tdir/$tfile -x "${uuid1}@${uuid2}" \ + -t 1 -F 0xda08 || error "create_foreign_file failed" + + # verify foreign file (raw way) + parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_magic: 0x0BD70BD0" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic" + parse_foreign_file -f $DIR/$tdir/$tfile | grep "lov_xattr_size: 89" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign size" + parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_size: 73" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign size" + parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_type: 1" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign type" + parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_flags: 0x0000DA08" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags" + local lov=$(parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_value: 0x" | + sed -e 's/lov_foreign_value: 0x//') + local lov2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160) + [[ $lov = ${lov2// /} ]] || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign value" + + # create foreign file (lfs + API) + $LFS setstripe --foreign=daos --flags 0xda08 \ + -x "${uuid1}@${uuid2}" $DIR/$tdir/${tfile}2 || + error "$DIR/$tdir/${tfile}2: create failed" + + $LFS getstripe -v $DIR/$tdir/${tfile}2 | + grep "lfm_magic:.*0x0BD70BD0" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign magic" + # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length) + $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_length:.*73" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign size" + $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_type:.*daos" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign type" + $LFS getstripe -v $DIR/$tdir/${tfile}2 | + grep "lfm_flags:.*0x0000DA08" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign flags" + $LFS getstripe $DIR/$tdir/${tfile}2 | + grep "lfm_value:.*${uuid1}@${uuid2}" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign value" + + # modify striping should fail + $LFS setstripe -c 2 $DIR/$tdir/$tfile && + error "$DIR/$tdir/$tfile: setstripe should fail" + $LFS setstripe -c 2 $DIR/$tdir/${tfile}2 && + error "$DIR/$tdir/${tfile}2: setstripe should fail" + + # R/W should fail + cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail" + cat $DIR/$tdir/${tfile}2 && + error "$DIR/$tdir/${tfile}2: read should fail" + cat /etc/passwd > $DIR/$tdir/$tfile && + error "$DIR/$tdir/$tfile: write should fail" + cat /etc/passwd > $DIR/$tdir/${tfile}2 && + error "$DIR/$tdir/${tfile}2: write should fail" + + # chmod should work + chmod 222 $DIR/$tdir/$tfile || + error "$DIR/$tdir/$tfile: chmod failed" + chmod 222 $DIR/$tdir/${tfile}2 || + error "$DIR/$tdir/${tfile}2: chmod failed" + + # chown should work + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tfile || + error "$DIR/$tdir/$tfile: chown failed" + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tfile}2 || + error "$DIR/$tdir/${tfile}2: chown failed" + + # rename should work + mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}.new || + error "$DIR/$tdir/$tfile: rename of foreign file has failed" + mv $DIR/$tdir/${tfile}2 $DIR/$tdir/${tfile}2.new || + error "$DIR/$tdir/${tfile}2: rename of foreign file has failed" + + #remove foreign file + rm $DIR/$tdir/${tfile}.new || + error "$DIR/$tdir/${tfile}.new: remove of foreign file has failed" + rm $DIR/$tdir/${tfile}2.new || + error "$DIR/$tdir/${tfile}2.new: remove of foreign file has failed" +} +run_test 27J "basic ops on file with foreign LOV" + +test_27K() { + [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] && + skip "Need MDS version newer than 2.12.49" + + test_mkdir $DIR/$tdir + local uuid1=$(cat /proc/sys/kernel/random/uuid) + local uuid2=$(cat /proc/sys/kernel/random/uuid) + + # create foreign dir (raw way) + create_foreign_dir -d $DIR/$tdir/$tdir -x "${uuid1}@${uuid2}" -t 1 || + error "create_foreign_dir FAILED" + + # verify foreign dir (raw way) + parse_foreign_dir -d $DIR/$tdir/$tdir | + grep "lmv_foreign_magic:.*0xcd50cd0" || + error "$DIR/$tdir/$tfile: invalid LMV EA magic" + parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_xattr_size:.*89$" || + error "$DIR/$tdir/$tdir: invalid LMV EA size" + parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_type: 1$" || + error "$DIR/$tdir/$tdir: invalid LMV EA type" + parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_flags: 0$" || + error "$DIR/$tdir/$tdir: invalid LMV EA flags" + local lmv=$(parse_foreign_dir -d $DIR/$tdir/$tdir | + grep "lmv_foreign_value: 0x" | + sed 's/lmv_foreign_value: 0x//') + local lmv2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160 | + sed 's/ //g') + [[ $lmv == $lmv2 ]] || error "$DIR/$tdir/$tdir: invalid LMV EA value" + + # create foreign dir (lfs + API) + $LFS mkdir --foreign=daos --xattr="${uuid1}@${uuid2}" --flags=0xda05 \ + $DIR/$tdir/${tdir}2 || + error "$DIR/$tdir/${tdir}2: create failed" + + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | + grep "lfm_magic:.*0x0CD50CD0" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA magic" + # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length) + # - sizeof(lfm_type) - sizeof(lfm_flags) + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA size" + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*daos" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA type" + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | + grep "lfm_flags:.*0x0000DA05" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA flags" + $LFS getdirstripe $DIR/$tdir/${tdir}2 | + grep "lfm_value.*${uuid1}@${uuid2}" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA value" + + # file create in dir should fail + touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail" + touch $DIR/$tdir/${tdir}2/$tfile && + "$DIR/${tdir}2: file create should fail" + + # chmod should work + chmod 777 $DIR/$tdir/$tdir || + error "$DIR/$tdir: chmod failed" + chmod 777 $DIR/$tdir/${tdir}2 || + error "$DIR/${tdir}2: chmod failed" + + # chown should work + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tdir || + error "$DIR/$tdir: chown failed" + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 || + error "$DIR/${tdir}2: chown failed" + + # rename should work + mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new || + error "$DIR/$tdir/$tdir: rename of foreign dir has failed" + mv $DIR/$tdir/${tdir}2 $DIR/$tdir/${tdir}2.new || + error "$DIR/$tdir/${tdir}2: rename of foreign dir has failed" + + #remove foreign dir + rmdir $DIR/$tdir/${tdir}.new || + error "$DIR/$tdir/${tdir}.new: remove of foreign dir has failed" + rmdir $DIR/$tdir/${tdir}2.new || + error "$DIR/$tdir/${tdir}2.new: remove of foreign dir has failed" +} +run_test 27K "basic ops on dir with foreign LMV" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -4108,15 +4595,13 @@ run_test 43A "execution of file opened for write should return -ETXTBSY" test_43a() { test_mkdir $DIR/$tdir - cp -p $(which $MULTIOP) $DIR/$tdir/multiop || - cp -p multiop $DIR/$tdir/multiop - MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c || - error "multiop open $TMP/$tfile.junk failed" - rm $TMP/$tfile.junk # delete junk file on close (not part of test) - MULTIOP_PID=$! - $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success" - kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed" - wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed" + cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy" + $DIR/$tdir/sleep 60 & + SLEEP_PID=$! + # Make sure exec of $tdir/sleep wins race with truncate + sleep 1 + $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success" + kill $SLEEP_PID } run_test 43a "open(RDWR) of file being executed should return -ETXTBSY" @@ -4124,15 +4609,13 @@ test_43b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" test_mkdir $DIR/$tdir - cp -p $(which $MULTIOP) $DIR/$tdir/multiop || - cp -p multiop $DIR/$tdir/multiop - MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c || - error "multiop open $TMP/$tfile.junk failed" - rm $TMP/$tfile.junk # delete junk file on close (not part of test) - MULTIOP_PID=$! - $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success" - kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed" - wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed" + cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy" + $DIR/$tdir/sleep 60 & + SLEEP_PID=$! + # Make sure exec of $tdir/sleep wins race with truncate + sleep 1 + $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success" + kill $SLEEP_PID } run_test 43b "truncate of file being executed should return -ETXTBSY" @@ -5080,6 +5563,41 @@ test_56o() { } run_test 56o "check lfs find -mtime for old files" +test_56ob() { + local dir=$DIR/$tdir + local expected=1 + local count=0 + + # just to make sure there is something that won't be found + test_mkdir $dir + touch $dir/$tfile.now + + for age in year week day hour min; do + count=$((count + 1)) + + touch $dir/$tfile-a.$age $dir/$tfile-m.$age + touch --date="$count $age ago" -a $dir/$tfile-a.$age + touch --date="$count $age ago" -m $dir/$tfile-m.$age + + local cmd="$LFS find $dir -mtime $count${age:0:1}" + local nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + cmd="$LFS find $dir -atime $count${age:0:1}" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + done + + sleep 2 + cmd="$LFS find $dir -ctime +1s -type f" + nums=$($cmd | wc -l) + (( $nums == $count * 2 + 1)) || + error "'$cmd' wrong: found $nums, expected $((expected*2+1))" +} +run_test 56ob "check lfs find -atime -mtime -ctime with units" + test_56p() { [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" @@ -6434,7 +6952,40 @@ test_60g() { } run_test 60g "transaction abort won't cause MDT hung" -test_61() { +test_60h() { + [ $MDS1_VERSION -le $(version_code 2.12.52) ] || + skip "Need MDS version at least 2.12.52" + [ $MDSCOUNT -le 2 ] || skip "Need >= 2 MDTs" + + local f + + #define OBD_FAIL_MDS_STRIPE_CREATE 0x188 + #define OBD_FAIL_MDS_STRIPE_FID 0x189 + for fail_loc in 0x80000188 0x80000189; do + do_facet mds1 "$LCTL set_param fail_loc=$fail_loc" + $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc || + error "mkdir $dir-$fail_loc failed" + for i in {0..10}; do + # create may fail on missing stripe + echo $i > $DIR/$tdir-$fail_loc/$i + done + $LFS getdirstripe $DIR/$tdir-$fail_loc || + error "getdirstripe $tdir-$fail_loc failed" + $LFS migrate -m 1 $DIR/$tdir-$fail_loc || + error "migrate $tdir-$fail_loc failed" + $LFS getdirstripe $DIR/$tdir-$fail_loc || + error "getdirstripe $tdir-$fail_loc failed" + pushd $DIR/$tdir-$fail_loc + for f in *; do + echo $f | cmp $f - || error "$f data mismatch" + done + popd + rm -rf $DIR/$tdir-$fail_loc + done +} +run_test 60h "striped directory with missing stripes can be accessed" + +test_61a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" f="$DIR/f61" @@ -6443,7 +6994,12 @@ test_61() { $MULTIOP $f OSMWUc || error "$MULTIOP $f failed" sync } -run_test 61 "mmap() writes don't make sync hang ================" +run_test 61a "mmap() writes don't make sync hang ================" + +test_61b() { + mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed" +} +run_test 61b "mmap() of unstriped file is successful" # bug 2330 - insufficient obd_match error checking causes LBUG test_62() { @@ -6659,9 +7215,9 @@ test_65d() { if [[ $STRIPECOUNT -le 0 ]]; then sc=1 - elif [[ $STRIPECOUNT -gt 2000 ]]; then -#LOV_MAX_STRIPE_COUNT is 2000 - [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1)) + elif [[ $STRIPECOUNT -gt $LOV_MAX_STRIPE_COUNT ]]; then + [[ $OSTCOUNT -gt $LOV_MAX_STRIPE_COUNT ]] && + sc=$LOV_MAX_STRIPE_COUNT || sc=$(($OSTCOUNT - 1)) else sc=$(($STRIPECOUNT - 1)) fi @@ -7018,11 +7574,11 @@ test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 || error "$RUNAS dd $DIR/$tfile failed" # See if we are still setuid/sgid - test -u $DIR/$tfile -o -g $DIR/$tfile && + [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] && error "S/gid is not dropped on write" # Now test that MDS is updated too cancel_lru_locks mdc - test -u $DIR/$tfile -o -g $DIR/$tfile && + [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] && error "S/gid is not dropped on MDS" rm -f $DIR/$tfile } @@ -7904,7 +8460,7 @@ test_101d() { rm -f $file wait_delete_completed - [ $raOFF -le 1 -o $raON -lt $raOFF ] || + [ $raOFF -le 1 ] || [ $raON -lt $raOFF ] || error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M" } run_test 101d "file read with and without read-ahead enabled" @@ -8028,13 +8584,17 @@ test_101g() { $LFS setstripe -i 0 -c 1 $DIR/$tfile local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1) - if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \ - \( $OST1_VERSION -ge $(version_code 2.7.17) -a \ - $OST1_VERSION -lt $(version_code 2.7.50) \) ] && - [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \ - \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \ - $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then - [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M" + + if { [ $OST1_VERSION -ge $(version_code 2.8.52) ] || + { [ $OST1_VERSION -ge $(version_code 2.7.17) ] && + [ $OST1_VERSION -lt $(version_code 2.7.50) ]; }; } && + { [ $CLIENT_VERSION -ge $(version_code 2.8.52) ] || + { [ $CLIENT_VERSION -ge $(version_code 2.7.17) ] && + [ $CLIENT_VERSION -lt $(version_code 2.7.50) ]; }; }; then + + [ $OST1_VERSION -ge $(version_code 2.9.52) ] && + suffix="M" + if [[ $orig_mb -lt 16 ]]; then save_lustre_params $osts "$brw_size" > $p do_nodes $list $LCTL set_param -n $brw_size=16$suffix || @@ -8285,11 +8845,19 @@ grow_xattr() { local file=$DIR/$tfile local value="$(generate_string $xsize)" local xbig=trusted.big + local toobig=$2 touch $file log "save $xbig on $file" - setfattr -n $xbig -v $value $file || - error "saving $xbig on $file failed" + if [ -z "$toobig" ] + then + setfattr -n $xbig -v $value $file || + error "saving $xbig on $file failed" + else + setfattr -n $xbig -v $value $file && + error "saving $xbig on $file succeeded" + return 0 + fi local orig=$(get_xattr_value $xbig $file) [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig" @@ -8320,7 +8888,12 @@ run_test 102h "grow xattr from inside inode to external block" test_102ha() { large_xattr_enabled || skip_env "ea_inode feature disabled" + echo "setting xattr of max xattr size: $(max_xattr_size)" grow_xattr $(max_xattr_size) + + echo "setting xattr of > max xattr size: $(max_xattr_size) + 10" + echo "This should fail:" + grow_xattr $(($(max_xattr_size) + 10)) 1 } run_test 102ha "grow xattr from inside inode to external inode" @@ -8657,9 +9230,9 @@ test_103a() { echo "performing permissions..." run_acl_subtest permissions || error "permissions failed" # LU-1482 mdd: Setting xattr are properly checked with and without ACLs - if [ $MDS1_VERSION -gt $(version_code 2.8.55) -o \ - \( $MDS1_VERSION -lt $(version_code 2.6) -a \ - $MDS1_VERSION -ge $(version_code 2.5.29) \) ] + if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] || + { [ $MDS1_VERSION -lt $(version_code 2.6) ] && + [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; } then echo "performing permissions xattr..." run_acl_subtest permissions_xattr || @@ -10451,7 +11024,7 @@ test_129() { # check two errors: # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee) # EFBIG for previous versions included in ldiskfs series - if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then + if [ $rc -eq $EFBIG ] || [ $rc -eq $ENOSPC ]; then set_dir_limits 0 0 echo "return code $rc received as expected" @@ -11416,8 +11989,8 @@ test_140() { #bug-17379 done i=$((i - 1)) echo "The symlink depth = $i" - [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] || - error "Invalid symlink depth" + [ $i -eq 5 ] || [ $i -eq 7 ] || [ $i -eq 8 ] || [ $i -eq 40 ] || + error "Invalid symlink depth" # Test recursive symlink ln -s symlink_self symlink_self @@ -13466,12 +14039,12 @@ obdecho_test() { "test_brw $count w v $pages $id" || rc=4; } [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" || rc=4; } - [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \ - "cleanup" || rc=5; } - [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \ - "detach" || rc=6; } - [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc" - return $rc + [ $rc -eq 0 ] || [ $rc -gt 2 ] && + { do_facet $node "$LCTL --device ec cleanup" || rc=5; } + [ $rc -eq 0 ] || [ $rc -gt 1 ] && + { do_facet $node "$LCTL --device ec detach" || rc=6; } + [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc" + return $rc } test_180a() { @@ -14469,8 +15042,8 @@ test_215() { # for bugs 18102, 21079, 21517 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down, # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2 - L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$" - BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$" + L1="^ref +rtr_ref +alive +router$" + BR="^$P +$P +(up|down) +$NID$" create_lnet_proc_files "routers" check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1" remove_lnet_proc_files "routers" @@ -16271,7 +16844,7 @@ run_test 251 "Handling short read and write correctly" test_252() { remote_mds_nodsh && skip "remote MDS with nodsh" remote_ost_nodsh && skip "remote OST with nodsh" - if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then + if [ "$ost1_FSTYPE" != ldiskfs ] || [ "$mds1_FSTYPE" != ldiskfs ]; then skip_env "ldiskfs only test" fi @@ -16757,7 +17330,7 @@ test_255c() { local rc test_mkdir -p $DIR/$tdir - $LFS setstripe -i 0 $DIR/$tdir + $LFS setstripe -i 0 -c 1 $DIR/$tdir #test 10 returns only success/failure i=10 @@ -16923,7 +17496,7 @@ test_258a() { fi rm -f $DIR/$tfile } -run_test 258a +run_test 258a "verify i_mutex security behavior when suid attributes is set" # Verify we do NOT take the i_mutex in the normal case test_258b() { @@ -17484,61 +18057,6 @@ test_271d() { } run_test 271d "DoM: read on open (1K file in reply buffer)" -test_271e() { - [ $MDS1_VERSION -lt $(version_code 2.10.57) ] && - skip "Need MDS version at least 2.10.57" - - local dom=$DIR/$tdir/dom - local tmp=$TMP/${tfile}.data - trap "cleanup_271def_tests $tmp" EXIT - - mkdir -p $DIR/$tdir - - $LFS setstripe -E 1024K -L mdt $DIR/$tdir - - local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir) - - cancel_lru_locks mdc - dd if=/dev/urandom of=$tmp bs=30K count=1 - dd if=$tmp of=$dom bs=30K count=1 - cancel_lru_locks mdc - cat /etc/hosts >> $tmp - lctl set_param -n mdc.*.stats=clear - - echo "Append to the same page" - cat /etc/hosts >> $dom - - local num=$(get_mdc_stats $mdtidx ost_read) - local ra=$(get_mdc_stats $mdtidx req_active) - local rw=$(get_mdc_stats $mdtidx req_waittime) - - [ -z $num ] || error "$num READ RPC occured" - # Reply buffer can be adjusted for larger buffer by resend - echo "... DONE with $((ra - rw)) resends" - - # compare content - cmp $tmp $dom || error "file miscompare" - - cancel_lru_locks mdc - lctl set_param -n mdc.*.stats=clear - - echo "Open and read file" - cat $dom > /dev/null - local num=$(get_mdc_stats $mdtidx ost_read) - local ra=$(get_mdc_stats $mdtidx req_active) - local rw=$(get_mdc_stats $mdtidx req_waittime) - - [ -z $num ] || error "$num READ RPC occured" - # Reply buffer can be adjusted for larger buffer by resend - echo "... DONE with $((ra - rw)) resends" - - # compare content - cmp $tmp $dom || error "file miscompare" - - return 0 -} -run_test 271e "DoM: read on open (30K file with reply buffer adjusting)" - test_271f() { [ $MDS1_VERSION -lt $(version_code 2.10.57) ] && skip "Need MDS version at least 2.10.57" @@ -17593,6 +18111,26 @@ test_271f() { } run_test 271f "DoM: read on open (200K file and read tail)" +test_271g() { + [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] || + skip "Skipping due to old client or server version" + + $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile + # to get layout + $CHECKSTAT -t file $DIR1/$tfile + + $MULTIOP $DIR1/$tfile Ow40960_w4096c & + MULTIOP_PID=$! + sleep 1 + #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE + $LCTL set_param fail_loc=0x80000314 + rm $DIR1/$tfile || error "Unlink fails" + RC=$? + kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure" + [ $RC -eq 0 ] || error "Failed write to stale object" +} +run_test 271g "Discard DoM data vs client flush race" + test_272a() { [ $MDS1_VERSION -lt $(version_code 2.11.50) ] && skip "Need MDS version at least 2.11.50" @@ -18068,11 +18606,12 @@ test_300_check_default_striped_dir() for dir in $(find $DIR/$tdir/$dirname/*); do stripe_count=$($LFS getdirstripe -c $dir) [ $stripe_count -eq $default_count ] || - [ $stripe_count -eq 0 -o $default_count -eq 1 ] || + [ $stripe_count -eq 0 ] || [ $default_count -eq 1 ] || error "stripe count $default_count != $stripe_count for $dir" stripe_index=$($LFS getdirstripe -i $dir) - [ $default_index -eq -1 -o $stripe_index -eq $default_index ] || + [ $default_index -eq -1 ] || + [ $stripe_index -eq $default_index ] || error "$stripe_index != $default_index for $dir" #check default stripe @@ -18404,13 +18943,13 @@ test_300o() { numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree) numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree) - if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then + if [ $numfree1 -lt 66000 ] || [ $numfree2 -lt 66000 ]; then skip "not enough free inodes $numfree1 $numfree2" fi numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree) numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree) - if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then + if [ $numfree1 -lt 300000 ] || [ $numfree2 -lt 300000 ]; then skip "not enough free space $numfree1 $numfree2" fi @@ -19185,9 +19724,10 @@ run_test 404 "validate manual {de}activated works properly for OSPs" test_405() { [ -n "$FILESET" ] && skip "Not functional for FILESET set" - [ $MDS1_VERSION -lt $(version_code 2.6.92) -o \ - [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] && - skip "Layout swap lock is not supported" + [ $MDS1_VERSION -lt $(version_code 2.6.92) ] || + [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] && + skip "Layout swap lock is not supported" + check_swap_layouts_support test_mkdir $DIR/$tdir @@ -19416,7 +19956,7 @@ test_412() { } run_test 412 "mkdir on specific MDTs" -test_413() { +test_413a() { [ $MDSCOUNT -lt 2 ] && skip "We need at least 2 MDTs for this test" @@ -19450,7 +19990,129 @@ test_413() { error "don't expect $max" done } -run_test 413 "mkdir on less full MDTs" +run_test 413a "mkdir on less full MDTs" + +test_413b() { + [ $MDSCOUNT -lt 2 ] && + skip "We need at least 2 MDTs for this test" + + [ $MDS1_VERSION -lt $(version_code 2.12.52) ] && + skip "Need server version at least 2.12.52" + + mkdir $DIR/$tdir || error "mkdir failed" + $LFS setdirstripe -D -i -1 -H space $DIR/$tdir || + error "setdirstripe failed" + + local qos_prio_free + local qos_threshold_rr + local count + + qos_prio_free=$($LCTL get_param -n lmv.*.qos_prio_free | head -n1) + qos_prio_free=${qos_prio_free%%%} + qos_threshold_rr=$($LCTL get_param -n lmv.*.qos_threshold_rr | head -n1) + qos_threshold_rr=${qos_threshold_rr%%%} + + stack_trap "$LCTL set_param lmv.*.qos_prio_free=$qos_prio_free" EXIT + stack_trap "$LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr" \ + EXIT + + echo "mkdir with roundrobin" + + $LCTL set_param lmv.*.qos_threshold_rr=100 + for i in $(seq $((100 * MDSCOUNT))); do + mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed" + done + for i in $(seq $MDSCOUNT); do + count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ | + wc -w) + echo "$count directories created on MDT$((i - 1))" + [ $count -eq 100 ] || error "subdirs are not evenly distributed" + done + + rm -rf $DIR/$tdir/* + + $LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr + + local ffree + local max + local min + local max_index + local min_index + + ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-[^M]*.filesfree | uniq)) + echo "MDT filesfree available: ${ffree[@]}" + max=${ffree[0]} + min=${ffree[0]} + max_index=0 + min_index=0 + for ((i = 0; i < ${#ffree[@]}; i++)); do + if [[ ${ffree[i]} -gt $max ]]; then + max=${ffree[i]} + max_index=$i + fi + if [[ ${ffree[i]} -lt $min ]]; then + min=${ffree[i]} + min_index=$i + fi + done + echo "Min free files: MDT$min_index: $min" + echo "Max free files: MDT$max_index: $max" + + [ $min -eq 0 ] && skip "no free files in MDT$min_index" + [ $min -gt 10000000 ] && skip "too much free files in MDT$min_index" + + # Check if we need to generate uneven MDTs + test_mkdir -i $min_index -c 1 -p $DIR/$tdir-MDT$min_index + local threshold=10 + local diff=$((max - min)) + local diff2=$((diff * 100 / min)) + + echo -n "Check for uneven MDTs: " + echo -n "diff=$diff files ($diff2%) must be > $threshold% ..." + + if [ $diff2 -gt $threshold ]; then + echo "ok" + echo "Don't need to fill MDT$min_index" + else + # generate uneven MDTs, create till 25% diff + echo "no" + diff2=$((threshold - diff2)) + diff=$((min * diff2 / 100)) + # 50 sec per 10000 files in vm + [ $diff -gt 40000 ] && [ "$SLOW" = "no" ] && + skip "$diff files to create" + echo "Fill $diff2% diff in MDT$min_index with $diff files" + local i + local value="$(generate_string 1024)" + for i in $(seq $diff); do + $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE \ + $DIR/$tdir-MDT$min_index/f$i > /dev/null || + error "create f$i failed" + setfattr -n user.413b -v $value \ + $DIR/$tdir-MDT$min_index/f$i || + error "setfattr f$i failed" + done + fi + + min=$((100 *MDSCOUNT)) + max=0 + + echo "mkdir with balanced space usage" + $LCTL set_param lmv.*.qos_prio_free=100 + for i in $(seq $((100 * MDSCOUNT))); do + mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed" + done + for i in $(seq $MDSCOUNT); do + count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ | + wc -w) + echo "$count directories created on MDT$((i - 1))" + [ $min -gt $count ] && min=$count + [ $max -lt $count ] && max=$count + done + [ $((max - min)) -gt $MDSCOUNT ] || + error "subdirs shouldn't be evenly distributed" +} +run_test 413b "mkdir with balanced space usage" test_414() { #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521 @@ -19638,6 +20300,51 @@ test_418() { } run_test 418 "df and lfs df outputs match" +test_419() +{ + local dir=$DIR/$tdir + + mkdir -p $dir + touch $dir/file + + cancel_lru_locks mdc + + #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410 + $LCTL set_param fail_loc=0x1410 + cat $dir/file + $LCTL set_param fail_loc=0 + rm -rf $dir +} +run_test 419 "Verify open file by name doesn't crash kernel" + +test_420() +{ + [[ $MDS1_VERSION -ge $(version_code 2.12.53) ]] || + skip "Need MDS version at least 2.12.53" + + local SAVE_UMASK=$(umask) + local dir=$DIR/$tdir + local uname=$(getent passwd $RUNAS_ID | cut -d: -f1) + + mkdir -p $dir + umask 0000 + mkdir -m03777 $dir/testdir + ls -dn $dir/testdir + local dirperms=$(ls -dn $dir/testdir | awk '{print $1}') + [ $dirperms == "drwxrwsrwt" ] || + error "incorrect perms on $dir/testdir" + + $PDSH ${uname}@localhost "PATH=$LUSTRE/tests:\$PATH; \ + openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile" + ls -n $dir/testdir/testfile + local fileperms=$(ls -n $dir/testdir/testfile | awk '{print $1}') + [ $fileperms == "-rwxr-xr-x" ] || + error "incorrect perms on $dir/testdir/testfile" + + umask $SAVE_UMASK +} +run_test 420 "clear SGID bit on non-directories for non-members" + prep_801() { [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] && @@ -19819,7 +20526,7 @@ test_801c() { do_facet mgs $LCTL barrier_freeze $FSNAME 30 local b_status=$(barrier_stat) - [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || { + [ "$b_status" = "'expired'" ] || [ "$b_status" = "'failed'" ] || { do_facet mgs $LCTL barrier_thaw $FSNAME error "(2) unexpected barrier status $b_status" } @@ -20391,6 +21098,8 @@ run_test 811 "orphan name stub can be cleaned up in startup" test_812() { [ $OST1_VERSION -lt $(version_code 2.12.51) ] && skip "OST < 2.12.51 doesn't support this fail_loc" + [ "$SHARED_KEY" = true ] && + skip "OSC connections never go IDLE with Shared-Keys enabled" $LFS setstripe -c 1 -i 0 $DIR/$tfile # ensure ost1 is connected @@ -20580,6 +21289,15 @@ test_813() { } run_test 813 "File heat verfication" +test_814() +{ + dd of=$DIR/$tfile seek=128 bs=1k < /dev/null + echo -n y >> $DIR/$tfile + cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed" + diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same" +} +run_test 814 "sparse cp works as expected (LU-12361)" + # # tests that do cleanup/setup should be run at the end #