Whamcloud - gitweb
LU-5473 tests: sanity/51b Account for ZFS inode size
[fs/lustre-release.git] / lustre / tests / sanity.sh
index dab737d..5a26c77 100755 (executable)
@@ -79,10 +79,10 @@ init_logging
 [ "$SLOW" = "no" ] && EXCEPT_SLOW="24D 27m 64b 68 71 115 300o"
 
 if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
-       # bug number for skipped test: LU-4536 LU-1957 LU-2805
-       ALWAYS_EXCEPT="$ALWAYS_EXCEPT  65ic    180     184c"
-       #                                               4   13    (min)"
-       [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba"
+       # bug number for skipped test: LU-4536 LU-1957
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT  65ic    180"
+       #                                               13    (min)"
+       [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
 fi
 
 FAIL_ON_ERROR=false
@@ -4097,6 +4097,12 @@ test_51a() {     # was test_51
 }
 run_test 51a "special situations: split htree with empty entry =="
 
+cleanup_print_lfs_df () {
+       trap 0
+       $LFS df
+       $LFS df -i
+}
+
 test_51b() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        local dir=$DIR/$tdir
@@ -4118,10 +4124,12 @@ test_51b() {
 
        # need to check free space for the directories as well
        local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
-       numfree=$((blkfree / 4))
+       numfree=$(( blkfree / $(fs_inode_ksize) ))
        [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)" &&
                return
 
+       trap cleanup_print_lfsdf EXIT
+
        # create files
        createmany -d $dir/d $nrdirs ||
                error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
@@ -4133,6 +4141,9 @@ test_51b() {
        local left=100
        local delete=$((nrdirs - left))
 
+       $LFS df
+       $LFS df -i
+
        # for ldiskfs the nlink count should be 1, but this is OSD specific
        # and so this is listed for informational purposes only
        echo "nlink before: $(stat -c %h $dir), created before: $nrdirs"
@@ -4151,6 +4162,8 @@ test_51b() {
        local after=$(stat -c %h $dir)
        [[ $after -gt 2 ]] && error "nlink after: $after > 2" ||
                echo "nlink after: $after"
+
+       cleanup_print_lfs_df
 }
 run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
 
@@ -4459,6 +4472,26 @@ test_56a() {     # was test_56
 }
 run_test 56a "check $GETSTRIPE"
 
+test_56b() {
+       test_mkdir $DIR/$tdir
+       NUMDIRS=3
+       for i in $(seq 1 $NUMDIRS); do
+               test_mkdir $DIR/$tdir/dir$i
+       done
+
+       # test lfs getdirstripe default mode is non-recursion, which is
+       # different from lfs getstripe
+       dircnt=$($LFS getdirstripe $DIR/$tdir | grep -c lmv_stripe_count)
+       [[ $dircnt -eq 1 ]] ||
+               error "$LFS getdirstripe: found $dircnt, not 1"
+       dircnt=$($LFS getdirstripe --recursive $DIR/$tdir |
+               grep -c lmv_stripe_count)
+       [[ $dircnt -eq $((NUMDIRS + 1)) ]] ||
+               error "$LFS getdirstripe --recursive: found $dircnt, \
+                       not $((NUMDIRS + 1))"
+}
+run_test 56b "check $LFS getdirstripe"
+
 NUMFILES=3
 NUMDIRS=3
 setup_56() {
@@ -5640,6 +5673,12 @@ test_65l() { # bug 12836
 }
 run_test 65l "lfs find on -1 stripe dir ========================"
 
+test_65m() {
+       $RUNAS $SETSTRIPE -c 2 $MOUNT && error "setstripe should fail"
+       true
+}
+run_test 65m "normal user can't set filesystem default stripe"
+
 # bug 2543 - update blocks count on client
 test_66() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
@@ -6129,6 +6168,11 @@ run_test 77j "client only supporting ADLER32"
 rm -f $F77_TMP
 unset F77_TMP
 
+cleanup_test_78() {
+       trap 0
+       rm -f $DIR/$tfile
+}
+
 test_78() { # bug 10901
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        remote_ost || { skip_env "local OST" && return; }
@@ -6158,6 +6202,8 @@ test_78() { # bug 10901
        [[ $SMALLESTOST -lt 10240 ]] &&
                skip "too small OSTSIZE, useless to run large O_DIRECT test" && return 0
 
+       trap cleanup_test_78 EXIT
+
        [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
                F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
 
@@ -6170,7 +6216,7 @@ test_78() { # bug 10901
                $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
        done
 
-       rm -f $DIR/$tfile
+       cleanup_test_78
 }
 run_test 78 "handle large O_DIRECT writes correctly ============"
 
@@ -7270,6 +7316,15 @@ test_103a() {
        run_acl_subtest misc || error  "misc test failed"
        echo "performing permissions..."
        run_acl_subtest permissions || error "permissions failed"
+       # LU-1482 mdd: Setting xattr are properly checked with and without ACLs
+       if [ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.8.55) -o \
+            \( $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6) -a \
+            $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.29) \) ]
+       then
+               echo "performing permissions xattr..."
+               run_acl_subtest permissions_xattr ||
+                       error "permissions_xattr failed"
+       fi
        echo "performing setfacl..."
        run_acl_subtest setfacl || error  "setfacl test failed"
 
@@ -8888,9 +8943,9 @@ test_129() {
                return
        fi
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
-       ENOSPC=28
-       EFBIG=27
-       has_warning=0
+       local ENOSPC=28
+       local EFBIG=27
+       local has_warning=0
 
        rm -rf $DIR/$tdir
        mkdir -p $DIR/$tdir
@@ -8922,7 +8977,7 @@ test_129() {
                        check_mds_dmesg '"has reached"' ||
                                error_exit "has reached message should be output"
 
-                       [ $has_warning ] ||
+                       [ $has_warning -eq 0 ] &&
                                error_exit "warning message should be output"
 
                        I=$(stat -c%s "$DIR/$tdir")
@@ -10390,67 +10445,114 @@ test_155_big_load() {
     true
 }
 
+save_writethrough() {
+       local facets=$(get_facets OST)
+
+       save_lustre_params $facets "obdfilter.*.writethrough_cache_enable" > $1
+       save_lustre_params $facets "osd-*.*.writethrough_cache_enable" >> $1
+}
+
 test_155a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+
        set_cache read on
        set_cache writethrough on
        test_155_small_load
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 155a "Verify small file correctness: read cache:on write_cache:on"
 
 test_155b() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+
        set_cache read on
        set_cache writethrough off
        test_155_small_load
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 155b "Verify small file correctness: read cache:on write_cache:off"
 
 test_155c() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+
        set_cache read off
        set_cache writethrough on
        test_155_small_load
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 155c "Verify small file correctness: read cache:off write_cache:on"
 
 test_155d() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+
        set_cache read off
        set_cache writethrough off
        test_155_small_load
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 155d "Verify small file correctness: read cache:off write_cache:off"
 
 test_155e() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+
        set_cache read on
        set_cache writethrough on
        test_155_big_load
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 155e "Verify big file correctness: read cache:on write_cache:on"
 
 test_155f() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+
        set_cache read on
        set_cache writethrough off
        test_155_big_load
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 155f "Verify big file correctness: read cache:on write_cache:off"
 
 test_155g() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+
        set_cache read off
        set_cache writethrough on
        test_155_big_load
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 155g "Verify big file correctness: read cache:off write_cache:on"
 
 test_155h() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+
        set_cache read off
        set_cache writethrough off
        test_155_big_load
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 155h "Verify big file correctness: read cache:off write_cache:off"
 
@@ -10461,12 +10563,14 @@ test_156() {
        local BEFORE
        local AFTER
        local file="$DIR/$tfile"
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
 
        [ "$(facet_fstype ost1)" = "zfs" -a \
           $(lustre_version_code ost1 -lt $(version_code 2.6.93)) ] &&
                skip "LU-1956/LU-2261: stats not implemented on OSD ZFS" &&
                return
 
+       save_writethrough $p
        roc_hit_init
 
        log "Turn on read and write cache"
@@ -10595,10 +10699,18 @@ test_156() {
        fi
 
        rm -f $file
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 156 "Verification of tunables"
 
 #Changelogs
+cleanup_changelog () {
+       trap 0
+       echo "Deregistering changelog client $CL_USER"
+       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $CL_USER
+}
+
 err17935 () {
        if [[ $MDSCOUNT -gt 1 ]]; then
                error_ignore bz17935 $*
@@ -10639,10 +10751,12 @@ test_160a() {
 
        local CL_USERS="mdd.$MDT0.changelog_users"
        local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
-       USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
-       echo "Registered as changelog user $USER"
-       $GET_CL_USERS | grep -q $USER ||
-               error "User $USER not found in changelog_users"
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       echo "Registered as changelog user $CL_USER"
+       trap cleanup_changelog EXIT
+       $GET_CL_USERS | grep -q $CL_USER ||
+               error "User $CL_USER not found in changelog_users"
 
        # change something
        test_mkdir -p $DIR/$tdir/pics/2008/zachy
@@ -10686,9 +10800,9 @@ test_160a() {
        [ "$fidc" == "$fidf" ] ||
                err17935 "pfid in changelog $fidc != dir fid $fidf"
 
-       USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
-       $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5))
-       USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
+       USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+       $LFS changelog_clear $MDT0 $CL_USER $(($USER_REC1 + 5))
+       USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
        echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2"
        [ $USER_REC2 == $(($USER_REC1 + 5)) ] ||
                err17935 "user index expected $(($USER_REC1 + 5)) is $USER_REC2"
@@ -10703,7 +10817,7 @@ test_160a() {
        # LU-3446 changelog index reset on MDT restart
        local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
        CUR_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        stop $SINGLEMDS || error "Fail to stop MDT."
        start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
        CUR_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
@@ -10712,19 +10826,19 @@ test_160a() {
                err17935 "current index should be $CUR_REC1 is $CUR_REC2"
 
        echo "verifying user deregister"
-       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
-       $GET_CL_USERS | grep -q $USER &&
-               error "User $USER still in changelog_users"
+       cleanup_changelog
+       $GET_CL_USERS | grep -q $CL_USER &&
+               error "User $CL_USER still in changelog_users"
 
        USERS=$(( $($GET_CL_USERS | wc -l) - 2 ))
-       if [ $USERS -eq 0 ]; then
+       if [ $CL_USER -eq 0 ]; then
                LAST_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
                touch $DIR/$tdir/chloe
                LAST_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
                echo "verify changelogs are off: $LAST_REC1 == $LAST_REC2"
                [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
        else
-               echo "$USERS other changelog users; can't verify off"
+               echo "$CL_USER other changelog users; can't verify off"
        fi
 }
 run_test 160a "changelog sanity"
@@ -10737,10 +10851,12 @@ test_160b() { # LU-3587
 
        local CL_USERS="mdd.$MDT0.changelog_users"
        local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
-       USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
-       echo "Registered as changelog user $USER"
-       $GET_CL_USERS | grep -q $USER ||
-               error "User $USER not found in changelog_users"
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       echo "Registered as changelog user $CL_USER"
+       trap cleanup_changelog EXIT
+       $GET_CL_USERS | grep -q $CL_USER ||
+               error "User $CL_USER not found in changelog_users"
 
        local LONGNAME1=$(str_repeat a 255)
        local LONGNAME2=$(str_repeat b 255)
@@ -10752,11 +10868,8 @@ test_160b() { # LU-3587
        mv $LONGNAME1 $LONGNAME2
 
        $LFS changelog $MDT0 | grep RENME
-
-       echo "deregistering $USER"
-       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
-
        rm -f $LONGNAME2
+       cleanup_changelog
 }
 run_test 160b "Verify that very long rename doesn't crash in changelog"
 
@@ -10773,8 +10886,9 @@ test_160c() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
 
        # Registration step
-       local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
                changelog_register -n)
+       trap cleanup_changelog EXIT
 
        rm -rf $DIR/$tdir
        mkdir -p $DIR/$tdir
@@ -10786,11 +10900,10 @@ test_160c() {
        $LFS changelog $MDT0
        TRUNCS=$($LFS changelog $MDT0 | tail -5 | grep -c "TRUNC")
        [ $TRUNCS -eq 1 ] || err17935 "TRUNC changelog mask count $TRUNCS != 1"
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
 
        # Deregistration step
-       echo "deregistering $USER"
-       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+       cleanup_changelog
 }
 run_test 160c "verify that changelog log catch the truncate event"
 
@@ -10806,21 +10919,22 @@ test_160d() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
 
        # Registration step
-       local USER=$(do_facet mds1 $LCTL --device $MDT0 \
+       CL_USER=$(do_facet mds1 $LCTL --device $MDT0 \
                changelog_register -n)
 
+       trap cleanup_changelog EXIT
        mkdir -p $DIR/$tdir/migrate_dir
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
 
        $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
        $LFS changelog $MDT0
        MIGRATES=$($LFS changelog $MDT0 | tail -5 | grep -c "MIGRT")
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        [ $MIGRATES -eq 1 ] ||
                error "MIGRATE changelog mask count $MIGRATES != 1"
 
        # Deregistration step
-       do_facet mds1 $LCTL --device $MDT0 changelog_deregister $USER
+       cleanup_changelog
 }
 run_test 160d "verify that changelog log catch the migrate event"
 
@@ -10927,8 +11041,10 @@ test_161c() {
 
        # define CLF_RENAME_LAST 0x0001
        # rename overwrite a target having nlink = 1 (changelog flag 0x1)
-       local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
                changelog_register -n)
+
+       trap cleanup_changelog EXIT
        rm -rf $DIR/$tdir
        mkdir -p $DIR/$tdir
        touch $DIR/$tdir/foo_161c
@@ -10937,10 +11053,8 @@ test_161c() {
        $LFS changelog $MDT0 | grep RENME
        local flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | \
                cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x1" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x1"
        fi
        echo "rename overwrite a target having nlink = 1," \
@@ -10953,10 +11067,8 @@ test_161c() {
        mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
        $LFS changelog $MDT0 | grep RENME
        flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x0" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x0"
        fi
        echo "rename overwrite a target having nlink > 1," \
@@ -10967,10 +11079,8 @@ test_161c() {
        mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
        $LFS changelog $MDT0 | grep RENME
        flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x0" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x0"
        fi
        echo "rename doesn't overwrite a target," \
@@ -10981,10 +11091,8 @@ test_161c() {
        rm -f $DIR/$tdir/foo2_161c
        $LFS changelog $MDT0 | grep UNLNK
        flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x1" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x1"
        fi
        echo "unlink a file having nlink = 1," \
@@ -10995,15 +11103,13 @@ test_161c() {
        rm -f $DIR/$tdir/foobar_161c
        $LFS changelog $MDT0 | grep UNLNK
        flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
-       $LFS changelog_clear $MDT0 $USER 0
+       $LFS changelog_clear $MDT0 $CL_USER 0
        if [ x$flags != "x0x0" ]; then
-               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
-                       $USER
                error "flag $flags is not 0x0"
        fi
        echo "unlink a file having nlink > 1," \
                "changelog record has flags of $flags"
-       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+       cleanup_changelog
 }
 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
 
@@ -11925,10 +12031,11 @@ jobstats_set() {
 }
 
 cleanup_205() {
+       trap 0
        do_facet $SINGLEMDS \
                $LCTL set_param mdt.*.job_cleanup_interval=$OLD_INTERVAL
        [ $OLD_JOBENV != $JOBENV ] && jobstats_set $OLD_JOBENV
-       do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $CL_USER
+       cleanup_changelog
 }
 
 test_205() { # Job stats
@@ -12546,6 +12653,11 @@ run_test 224b "Don't panic on bulk IO failure"
 test_224c() { # LU-6441
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
+       local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_writethrough $p
+       set_cache writethrough on
+
        local pages_per_rpc=$($LCTL get_param \
                                osc.*.max_pages_per_rpc)
        local at_max=$($LCTL get_param -n at_max)
@@ -12563,10 +12675,11 @@ test_224c() { # LU-6441
                error "conf_param timeout=5 failed"
 
        #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3   0x520
-       $LCTL set_param fail_loc=0x520
+       do_facet ost1 $LCTL set_param fail_loc=0x520
+       $LFS setstripe -c 1 -i 0 $DIR/$tfile
        dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
        sync
-       $LCTL set_param fail_loc=0
+       do_facet ost1 $LCTL set_param fail_loc=0
 
        set_conf_param_and_check client "$test_at" "$param_at" $at_max ||
                error "conf_param at_max=$at_max failed"
@@ -12574,6 +12687,8 @@ test_224c() { # LU-6441
                $timeout || error "conf_param timeout=$timeout failed"
 
        $LCTL set_param -n $pages_per_rpc
+       restore_lustre_params < $p
+       rm -f $p
 }
 run_test 224c "Don't hang if one of md lost during large bulk RPC"
 
@@ -13767,18 +13882,9 @@ test_247e() {
 run_test 247e "mount .. as fileset"
 
 test_248() {
-       local my_error=error
-
        local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
        [ -z "$fast_read_sav" ] && skip "no fast read support" && return
 
-       # This test case is time sensitive and Maloo uses KVM to run autotest.
-       # Therefore the complete time of I/O task is unreliable and depends on
-       # the workload on the host machine when the task is running.
-       local virt=$(running_in_vm)
-       [ -n "$virt" ] && echo "running in VM '$virt', ignore error" &&
-                 my_error="error_ignore env=$virt"
-
        # create a large file for fast read verification
        dd if=/dev/zero of=$DIR/$tfile bs=1M count=128 > /dev/null 2>&1
 
@@ -13800,7 +13906,8 @@ test_248() {
 
        # verify that fast read is 4 times faster for cache read
        [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
-               $my_error "fast read was not 4 times faster: $t_fast vs $t_slow"
+               error_not_in_vm "fast read was not 4 times faster: " \
+                          "$t_fast vs $t_slow"
 
        echo "Test 2: verify the performance between big and small read"
        $LCTL set_param -n llite.*.fast_read=1
@@ -13817,7 +13924,7 @@ test_248() {
 
        # verify that big IO is not 4 times faster than small IO
        [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
-               $my_error "bigger IO is way too fast: $t_1k vs $t_1m"
+               error_not_in_vm "bigger IO is way too fast: $t_1k vs $t_1m"
 
        $LCTL set_param -n llite.*.fast_read=$fast_read_sav
        rm -f $DIR/$tfile
@@ -13962,6 +14069,241 @@ test_254() {
 }
 run_test 254 "Check changelog size"
 
+ladvise_no_type()
+{
+       local type=$1
+       local file=$2
+
+       lfs ladvise -a invalid $file 2>&1 | grep "Valid types" |
+               awk -F: '{print $2}' | grep $type > /dev/null
+       if [ $? -ne 0 ]; then
+               return 0
+       fi
+       return 1
+}
+
+ladvise_no_ioctl()
+{
+       local file=$1
+
+       lfs ladvise -a willread $file > /dev/null 2>&1
+       if [ $? -eq 0 ]; then
+               return 1
+       fi
+
+       lfs ladvise -a willread $file 2>&1 |
+               grep "Inappropriate ioctl for device" > /dev/null
+       if [ $? -eq 0 ]; then
+               return 0
+       fi
+       return 1
+}
+
+ladvise_willread_performance()
+{
+       local repeat=10
+       local average_cache=0
+       local average_ladvise=0
+
+       for ((i = 1; i <= $repeat; i++)); do
+               echo "Iter $i/$repeat: reading without willread hint"
+               cancel_lru_locks osc
+               do_nodes $(comma_list $(osts_nodes)) \
+                       "echo 3 > /proc/sys/vm/drop_caches"
+               local speed_origin=$($READS -f $DIR/$tfile -s $size \
+                       -b 4096 -n $((size / 4096)) -t 60 |
+                       sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##')
+
+               echo "Iter $i/$repeat: Reading again without willread hint"
+               cancel_lru_locks osc
+               local speed_cache=$($READS -f $DIR/$tfile -s $size \
+                       -b 4096 -n $((size / 4096)) -t 60 |
+                       sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##')
+
+               echo "Iter $i/$repeat: reading with willread hint"
+               cancel_lru_locks osc
+               do_nodes $(comma_list $(osts_nodes)) \
+                       "echo 3 > /proc/sys/vm/drop_caches"
+               lfs ladvise -a willread $DIR/$tfile ||
+                       error "Ladvise failed"
+               local speed_ladvise=$($READS -f $DIR/$tfile -s $size \
+                       -b 4096 -n $((size / 4096)) -t 60 |
+                       sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##')
+
+               local cache_speedup=$(echo "scale=2; \
+                       ($speed_cache-$speed_origin)/$speed_origin*100" | bc)
+               cache_speedup=$(echo ${cache_speedup%.*})
+               echo "Iter $i/$repeat: cache speedup: $cache_speedup%"
+               average_cache=$((average_cache + cache_speedup))
+
+               local ladvise_speedup=$(echo "scale=2; \
+                       ($speed_ladvise-$speed_origin)/$speed_origin*100" | bc)
+               ladvise_speedup=$(echo ${ladvise_speedup%.*})
+               echo "Iter $i/$repeat: ladvise speedup: $ladvise_speedup%"
+               average_ladvise=$((average_ladvise + ladvise_speedup))
+       done
+       average_cache=$((average_cache / repeat))
+       average_ladvise=$((average_ladvise / repeat))
+
+       if [ $average_cache -lt 20 ]; then
+               echo "Speedup with cache is less than 20% ($average_cache%),"\
+                       "skipping check of speedup with willread:"\
+                       "$average_ladvise%"
+               return 0
+       fi
+
+       local lowest_speedup=$((average_cache / 2))
+       [ $average_ladvise -gt $lowest_speedup ] ||
+               error_not_in_vm "Speedup with willread is less than " \
+                          "$lowest_speedup%, got $average_ladvise%"
+       echo "Speedup with willread ladvise: $average_ladvise%"
+       echo "Speedup with cache: $average_cache%"
+}
+
+test_255a() {
+       lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
+
+       ladvise_no_type willread $DIR/$tfile &&
+               skip "willread ladvise is not supported" && return
+
+       ladvise_no_ioctl $DIR/$tfile &&
+               skip "ladvise ioctl is not supported" && return
+
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.54) ] &&
+               skip "lustre < 2.8.54 does not support ladvise " && return
+
+       local size_mb=100
+       local size=$((size_mb * 1048576))
+       dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
+               error "dd to $DIR/$tfile failed"
+
+       lfs ladvise -a willread $DIR/$tfile ||
+               error "Ladvise failed with no range argument"
+
+       lfs ladvise -a willread -s 0 $DIR/$tfile ||
+               error "Ladvise failed with no -l or -e argument"
+
+       lfs ladvise -a willread -e 1 $DIR/$tfile ||
+               error "Ladvise failed with only -e argument"
+
+       lfs ladvise -a willread -l 1 $DIR/$tfile ||
+               error "Ladvise failed with only -l argument"
+
+       lfs ladvise -a willread -s 2 -e 1 $DIR/$tfile &&
+               error "End offset should not be smaller than start offset"
+
+       lfs ladvise -a willread -s 2 -e 2 $DIR/$tfile &&
+               error "End offset should not be equal to start offset"
+
+       lfs ladvise -a willread -s $size -l 1 $DIR/$tfile ||
+               error "Ladvise failed with overflowing -s argument"
+
+       lfs ladvise -a willread -s 1 -e $((size + 1)) $DIR/$tfile ||
+               error "Ladvise failed with overflowing -e argument"
+
+       lfs ladvise -a willread -s 1 -l $size $DIR/$tfile ||
+               error "Ladvise failed with overflowing -l argument"
+
+       lfs ladvise -a willread -l 1 -e 2 $DIR/$tfile &&
+               error "Ladvise succeeded with conflicting -l and -e arguments"
+
+       echo "Synchronous ladvise should wait"
+       local delay=4
+#define OBD_FAIL_OST_LADVISE_PAUSE      0x237
+       do_nodes $(comma_list $(osts_nodes)) \
+               $LCTL set_param fail_val=$delay fail_loc=0x237
+
+       local start_ts=$SECONDS
+       lfs ladvise -a willread $DIR/$tfile ||
+               error "Ladvise failed with no range argument"
+       local end_ts=$SECONDS
+       local inteval_ts=$((end_ts - start_ts))
+
+       if [ $inteval_ts -lt $(($delay - 1)) ]; then
+               error "Synchronous advice didn't wait reply"
+       fi
+
+       echo "Asynchronous ladvise shouldn't wait"
+       local start_ts=$SECONDS
+       lfs ladvise -a willread -b $DIR/$tfile ||
+               error "Ladvise failed with no range argument"
+       local end_ts=$SECONDS
+       local inteval_ts=$((end_ts - start_ts))
+
+       if [ $inteval_ts -gt $(($delay / 2)) ]; then
+               error "Asynchronous advice blocked"
+       fi
+
+       do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0
+       ladvise_willread_performance
+}
+run_test 255a "check 'lfs ladvise -a willread'"
+
+facet_meminfo() {
+       local facet=$1
+       local info=$2
+
+       do_facet $facet "cat /proc/meminfo | grep ^${info}:" | awk '{print $2}'
+}
+
+test_255b() {
+       lfs setstripe -c -1 -i 0 $DIR/$tfile
+
+       ladvise_no_type dontneed $DIR/$tfile &&
+               skip "dontneed ladvise is not supported" && return
+
+       ladvise_no_ioctl $DIR/$tfile &&
+               skip "ladvise ioctl is not supported" && return
+
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.54) ] &&
+               skip "lustre < 2.8.54 does not support ladvise" && return
+
+       [ "$(facet_fstype ost1)" = "zfs" ] &&
+               skip "zfs-osd does not support dontneed advice" && return
+
+       local size_mb=100
+       local size=$((size_mb * 1048576))
+       # In order to prevent disturbance of other processes, only check 3/4
+       # of the memory usage
+       local kibibytes=$((size_mb * 1024 * 3 / 4))
+
+       dd if=/dev/zero of=$DIR/$tfile bs=1048576 count=$size_mb ||
+               error "dd to $DIR/$tfile failed"
+
+       local total=$(facet_meminfo ost1 MemTotal)
+       echo "Total memory: $total KiB"
+
+       do_facet ost1 "sync && echo 3 > /proc/sys/vm/drop_caches"
+       local before_read=$(facet_meminfo ost1 Cached)
+       echo "Cache used before read: $before_read KiB"
+
+       lfs ladvise -a willread $DIR/$tfile ||
+               error "Ladvise willread failed"
+       local after_read=$(facet_meminfo ost1 Cached)
+       echo "Cache used after read: $after_read KiB"
+
+       lfs ladvise -a dontneed $DIR/$tfile ||
+               error "Ladvise dontneed again failed"
+       local no_read=$(facet_meminfo ost1 Cached)
+       echo "Cache used after dontneed ladvise: $no_read KiB"
+
+       if [ $total -lt $((before_read + kibibytes)) ]; then
+               echo "Memory is too small, abort checking"
+               return 0
+       fi
+
+       if [ $((before_read + kibibytes)) -gt $after_read ]; then
+               error "Ladvise willread should use more memory" \
+                       "than $kibibytes KiB"
+       fi
+
+       if [ $((no_read + kibibytes)) -gt $after_read ]; then
+               error "Ladvise dontneed should release more memory" \
+                       "than $kibibytes KiB"
+       fi
+}
+run_test 255b "check 'lfs ladvise -a dontneed'"
+
 test_256() {
        local cl_user
        local cat_sl
@@ -14026,6 +14368,29 @@ test_256() {
 }
 run_test 256 "Check llog delete for empty and not full state"
 
+test_257() {
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ]] &&
+               skip "Need MDS version at least 2.8.55" && return
+
+       test_mkdir -p $DIR/$tdir
+
+       setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
+               error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
+       stat $DIR/$tdir
+
+#define OBD_FAIL_MDS_XATTR_REP                 0x161
+       local mdtidx=$($LFS getstripe -M $DIR/$tdir)
+       local facet=mds$((mdtidx + 1))
+       set_nodes_failloc $(facet_active_host $facet) 0x80000161
+       getfattr -n trusted.name1 $DIR/$tdir 2> /dev/null
+
+       stop $facet || error "stop MDS failed"
+       start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS ||
+               error "start MDS fail"
+}
+run_test 257 "xattr locks are not lost"
+
 test_260() {
 #define OBD_FAIL_MDC_CLOSE               0x806
        $LCTL set_param fail_loc=0x80000806
@@ -14791,16 +15156,156 @@ test_311() {
        local new_iused
        for i in $(seq 120); do
                new_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
-               [ $new_iused -lt $((old_iused - 900)) ] && break
+               [ $((old_iused - new_iused)) -gt 800 ] && break
                sleep 1
        done
 
        echo "waited $i sec, old Iused $old_iused, new Iused $new_iused"
-       [ $new_iused -lt $((old_iused - 900)) ] ||
+       [ $((old_iused - new_iused)) -gt 800 ] ||
                error "objs not destroyed after unlink"
 }
 run_test 311 "disable OSP precreate, and unlink should destroy objs"
 
+zfs_oid_to_objid()
+{
+       local ost=$1
+       local objid=$2
+
+       local vdevdir=$(dirname $(facet_vdevice $ost))
+       local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
+       local zfs_zapid=$(do_facet $ost $cmd |
+                         grep -w "/O/0/d$((objid%32))" -C 5 |
+                         awk '/Object/{getline; print $1}')
+       local zfs_objid=$(do_facet $ost $cmd $zfs_zapid |
+                         awk "/$objid = /"'{printf $3}')
+
+       echo $zfs_objid
+}
+
+zfs_object_blksz() {
+       local ost=$1
+       local objid=$2
+
+       local vdevdir=$(dirname $(facet_vdevice $ost))
+       local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
+       local blksz=$(do_facet $ost $cmd $objid |
+                     awk '/dblk/{getline; printf $4}')
+
+       case "${blksz: -1}" in
+               k|K) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024)) ;;
+               m|M) blksz=$((${blksz:0:$((${#blksz} - 1))}*1024*1024)) ;;
+               *) ;;
+       esac
+
+       echo $blksz
+}
+
+test_312() { # LU-4856
+       [ $(facet_fstype ost1) = "zfs" ] ||
+               { skip "the test only applies to zfs" && return; }
+
+       local max_blksz=$(do_facet ost1 \
+                         $ZFS get -p recordsize $(facet_device ost1) |
+                         awk '!/VALUE/{print $3}')
+
+       # to make life a little bit easier
+       $LFS mkdir -c 1 -i 0 $DIR/$tdir
+       $LFS setstripe -c 1 -i 0 $DIR/$tdir
+
+       local tf=$DIR/$tdir/$tfile
+       touch $tf
+       local oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
+
+       # Get ZFS object id
+       local zfs_objid=$(zfs_oid_to_objid ost1 $oid)
+
+       # block size change by sequential over write
+       local blksz
+       for ((bs=4096; bs <= max_blksz; bs <<= 2)); do
+               dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
+
+               blksz=$(zfs_object_blksz ost1 $zfs_objid)
+               [ $blksz -eq $bs ] || error "blksz error: $blksz, expected: $bs"
+       done
+       rm -f $tf
+
+       # block size change by sequential append write
+       dd if=/dev/zero of=$tf bs=4K count=1 oflag=sync conv=notrunc
+       oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
+       zfs_objid=$(zfs_oid_to_objid ost1 $oid)
+
+       for ((count = 1; count < $((max_blksz / 4096)); count *= 2)); do
+               dd if=/dev/zero of=$tf bs=4K count=$count seek=$count \
+                       oflag=sync conv=notrunc
+
+               blksz=$(zfs_object_blksz ost1 $zfs_objid)
+               blksz=$((blksz / 8192)) # in 2*4K unit
+               [ $blksz -eq $count ] ||
+                       error "blksz error(in 8k): $blksz, expected: $count"
+       done
+       rm -f $tf
+
+       # random write
+       touch $tf
+       oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
+       zfs_objid=$(zfs_oid_to_objid ost1 $oid)
+
+       dd if=/dev/zero of=$tf bs=8K count=1 oflag=sync conv=notrunc
+       blksz=$(zfs_object_blksz ost1 $zfs_objid)
+       [ $blksz -eq 8192 ] || error "blksz error: $blksz, expected: 8k"
+
+       dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
+       blksz=$(zfs_object_blksz ost1 $zfs_objid)
+       [ $blksz -eq 65536 ] || error "blksz error: $blksz, expected: 64k"
+
+       dd if=/dev/zero of=$tf bs=1M count=1 oflag=sync conv=notrunc
+       blksz=$(zfs_object_blksz ost1 $zfs_objid)
+       [ $blksz -eq 65536 ] || error "rewrite error: $blksz, expected: 64k"
+}
+run_test 312 "make sure ZFS adjusts its block size by write pattern"
+
+test_399() { # LU-7655 for OST fake write
+       # turn off debug for performance testing
+       local saved_debug=$($LCTL get_param -n debug)
+       $LCTL set_param debug=0
+
+       $SETSTRIPE -c 1 -i 0 $DIR/$tfile
+
+       # get ost1 size - lustre-OST0000
+       local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
+       local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
+       [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
+
+       local start_time=$(date +%s.%N)
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=$blocks oflag=sync ||
+               error "real dd writing error"
+       local duration=$(bc <<< "$(date +%s.%N) - $start_time")
+       rm -f $DIR/$tfile
+
+       # define OBD_FAIL_OST_FAKE_WRITE        0x238
+       do_facet ost1 $LCTL set_param fail_loc=0x238
+
+       local start_time=$(date +%s.%N)
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=$blocks oflag=sync ||
+               error "fake dd writing error"
+       local duration_fake=$(bc <<< "$(date +%s.%N) - $start_time")
+
+       # verify file size
+       cancel_lru_locks osc
+       $CHECKSTAT -t file -s $((blocks * 1024 * 1024)) $DIR/$tfile ||
+               error "$tfile size not $blocks MB"
+
+       do_facet ost1 $LCTL set_param fail_loc=0
+
+       echo "fake write $duration_fake vs. normal write $duration in seconds"
+       [ $(bc <<< "$duration_fake < $duration") -eq 1 ] ||
+               error_not_in_vm "fake write is slower"
+
+       $LCTL set_param -n debug="$saved_debug"
+       rm -f $DIR/$tfile
+}
+run_test 399 "fake write should not be slower than normal write"
+
 test_400a() { # LU-1606, was conf-sanity test_74
        local extra_flags=''
        local out=$TMP/$tfile
@@ -15108,6 +15613,29 @@ test_406() {
 }
 run_test 406 "DNE support fs default striping"
 
+test_407() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ]] &&
+               skip "Need MDS version at least 2.8.55" && return
+
+       $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
+               error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
+       $LFS mkdir -i 1 -c 1 $DIR/$tdir.1 ||
+               error "$LFS mkdir -i 1 -c 1 $tdir.1 failed"
+       touch $DIR/$tdir.0/$tfile.0 || error "touch $tdir.0/$tfile.0 failed"
+
+       #define OBD_FAIL_DT_TXN_STOP    0x2019
+       for idx in $(seq $MDSCOUNT); do
+               do_facet mds$idx "lctl set_param fail_loc=0x2019"
+       done
+       $LFS mkdir -c 2 $DIR/$tdir && error "$LFS mkdir -c 2 $tdir should fail"
+       mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1/$tfile.1 &&
+               error "mv $tdir.0/$tfile.0 $tdir.1/$tfile.1 should fail"
+       true
+}
+run_test 407 "transaction fail should cause operation fail"
+
 #
 # tests that do cleanup/setup should be run at the end
 #