Whamcloud - gitweb
LU-4198 clio: turn on lockless for some kind of IO
[fs/lustre-release.git] / lustre / tests / sanity.sh
old mode 100644 (file)
new mode 100755 (executable)
index 63a86c3..faa02a9
@@ -45,26 +45,38 @@ ALWAYS_EXCEPT+="               42a     42b     42c "
 ALWAYS_EXCEPT+=" 407     312 "
 
 if $SHARED_KEY; then
-       # bug number:    LU-9795 LU-9795 LU-9795 LU-9795 LU-12781
-       ALWAYS_EXCEPT+=" 17n     60a     133g    300f    272a"
+       # bug number:    LU-9795 LU-9795 LU-9795 LU-9795
+       ALWAYS_EXCEPT+=" 17n     60a     133g    300f"
 fi
 
 selinux_status=$(getenforce)
 if [ "$selinux_status" != "Disabled" ]; then
-       # bug number:    LU-12895 LU-12469 LU-12469
-       ALWAYS_EXCEPT+=" 185a     230b     230d"
+       # bug number:
+       ALWAYS_EXCEPT+=""
 fi
 
 # skip the grant tests for ARM until they are fixed
 if [[ $(uname -m) = aarch64 ]]; then
        # bug number:    LU-11596
        ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST"
-       # bug number:    LU-11671 LU-11667 LU-4398
-       ALWAYS_EXCEPT+=" 45       317      817"
+       # bug number:    LU-11671 LU-11667
+       ALWAYS_EXCEPT+=" 45       317"
+fi
+
+# skip nfs tests on kernels >= 4.14.0 until they are fixed
+if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then
+       # bug number:   LU-12661
+       ALWAYS_EXCEPT+=" 817"
+fi
+# skip cgroup tests on RHEL8.1 kernels until they are fixed
+if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
+      $LINUX_VERSION_CODE <  $(version_code 5.4.0) )); then
+       # bug number:   LU-13063
+       ALWAYS_EXCEPT+=" 411"
 fi
 
 #                                  5          12          (min)"
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
 
 if [ "$mds1_FSTYPE" = "zfs" ]; then
        # bug number for skipped test:
@@ -544,11 +556,6 @@ test_17g() {
        [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
                TESTS="4094 4095"
 
-       # skip long symlink name for rhel6.5.
-       # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
-       grep -q '6.5' /etc/redhat-release &>/dev/null &&
-               TESTS="59 60 61 4062 4063"
-
        for i in $TESTS; do
                local SYMNAME=$(str_repeat 'x' $i)
                ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
@@ -2635,7 +2642,7 @@ 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) ]] &&
+       [[ $MDS1_VERSION -le $(version_code 2.12.51) ]] &&
                skip "Need MDS version newer than 2.12.51"
 
        test_mkdir $DIR/$tdir
