Whamcloud - gitweb
LU-11297 lnet: MR Routing Feature
[fs/lustre-release.git] / lustre / tests / sanity.sh
index e351eee..1b72d2a 100755 (executable)
@@ -1533,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 ||
@@ -2188,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
@@ -2224,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"
@@ -2252,6 +2495,9 @@ test_27D() {
        [ $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"
 
@@ -2405,6 +2651,182 @@ test_27I() {
 }
 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
@@ -6526,6 +6948,39 @@ test_60g() {
 }
 run_test 60g "transaction abort won't cause MDT hung"
 
+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"
 
@@ -6538,7 +6993,7 @@ test_61a() {
 run_test 61a "mmap() writes don't make sync hang ================"
 
 test_61b() {
-       mmap_mknod_test $tfile || error "mmap_mknod_test failed"
+       mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed"
 }
 run_test 61b "mmap() of unstriped file is successful"
 
@@ -6756,9 +7211,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
@@ -14583,8 +15038,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"
@@ -17037,7 +17492,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() {
@@ -17652,6 +18107,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"
@@ -19716,6 +20191,34 @@ test_419()
 }
 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) ]] &&
@@ -20469,6 +20972,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
@@ -20658,6 +21163,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
 #