@@ -2730,7 +2737,7 @@ test_27J() {
 run_test 27J "basic ops on file with foreign LOV"
 
 test_27K() {
-       [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] &&
+       [[ $MDS1_VERSION -le $(version_code 2.12.49) ]] &&
                skip "Need MDS version newer than 2.12.49"
 
        test_mkdir $DIR/$tdir
@@ -4981,7 +4988,7 @@ test_49() { # LU-1030
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
        remote_ost_nodsh && skip "remote OST with nodsh"
 
-       # get ost1 size - lustre-OST0000
+       # get ost1 size - $FSNAME-OST0000
        ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
                awk '{ print $4 }')
        # write 800M at maximum
@@ -5744,6 +5751,65 @@ test_56ob() {
 }
 run_test 56ob "check lfs find -atime -mtime -ctime with units"
 
+test_newerXY_base() {
+       local x=$1
+       local y=$2
+       local dir=$DIR/$tdir
+       local ref
+       local negref
+
+       if [ $y == "t" ]; then
+               ref="\"$(date +"%Y-%m-%d %H:%M:%S")\""
+       else
+               ref=$DIR/$tfile.newer
+               touch $ref || error "touch $ref failed"
+       fi
+       sleep 2
+       setup_56 $dir $NUMFILES $NUMDIRS "-i0 -c1" "-i0 -c1"
+       sleep 2
+       if [ $y == "t" ]; then
+               negref="\"$(date +"%Y-%m-%d %H:%M:%S")\""
+       else
+               negref=$DIR/$tfile.newerneg
+               touch $negref || error "touch $negref failed"
+       fi
+
+       local cmd="$LFS find $dir -newer$x$y $ref"
+       local nums=$(eval $cmd | wc -l)
+       local expected=$(((NUMFILES + 2) * NUMDIRS + 1))
+
+       [ $nums -eq $expected ] ||
+               error "'$cmd' wrong: found $nums, expected $expected"
+
+       cmd="$LFS find $dir ! -newer$x$y $negref"
+       nums=$(eval $cmd | wc -l)
+       [ $nums -eq $expected ] ||
+               error "'$cmd' wrong: found $nums, expected $expected"
+
+       cmd="$LFS find $dir -newer$x$y $ref ! -newer$x$y $negref"
+       nums=$(eval $cmd | wc -l)
+       [ $nums -eq $expected ] ||
+               error "'$cmd' wrong: found $nums, expected $expected"
+
+       rm -rf $DIR/*
+}
+
+test_56oc() {
+       test_newerXY_base "a" "a"
+       test_newerXY_base "a" "m"
+       test_newerXY_base "a" "c"
+       test_newerXY_base "m" "a"
+       test_newerXY_base "m" "m"
+       test_newerXY_base "m" "c"
+       test_newerXY_base "c" "a"
+       test_newerXY_base "c" "m"
+       test_newerXY_base "c" "c"
+       test_newerXY_base "a" "t"
+       test_newerXY_base "m" "t"
+       test_newerXY_base "c" "t"
+}
+run_test 56oc "check lfs find -newerXY work"
+
 test_56p() {
        [ $RUNAS_ID -eq $UID ] &&
                skip_env "RUNAS_ID = UID = $UID -- skipping"
@@ -7773,7 +7839,7 @@ run_test 65m "normal user can't set filesystem default stripe"
 
 test_65n() {
        [ -n "$FILESET" ] && skip "Not functional for FILESET set"
-       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.50) ]] ||
+       [[ $MDS1_VERSION -ge $(version_code 2.12.50) ]] ||
                skip "Need MDS version at least 2.12.50"
        [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
 
@@ -7816,8 +7882,13 @@ test_65n() {
 
        local dir3=$MOUNT/$tdir-3
        mkdir $dir3 || error "mkdir $dir3 failed"
-       ! getfattr -n trusted.lov $dir3 &> /dev/null ||
-               error "$dir3 shouldn't have LOV EA"
+       # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
+       # the root layout, which is the actual default layout that will be used
+       # when new files are created in $dir3.
+       local dir3_layout=$(get_layout_param $dir3)
+       local root_dir_layout=$(get_layout_param $MOUNT)
+       [[ "$dir3_layout" = "$root_dir_layout" ]] ||
+               error "$dir3 should show the default layout from $MOUNT"
 
        # set OST pool on root directory
        local pool=$TESTNAME
@@ -7839,8 +7910,14 @@ test_65n() {
 
        local dir4=$MOUNT/$tdir-4
        mkdir $dir4 || error "mkdir $dir4 failed"
-       ! getfattr -n trusted.lov $dir4 &> /dev/null ||
-               error "$dir4 shouldn't have LOV EA"
+       local dir4_layout=$(get_layout_param $dir4)
+       root_dir_layout=$(get_layout_param $MOUNT)
+       echo "$LFS getstripe -d $dir4"
+       $LFS getstripe -d $dir4
+       echo "$LFS getstripe -d $MOUNT"
+       $LFS getstripe -d $MOUNT
+       [[ "$dir4_layout" = "$root_dir_layout" ]] ||
+               error "$dir4 should show the default layout from $MOUNT"
 
        # new file created in $dir4 should inherit the pool from
        # the filesystem default
@@ -7859,7 +7936,7 @@ test_65n() {
        local dir5=$dir4/$tdir-5
        mkdir $dir5 || error "mkdir $dir5 failed"
 
-       local dir4_layout=$(get_layout_param $dir4)
+       dir4_layout=$(get_layout_param $dir4)
        local dir5_layout=$(get_layout_param $dir5)
        [[ "$dir4_layout" = "$dir5_layout" ]] ||
                error "$dir5 should inherit the default layout from $dir4"
@@ -8521,31 +8598,35 @@ test_80() { # bug 10718
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
 
        # relax strong synchronous semantics for slow backends like ZFS
-       local soc="obdfilter.*.sync_on_lock_cancel"
-       local soc_old=$(do_facet ost1 lctl get_param -n $soc | head -n1)
-       local hosts=
-       if [ "$soc_old" != "never" ] &&
-               [ "$ost1_FSTYPE" != "ldiskfs" ]; then
-                       hosts=$(for host in $(seq -f "ost%g" 1 $OSTCOUNT); do
-                               facet_active_host $host; done | sort -u)
-                       do_nodes $hosts lctl set_param $soc=never
-       fi
+       if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
+               local soc="obdfilter.*.sync_lock_cancel"
+               local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
 
-        dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
-        sync; sleep 1; sync
-        local BEFORE=`date +%s`
-        cancel_lru_locks osc
-        local AFTER=`date +%s`
-        local DIFF=$((AFTER-BEFORE))
-        if [ $DIFF -gt 1 ] ; then
-                error "elapsed for 1M@1T = $DIFF"
-        fi
+               # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
+               if [ -z "$save" ]; then
+                       soc="obdfilter.*.sync_on_lock_cancel"
+                       save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
+               fi
 
-        [ -n "$hosts" ] && do_nodes $hosts lctl set_param $soc=$soc_old
+               if [ "$save" != "never" ]; then
+                       local hosts=$(comma_list $(osts_nodes))
 
-        rm -f $DIR/$tfile
+                       do_nodes $hosts $LCTL set_param $soc=never
+                       stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
+               fi
+       fi
+
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
+       sync; sleep 1; sync
+       local before=$(date +%s)
+       cancel_lru_locks osc
+       local after=$(date +%s)
+       local diff=$((after - before))
+       [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
+
+       rm -f $DIR/$tfile
 }
-run_test 80 "Page eviction is equally fast at high offsets too  ===="
+run_test 80 "Page eviction is equally fast at high offsets too"
 
 test_81a() { # LU-456
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
@@ -11082,6 +11163,27 @@ test_123b () { # statahead(bug 15027)
 }
 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
 
+test_123c() {
+       [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
+
+       test_mkdir -i 0 -c 1 $DIR/$tdir.0
+       test_mkdir -i 1 -c 1 $DIR/$tdir.1
+       touch $DIR/$tdir.1/{1..3}
+       mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
+
+       remount_client $MOUNT
+
+       $MULTIOP $DIR/$tdir.0 Q
+
+       # let statahead to complete
+       ls -l $DIR/$tdir.0 > /dev/null
+
+       testid=$(echo $TESTNAME | tr '_' ' ')
+       dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
+               error "statahead warning" || true
+}
+run_test 123c "Can not initialize inode warning on DNE statahead"
+
 test_124a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
        $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
@@ -12392,33 +12494,22 @@ test_133g() {
        remote_mds_nodsh && skip "remote MDS with nodsh"
        remote_ost_nodsh && skip "remote OST with nodsh"
 
-       # eventually, this can also be replaced with "lctl get_param -R",
-       # but not until that option is always available on the server
        local facet
        for facet in mds1 ost1; do
-               [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
-                       skip_noexit "Too old lustre on $facet"
-               local facet_proc_dirs=$(do_facet $facet \
-                                       \\\ls -d $proc_regexp 2>/dev/null)
-               echo "${facet}_proc_dirs='$facet_proc_dirs'"
-               [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
-               do_facet $facet find $facet_proc_dirs \
-                       ! -name req_history \
-                       -exec cat '{}' \\\; &> /dev/null
-
-               do_facet $facet find $facet_proc_dirs \
-                       ! -name req_history \
-                       -type f \
-                       -exec cat '{}' \\\; &> /dev/null ||
-                               error "proc file read failed"
-
-               do_facet $facet find $facet_proc_dirs \
-                       -ignore_readdir_race \
-                       -type f \
-                       -not -name force_lbug \
-                       -not -name changelog_mask \
-                       -exec badarea_io '{}' \\\; ||
-                               error_133 "$facet find $facet_proc_dirs failed"
+               local facet_ver=$(lustre_version_code $facet)
+               if [ $facet_ver -ge $(version_code 2.7.65) ]; then
+                       do_facet $facet "$LCTL get_param -R '*'" &> /dev/null
+               else
+                       log "$facet: too old lustre for get_param -R"
+               fi
+               if [ $facet_ver -ge $(version_code 2.5.54) ]; then
+                       do_facet $facet "$LCTL list_param -R '*' | grep '=' |
+                               tr -d= | egrep -v 'force_lbug|changelog_mask' |
+                               xargs badarea_io" ||
+                                       error_133 "$facet badarea_io failed"
+               else
+                       skip_noexit "$facet: too old lustre for get_param -R"
+               fi
        done
 
        # remount the FS in case writes/reads /proc break the FS
@@ -12534,6 +12625,73 @@ test_134b() {
 }
 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
 
+test_135() {
+       remote_mds_nodsh && skip "remote MDS with nodsh"
+       [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] &&
+               skip "Need MDS version at least 2.13.50"
+       local fname
+
+       mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+
+#define OBD_FAIL_PLAIN_RECORDS 0x1319
+       #set only one record at plain llog
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1319 fail_val=1
+
+       #fill already existed plain llog each 64767
+       #wrapping whole catalog
+       createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1))
+
+       createmany -o $DIR/$tdir/$tfile_ 64700
+       for (( i = 0; i < 64700; i = i + 2 ))
+       do
+               rm $DIR/$tdir/$tfile_$i &
+               rm $DIR/$tdir/$tfile_$((i + 1)) &
+               local pid=$!
+               wait $pid
+       done
+
+       #waiting osp synchronization
+       wait_delete_completed
+}
+run_test 135 "Race catalog processing"
+
+test_136() {
+       remote_mds_nodsh && skip "remote MDS with nodsh"
+       [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] &&
+               skip "Need MDS version at least 2.13.50"
+       local fname
+
+       mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+       $SETSTRIPE -c 1 -i 0 $DIR/$tdir || error "failed to set striping"
+       #set only one record at plain llog
+#define OBD_FAIL_CATALOG_FULL_CHECK                0x131a
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x131a fail_val=1
+
+       #fill already existed 2 plain llogs each 64767
+       #wrapping whole catalog
+       createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1))
+       createmany -o -u $DIR/$tdir/$tfile- $((64767 * 3 / 2))
+       wait_delete_completed
+
+       createmany -o $DIR/$tdir/$tfile_ 10
+       sleep 25
+
+       do_facet $SINGLEMDS $LCTL set_param fail_val=3
+       for (( i = 0; i < 10; i = i + 3 ))
+       do
+               rm $DIR/$tdir/$tfile_$i &
+               rm $DIR/$tdir/$tfile_$((i + 1)) &
+               local pid=$!
+               wait $pid
+               sleep 7
+               rm $DIR/$tdir/$tfile_$((i + 2)) &
+       done
+
+       #waiting osp synchronization
+       wait_delete_completed
+}
+run_test 136 "Race catalog processing 2"
+
 test_140() { #bug-17379
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
 
@@ -13718,14 +13876,17 @@ test_160f() {
 
        # generate some changelog records to accumulate on each MDT
        test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
+       log "$(date +%s): creating first files"
        createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
                error "create $DIR/$tdir/$tfile failed"
 
        # check changelogs have been generated
+       local start=$SECONDS
+       local idle_time=$((MDSCOUNT * 5 + 5))
        local nbcl=$(changelog_dump | wc -l)
        [[ $nbcl -eq 0 ]] && error "no changelogs found"
 
-       for param in "changelog_max_idle_time=10" \
+       for param in "changelog_max_idle_time=$idle_time" \
                     "changelog_gc=1" \
                     "changelog_min_gc_interval=2" \
                     "changelog_min_free_cat_entries=3"; do
@@ -13737,8 +13898,11 @@ test_160f() {
                do_nodes $mdts $LCTL set_param mdd.*.$param
        done
 
-       # force cl_user2 to be idle (1st part)
-       sleep 9
+       # force cl_user2 to be idle (1st part), but also cancel the
+       # cl_user1 records so that it is not evicted later in the test.
+       local sleep1=$((idle_time / 2))
+       echo "$(date +%s): sleep1 $sleep1/${idle_time}s"
+       sleep $sleep1
 
        # simulate changelog catalog almost full
        #define OBD_FAIL_CAT_FREE_RECORDS       0x1313
@@ -13774,13 +13938,16 @@ test_160f() {
                              "$user_rec1, but is $user_rec2"
        done
 
-       # force cl_user2 to be idle (2nd part) and to reach
-       # changelog_max_idle_time
-       sleep 2
+       # force cl_user2 idle (2nd part) to just exceed changelog_max_idle_time
+       local sleep2=$((idle_time - (SECONDS - start) + 1))
+       echo "$(date +%s): sleep2 $sleep2/${idle_time}s"
+       sleep $sleep2
 
-       # generate one more changelog to trigger fail_loc
-       createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
-               error "create $DIR/$tdir/${tfile}bis failed"
+       # Generate one more changelog to trigger GC at fail_loc for cl_user2.
+       # cl_user1 should be OK because it recently processed records.
+       echo "$(date +%s): creating $((MDSCOUNT * 2)) files"
+       createmany -m $DIR/$tdir/${tfile}b $((MDSCOUNT * 2)) ||
+               error "create $DIR/$tdir/${tfile}b failed"
 
        # ensure gc thread is done
        for i in $(mdts_nodes); do
@@ -15383,7 +15550,7 @@ jobstats_set() {
                "$FSNAME.sys.jobid_var" $new_jobenv
 }
 
-test_205() { # Job stats
+test_205a() { # Job stats
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
        [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
                skip "Need MDS version with at least 2.7.1"
@@ -15485,7 +15652,18 @@ test_205() { # Job stats
 
        verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
 }
-run_test 205 "Verify job stats"
+run_test 205a "Verify job stats"
+
+# LU-13117
+test_205b() {
+       $LCTL set_param jobid_var=USER jobid_name="%e.%u"
+       env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
+       do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
+               grep job_id: | grep foolish &&
+                       error "Unexpected jobid found"
+       true
+}
+run_test 205b "Verify job stats jobid parsing"
 
 # LU-1480, LU-1773 and LU-1657
 test_206() {
@@ -16926,6 +17104,61 @@ test_230l() {
 }
 run_test 230l "readdir between MDTs won't crash"
 
+test_230m() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
+       [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
+               skip "Need MDS version at least 2.11.56"
+
+       local MDTIDX=1
+       local mig_dir=$DIR/$tdir/migrate_dir
+       local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+       local shortstr="b"
+       local val
+
+       echo "Creating files and dirs with xattrs"
+       test_mkdir $DIR/$tdir
+       test_mkdir -i0 -c1 $mig_dir
+       mkdir $mig_dir/dir
+       setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
+               error "cannot set xattr attr1 on dir"
+       setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
+               error "cannot set xattr attr2 on dir"
+       touch $mig_dir/dir/f0
+       setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
+               error "cannot set xattr attr1 on file"
+       setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
+               error "cannot set xattr attr2 on file"
+       sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
+       val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
+       [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
+       val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
+       [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
+       val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
+       [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
+       val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
+       [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
+
+       echo "Migrating to MDT1"
+       $LFS migrate -m $MDTIDX $mig_dir ||
+               error "fails on migrating dir to MDT1"
+
+       sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
+       echo "Checking xattrs"
+       val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
+       [ "$val" = $longstr ] ||
+               error "expecting xattr1 $longstr on dir, found $val"
+       val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
+       [ "$val" = $shortstr ] ||
+               error "expecting xattr2 $shortstr on dir, found $val"
+       val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
+       [ "$val" = $longstr ] ||
+               error "expecting xattr1 $longstr on file, found $val"
+       val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
+       [ "$val" = $shortstr ] ||
+               error "expecting xattr2 $shortstr on file, found $val"
+}
+run_test 230m "xattrs not changed after dir migration"
+
 test_231a()
 {
        # For simplicity this test assumes that max_pages_per_rpc
@@ -17422,7 +17655,7 @@ test_247e() {
 }
 run_test 247e "mount .. as fileset"
 
-test_248() {
+test_248a() {
        local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
        [ -z "$fast_read_sav" ] && skip "no fast read support"
 
@@ -17473,7 +17706,89 @@ test_248() {
        $LCTL set_param -n llite.*.fast_read=$fast_read_sav
        rm -f $DIR/$tfile
 }
-run_test 248 "fast read verification"
+run_test 248a "fast read verification"
+
+test_248b() {
+       # Default short_io_bytes=16384, try both smaller and larger sizes.
+       # Lustre O_DIRECT read and write needs to be a multiple of PAGE_SIZE.
+       # 6017024 = 2^12*13*113 = 47008*128 = 11752*512 = 4096*1469 = 53248*113
+       echo "bs=53248 count=113 normal buffered write"
+       dd if=/dev/urandom of=$TMP/$tfile.0 bs=53248 count=113 ||
+               error "dd of initial data file failed"
+       stack_trap "rm -f $DIR/$tfile.[0-3] $TMP/$tfile.[0-3]" EXIT
+
+       echo "bs=47008 count=128 oflag=dsync normal write $tfile.0"
+       dd if=$TMP/$tfile.0 of=$DIR/$tfile.0 bs=47008 count=128 oflag=dsync ||
+               error "dd with sync normal writes failed"
+       cmp $TMP/$tfile.0 $DIR/$tfile.0 || error "compare $DIR/$tfile.0 failed"
+
+       echo "bs=11752 count=512 oflag=dsync small write $tfile.1"
+       dd if=$TMP/$tfile.0 of=$DIR/$tfile.1 bs=11752 count=512 oflag=dsync ||
+               error "dd with sync small writes failed"
+       cmp $TMP/$tfile.0 $DIR/$tfile.1 || error "compare $DIR/$tfile.1 failed"
+
+       cancel_lru_locks osc
+
+       # calculate the small O_DIRECT size and count for the client PAGE_SIZE
+       local num=$((13 * 113 / (PAGE_SIZE / 4096)))
+       echo "bs=$PAGE_SIZE count=$num iflag=direct small read $tfile.1"
+       dd if=$DIR/$tfile.1 of=$TMP/$tfile.1 bs=$PAGE_SIZE count=$num \
+               iflag=direct || error "dd with O_DIRECT small read failed"
+       # adjust bytes checked to handle larger PAGE_SIZE for ARM/PPC
+       cmp --bytes=$((PAGE_SIZE * num)) $TMP/$tfile.0 $TMP/$tfile.1 ||
+               error "compare $TMP/$tfile.1 failed"
+
+       local save=$($LCTL get_param -n osc.*OST000*.short_io_bytes | head -n 1)
+       stack_trap "$LCTL set_param osc.$FSNAME-*.short_io_bytes=$save" EXIT
+
+       # just to see what the maximum tunable value is, and test parsing
+       echo "test invalid parameter 2MB"
+       $LCTL set_param osc.$FSNAME-OST0000*.short_io_bytes=2M &&
+               error "too-large short_io_bytes allowed"
+       echo "test maximum parameter 512KB"
+       # if we can set a larger short_io_bytes, run test regardless of version
+       if ! $LCTL set_param osc.$FSNAME-OST0000*.short_io_bytes=512K; then
+               # older clients may not allow setting it this large, that's OK
+               [ $CLIENT_VERSION -ge $(version_code 2.13.50) ] ||
+                       skip "Need at least client version 2.13.50"
+               error "medium short_io_bytes failed"
+       fi
+       $LCTL get_param osc.$FSNAME-OST0000*.short_io_bytes
+       size=$($LCTL get_param -n osc.$FSNAME-OST0000*.short_io_bytes)
+
+       echo "test large parameter 64KB"
+       $LCTL set_param osc.$FSNAME-*.short_io_bytes=65536
+       $LCTL get_param osc.$FSNAME-OST0000*.short_io_bytes
+
+       echo "bs=47008 count=128 oflag=dsync large write $tfile.2"
+       dd if=$TMP/$tfile.0 of=$DIR/$tfile.2 bs=47008 count=128 oflag=dsync ||
+               error "dd with sync large writes failed"
+       cmp $TMP/$tfile.0 $DIR/$tfile.2 || error "compare $DIR/$tfile.2 failed"
+
+       # calculate the large O_DIRECT size and count for the client PAGE_SIZE
+       local size=$(((4096 * 13 + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE))
+       num=$((113 * 4096 / PAGE_SIZE))
+       echo "bs=$size count=$num oflag=direct large write $tfile.3"
+       dd if=$TMP/$tfile.0 of=$DIR/$tfile.3 bs=$size count=$num oflag=direct ||
+               error "dd with O_DIRECT large writes failed"
+       cmp --bytes=$((size * num)) $TMP/$tfile.0 $DIR/$tfile.3 ||
+               error "compare $DIR/$tfile.3 failed"
+
+       cancel_lru_locks osc
+
+       echo "bs=$size count=$num iflag=direct large read $tfile.2"
+       dd if=$DIR/$tfile.2 of=$TMP/$tfile.2 bs=$size count=$num iflag=direct ||
+               error "dd with O_DIRECT large read failed"
+       cmp --bytes=$((size * num)) $TMP/$tfile.0 $TMP/$tfile.2 ||
+               error "compare $TMP/$tfile.2 failed"
+
+       echo "bs=$size count=$num iflag=direct large read $tfile.3"
+       dd if=$DIR/$tfile.3 of=$TMP/$tfile.3 bs=$size count=$num iflag=direct ||
+               error "dd with O_DIRECT large read failed"
+       cmp --bytes=$((size * num)) $TMP/$tfile.0 $TMP/$tfile.3 ||
+               error "compare $TMP/$tfile.3 failed"
+}
+run_test 248b "test short_io read and write for both small and large sizes"
 
 test_249() { # LU-7890
        [ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
@@ -18771,7 +19086,7 @@ test_272a() {
                error "md5sum differ: $old_md5, $new_md5"
 
        [ $($LFS getstripe -c $dom) -eq 2 ] ||
-               error "migrate stripe count bad: $(LFS getstripe -c $dom) != 2"
+               error "bad final stripe count: $($LFS getstripe -c $dom) != 2"
 }
 run_test 272a "DoM migration: new layout with the same DOM component"
 
@@ -19561,8 +19876,9 @@ test_300k() {
 
        # this test needs a huge transaction
        local kb
-       kb=$(do_facet $SINGLEMDS lctl get_param -n osd*.lustre-MDT0000.kbytestotal)
-       [ $kb -lt $((1024*1024)) ] && skip "too small mds: $kb"
+       kb=$(do_facet $SINGLEMDS "$LCTL get_param -n \
+            osd*.$FSNAME-MDT0000.kbytestotal")
+       [ $kb -lt $((1024*1024)) ] && skip "MDT0 too small: $kb"
 
        local stripe_count
        local file
@@ -19770,7 +20086,7 @@ test_300q() {
 run_test 300q "create remote directory under orphan directory"
 
 test_300r() {
-       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+       [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
                skip "Need MDS version at least 2.7.55" && return
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
 
@@ -20228,6 +20544,54 @@ test_319() {
 }
 run_test 319 "lost lease lock on migrate error"
 
+test_398a() { # LU-4198
+       $LFS setstripe -c 1 -i 0 $DIR/$tfile
+       $LCTL set_param ldlm.namespaces.*.lru_size=clear
+
+       # request a new lock on client
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
+
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
+       local lock_count=$($LCTL get_param -n \
+                          ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
+       [[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO"
+
+       $LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear
+
+       # no lock cached, should use lockless IO and not enqueue new lock
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
+       lock_count=$($LCTL get_param -n \
+                    ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
+       [[ $lock_count -eq 0 ]] || error "no lock should be held by direct IO"
+}
+run_test 398a "direct IO should cancel lock otherwise lockless"
+
+test_398b() { # LU-4198
+       which fio || skip_env "no fio installed"
+       $LFS setstripe -c -1 $DIR/$tfile
+
+       local size=12
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=$size
+
+       local njobs=4
+       echo "mix direct rw ${size}M to OST0 by fio with $njobs jobs..."
+       fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE --direct=1 \
+               --numjobs=$njobs --fallocate=none \
+               --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+               --filename=$DIR/$tfile &
+       bg_pid=$!
+
+       echo "mix buffer rw ${size}M to OST0 by fio with $njobs jobs..."
+       fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE \
+               --numjobs=$njobs --fallocate=none \
+               --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+               --filename=$DIR/$tfile || true
+       wait $bg_pid
+
+       rm -rf $DIR/$tfile
+}
+run_test 398b "DIO and buffer IO race"
+
 test_fake_rw() {
        local read_write=$1
        if [ "$read_write" = "write" ]; then
@@ -20244,7 +20608,7 @@ test_fake_rw() {
 
        $LFS setstripe -c 1 -i 0 $DIR/$tfile
 
-       # get ost1 size - lustre-OST0000
+       # get ost1 size - $FSNAME-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
@@ -20741,7 +21105,7 @@ run_test 411 "Slab allocation error with cgroup does not LBUG"
 
 test_412() {
        [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
-       if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
+       if [ $MDS1_VERSION -lt $(version_code 2.10.55) ]; then
                skip "Need server version at least 2.10.55"
        fi
 
@@ -20786,13 +21150,13 @@ test_qos_mkdir() {
                lmv.*.qos_maxage=$lmv_qos_maxage > /dev/null" EXIT
 
        lod_qos_prio_free=$(do_facet mds1 $LCTL get_param -n \
-               lod.lustre-MDT0000-mdtlov.mdt_qos_prio_free | head -n1)
+               lod.$FSNAME-MDT0000-mdtlov.mdt_qos_prio_free | head -n1)
        lod_qos_prio_free=${lod_qos_prio_free%%%}
        lod_qos_threshold_rr=$(do_facet mds1 $LCTL get_param -n \
-               lod.lustre-MDT0000-mdtlov.mdt_qos_threshold_rr | head -n1)
+               lod.$FSNAME-MDT0000-mdtlov.mdt_qos_threshold_rr | head -n1)
        lod_qos_threshold_rr=${lod_qos_threshold_rr%%%}
        lod_qos_maxage=$(do_facet mds1 $LCTL get_param -n \
-               lod.lustre-MDT0000-mdtlov.qos_maxage | awk '{ print $1 }')
+               lod.$FSNAME-MDT0000-mdtlov.qos_maxage | awk '{ print $1 }')
        stack_trap "do_nodes $mdts $LCTL set_param \
                lod.*.mdt_qos_prio_free=$lod_qos_prio_free > /dev/null" EXIT
        stack_trap "do_nodes $mdts $LCTL set_param \
@@ -21009,7 +21373,7 @@ run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
 
 test_415() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
-       [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
+       [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
                skip "Need server version at least 2.11.52"
 
        # LU-11102
@@ -21051,7 +21415,7 @@ test_415() {
 run_test 415 "lock revoke is not missing"
 
 test_416() {
-       [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
+       [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
                skip "Need server version at least 2.11.55"
 
        # define OBD_FAIL_OSD_TXN_START    0x19a
@@ -21506,7 +21870,7 @@ test_422() {
 run_test 422 "kill a process with RPC in progress"
 
 prep_801() {
-       [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
+       [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
        [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
                skip "Need server version at least 2.9.55"
 
@@ -21737,7 +22101,7 @@ cleanup_802a() {
 
 test_802a() {
        [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
-       [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
+       [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
        [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
                skip "Need server version at least 2.9.55"
 
@@ -21964,7 +22328,7 @@ test_805() {
        local usedkb
        local old
        local quota
-       local pref="osd-zfs.lustre-MDT0000."
+       local pref="osd-zfs.$FSNAME-MDT0000."
 
        # limit available space on MDS dataset to meet nospace issue
        # quickly. then ZFS 0.7.2 can use reserved space if asked
@@ -22256,7 +22620,7 @@ test_810() {
 run_test 810 "partial page writes on ZFS (LU-11663)"
 
 test_811() {
-       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
+       [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
                skip "Need MDS version at least 2.11.56"
 
        #define OBD_FAIL_MDS_ORPHAN_DELETE      0x165
@@ -22272,7 +22636,7 @@ test_811() {
 }
 run_test 811 "orphan name stub can be cleaned up in startup"
 
-test_812() {
+test_812a() {
        [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
                skip "OST < 2.12.51 doesn't support this fail_loc"
        [ "$SHARED_KEY" = true ] &&
@@ -22293,7 +22657,31 @@ test_812() {
 
        stat $DIR/$tfile >/dev/null || error "can't stat file"
 }
-run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
+run_test 812a "do not drop reqs generated when imp is going to idle (LU-11951)"
+
+test_812b() { # LU-12378
+       [ $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 || error "setstripe failed"
+       # ensure ost1 is connected
+       stat $DIR/$tfile >/dev/null || error "can't stat"
+       wait_osc_import_state client ost1 FULL
+       # no locks, no reqs to let the connection idle
+       cancel_lru_locks osc
+
+       # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
+#define OBD_FAIL_OST_DISCONNECT_DELAY   0x245
+       do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
+       wait_osc_import_state client ost1 CONNECTING
+       do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
+
+       $LFS quota -u 0 $DIR/ || error "lfs quota should succeed"
+       wait_osc_import_state client ost1 IDLE
+}
+run_test 812b "do not drop no resend request for idle connect"
 
 test_813() {
        local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null)
@@ -22581,6 +22969,31 @@ test_900() {
 }
 run_test 900 "umount should not race with any mgc requeue thread"
 
+# LUS-6253/LU-11185
+test_901() {
+       local oldc
+       local newc
+       local olds
+       local news
+       [ $PARALLEL == "yes" ] && skip "skip parallel run"
+
+       # some get_param have a bug to handle dot in param name
+       cancel_lru_locks MGC
+       oldc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
+       olds=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
+       umount_client $MOUNT || error "umount failed"
+       mount_client $MOUNT || error "mount failed"
+       cancel_lru_locks MGC
+       newc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
+       news=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
+
+       [ $oldc -lt $newc ] && error "mgc lock leak ($oldc != $newc)"
+       [ $olds -lt $news ] && error "mgs lock leak ($olds != $news)"
+
+       return 0
+}
+run_test 901 "don't leak a mgc lock on client umount"
+
 complete $SECONDS
 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
 check_and_cleanup_lustre