Whamcloud - gitweb
LU-7340 mdd: changelogs garbage collection
[fs/lustre-release.git] / lustre / tests / sanity.sh
index a136f4b..46f9e8c 100755 (executable)
@@ -12,8 +12,8 @@ ONLY=${ONLY:-"$*"}
 ALWAYS_EXCEPT="                42a    42b      42c     45   68b $SANITY_EXCEPT"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
-# skipped tests: LU-2036 LU-8411 LU-9096 LU-9054
-ALWAYS_EXCEPT="  76     407     253     312 $ALWAYS_EXCEPT"
+# skipped tests: LU-8411 LU-9096 LU-9054 LU-10199
+ALWAYS_EXCEPT="  407     253     312     56xb     $ALWAYS_EXCEPT"
 
 # Check Grants after these tests
 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
@@ -40,6 +40,7 @@ SRCDIR=$(cd $(dirname $0); echo $PWD)
 export PATH=$PATH:/sbin
 
 TMP=${TMP:-/tmp}
+OSC=${OSC:-"osc"}
 
 CC=${CC:-cc}
 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
@@ -1673,7 +1674,8 @@ test_27u() { # bug 4900
        unlinkmany $DIR/$tdir/t- 1000
        trap 0
        [[ $OBJS -gt 0 ]] &&
-               error "$OBJS objects created on OST-0. See $TLOG" || pass
+               error "$OBJS objects created on OST-0. See $TLOG" ||
+               rm -f $TLOG
 }
 run_test 27u "skip object creation on OSC w/o objects"
 
@@ -1712,10 +1714,10 @@ test_27w() { # bug 10997
        $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
        [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
                error "stripe size $size != 65536" || true
-       [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -ne 1 ] &&
-               error "$LFS getstripe -d $DIR/$tdir failed" || true
+       [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
+               error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
 }
-run_test 27w "check $LFS setstripe -S option"
+run_test 27w "check $LFS setstripe -S and getstrip -d options"
 
 test_27wa() {
        [[ $OSTCOUNT -lt 2 ]] &&
@@ -2058,6 +2060,10 @@ test_27D() {
        local ost_list=$(seq $first_ost $ost_step $last_ost)
        local ost_range="$first_ost $last_ost $ost_step"
 
+       if ! combined_mgs_mds ; then
+               mount_mgs_client
+       fi
+
        test_mkdir $DIR/$tdir
        pool_add $POOL || error "pool_add failed"
        pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
@@ -2072,6 +2078,10 @@ test_27D() {
                error "llapi_layout_test failed"
 
        destroy_test_pools || error "destroy test pools failed"
+
+       if ! combined_mgs_mds ; then
+               umount_mgs_client
+       fi
 }
 run_test 27D "validate llapi_layout API"
 
@@ -3587,7 +3597,7 @@ test_41() {
 run_test 41 "test small file write + fstat ====================="
 
 count_ost_writes() {
-       lctl get_param -n osc.*.stats |
+       lctl get_param -n ${OSC}.*.stats |
                awk -vwrites=0 '/ost_write/ { writes += $2 } \
                        END { printf("%0.0f", writes) }'
 }
@@ -3647,7 +3657,7 @@ setup_test42() {
 test_42a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        setup_test42
-       cancel_lru_locks osc
+       cancel_lru_locks $OSC
        stop_writeback
        sync; sleep 1; sync # just to be safe
        BEFOREWRITES=`count_ost_writes`
@@ -3663,7 +3673,7 @@ run_test 42a "ensure that we don't flush on close"
 test_42b() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        setup_test42
-       cancel_lru_locks osc
+       cancel_lru_locks $OSC
        stop_writeback
        sync
        dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
@@ -3699,21 +3709,21 @@ run_test 42b "test destroy of file with cached dirty data ======"
 # start the file with a full-file pw lock to match against
 # until the truncate.
 trunc_test() {
-        test=$1
-        file=$DIR/$test
-        offset=$2
-       cancel_lru_locks osc
+       test=$1
+       file=$DIR/$test
+       offset=$2
+       cancel_lru_locks $OSC
        stop_writeback
        # prime the file with 0,EOF PW to match
        touch $file
         $TRUNCATE $file 0
         sync; sync
        # now the real test..
-        dd if=/dev/zero of=$file bs=1024 count=100
-        BEFOREWRITES=`count_ost_writes`
-        $TRUNCATE $file $offset
-        cancel_lru_locks osc
-        AFTERWRITES=`count_ost_writes`
+       dd if=/dev/zero of=$file bs=1024 count=100
+       BEFOREWRITES=`count_ost_writes`
+       $TRUNCATE $file $offset
+       cancel_lru_locks $OSC
+       AFTERWRITES=`count_ost_writes`
        start_writeback
 }
 
@@ -3830,6 +3840,7 @@ test_43a() {
                cp -p multiop $DIR/$tdir/multiop
        MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
                error "multiop open $TMP/$tfile.junk failed"
+       rm $TMP/$tfile.junk     # delete junk file on close (not part of test)
        MULTIOP_PID=$!
        $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success"
        kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed"
@@ -3844,6 +3855,7 @@ test_43b() {
                cp -p multiop $DIR/$tdir/multiop
        MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
                error "multiop open $TMP/$tfile.junk failed"
+       rm $TMP/$tfile.junk     # delete junk file on close (not part of test)
        MULTIOP_PID=$!
        $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success"
        kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed"
@@ -3912,7 +3924,7 @@ run_test 44a "test sparse pwrite ==============================="
 
 dirty_osc_total() {
        tot=0
-       for d in `lctl get_param -n osc.*.cur_dirty_bytes`; do
+       for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
                tot=$(($tot + $d))
        done
        echo $tot
@@ -4153,11 +4165,13 @@ test_51b() {
        [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)" &&
                return
 
-       trap cleanup_print_lfsdf EXIT
+       trap cleanup_print_lfs_df EXIT
 
        # create files
-       createmany -d $dir/d $nrdirs ||
+       createmany -d $dir/d $nrdirs || {
+               unlinkmany $dir/d $nrdirs
                error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
+       }
 
        # really created :
        nrdirs=$(ls -U $dir | wc -l)
@@ -4266,8 +4280,10 @@ test_51f() {
                echo "left ulimit at $ulimit_old"
        fi
 
-       createmany -o -k -t 120 $DIR/$tdir/f $numfree ||
+       createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
+               unlinkmany $DIR/$tdir/f $numfree
                error "create+open $numfree files in $DIR/$tdir failed"
+       }
        ulimit -n $ulimit_old
 
        # if createmany exits at 120s there will be fewer than $numfree files
@@ -5150,16 +5166,15 @@ test_56x() {
        check_swap_layouts_support && return 0
        [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
 
-       local dir0=$DIR/$tdir/$testnum
-       test_mkdir -p $dir0
-
+       local dir0=$DIR/$tdir
        local ref1=/etc/passwd
        local file1=$dir0/file1
 
-       $SETSTRIPE -c 2 $file1
+       test_mkdir $dir0 || error "creating dir $dir0"
+       $LFS setstripe -c 2 $file1
        cp $ref1 $file1
        $LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
-       stripe=$($GETSTRIPE -c $file1)
+       stripe=$($LFS getstripe -c $file1)
        [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
        cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
 
@@ -5178,10 +5193,10 @@ test_56xa() {
        local ref1=/etc/passwd
        local file1=$dir0/file1
 
-       $SETSTRIPE -c 2 $file1
+       $LFS setstripe -c 2 $file1
        cp $ref1 $file1
        $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
-       local stripe=$($GETSTRIPE -c $file1)
+       local stripe=$($LFS getstripe -c $file1)
        [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
        cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
 
@@ -5190,6 +5205,110 @@ test_56xa() {
 }
 run_test 56xa "lfs migration --block support"
 
+check_migrate_links() {
+       local dir="$1"
+       local file1="$dir/file1"
+       local begin="$2"
+       local count="$3"
+       local total_count=$(($begin + $count - 1))
+       local symlink_count=10
+       local uniq_count=10
+
+       if [ ! -f "$file1" ]; then
+               echo -n "creating initial file..."
+               $LFS setstripe -c 1 -S "512k" "$file1" ||
+                       error "cannot setstripe initial file"
+               echo "done"
+
+               echo -n "creating symlinks..."
+               for s in $(seq 1 $symlink_count); do
+                       ln -s "$file1" "$dir/slink$s" ||
+                               error "cannot create symlinks"
+               done
+               echo "done"
+
+               echo -n "creating nonlinked files..."
+               createmany -o "$dir/uniq" 1 10 &> /dev/null ||
+                       error "cannot create nonlinked files"
+               echo "done"
+       fi
+
+       # create hard links
+       if [ ! -f "$dir/file$total_count" ]; then
+               echo -n "creating hard links $begin:$total_count..."
+               createmany -l"$file1" "$dir/file" "$begin" "$count" &>  \
+                       /dev/null || error "cannot create hard links"
+               echo "done"
+       fi
+
+       echo -n "checking number of hard links listed in xattrs..."
+       local fid=$($LFS getstripe -F "$file1")
+       local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
+
+       echo "${#paths[*]}"
+       if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2  ]; then
+                       echo "hard link list has unexpected size, skipping test"
+                       return 0
+       fi
+       if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2  ]; then
+                       error "link names should exceed xattrs size"
+       fi
+
+       echo -n "migrating files..."
+       local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
+       local rc=$?
+       [ $rc -eq 0 ] || error "migrate failed rc = $rc"
+       echo "done"
+
+       # make sure all links have been properly migrated
+       echo -n "verifying files..."
+       fid=$($LFS getstripe -F "$file1") ||
+               error "cannot get fid for file $file1"
+       for i in $(seq 2 $total_count); do
+               local fid2=$($LFS getstripe -F $dir/file$i)
+               [ "$fid2" == "$fid" ] ||
+                       error "migrated hard link has mismatched FID"
+       done
+
+       # make sure hard links were properly detected, and migration was
+       # performed only once for the entire link set; nonlinked files should
+       # also be migrated
+       local actual=$(grep -c 'done migrate' <<< "$migrate_out")
+       local expected=$(($uniq_count + 1))
+       [ "$actual" -eq  "$expected" ] ||
+               error "hard links individually migrated ($actual != $expected)"
+
+       # make sure the correct number of hard links are present
+       local hardlinks=$(stat -c '%h' "$file1")
+       [ $hardlinks -eq $total_count ] ||
+               error "num hard links $hardlinks != $total_count"
+       echo "done"
+
+       return 0
+}
+
+test_56xb() {
+       local dir0="$DIR/$tdir"
+
+       test_mkdir "$dir0" || error "cannot create dir $dir0"
+
+       echo "testing lfs migrate mode when all links fit within xattrs"
+       LFS_MIGRATE_RSYNC=false check_migrate_links "$dir0" 2 99
+
+       echo "testing rsync mode when all links fit within xattrs"
+       LFS_MIGRATE_RSYNC=true check_migrate_links "$dir0" 2 99
+
+       echo "testing lfs migrate mode when all links do not fit within xattrs"
+       LFS_MIGRATE_RSYNC=false check_migrate_links "$dir0" 101 100
+
+       echo "testing rsync mode when all links do not fit within xattrs"
+       LFS_MIGRATE_RSYNC=true check_migrate_links "$dir0" 101 100
+
+       # clean up
+       rm -rf $dir0
+}
+run_test 56xb "lfs migration hard link support"
+
 test_56y() {
        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
                skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" &&
@@ -5258,6 +5377,68 @@ test_56aa() { # LU-5937
 }
 run_test 56aa "lfs find --size under striped dir"
 
+test_56ba() {
+       # Create composite files with one component
+       TDIR=$DIR/$tdir/1Mfiles
+       setup_56 5 1 "--component-end 1M"
+       # Create composite files with three components
+       TDIR=$DIR/$tdir/2Mfiles
+       setup_56 5 2 "-E 2M -E 4M -E 6M"
+       TDIR=$DIR/$tdir
+       # Create non-composite files
+       createmany -o $TDIR/${tfile}- 10
+
+       local nfiles=$($LFIND --component-end 1M --type f $TDIR | wc -l)
+       [[ $nfiles == 10 ]] ||
+               error "lfs find -E 1M found $nfiles != 10 files"
+
+       nfiles=$($LFIND ! -E 1M --type f $TDIR | wc -l)
+       [[ $nfiles == 25 ]] ||
+               error "lfs find ! -E 1M found $nfiles != 25 files"
+
+       # All files have a component that starts at 0
+       local nfiles=$($LFIND --component-start 0 --type f $TDIR | wc -l)
+       [[ $nfiles == 35 ]] ||
+               error "lfs find --component-start 0 found $nfiles != 35 files"
+
+       nfiles=$($LFIND --component-start 2M --type f $TDIR | wc -l)
+       [[ $nfiles == 15 ]] ||
+               error "$LFIND --component-start 2M found $nfiles != 15 files"
+
+       # All files created here have a componenet that does not starts at 2M
+       nfiles=$($LFIND ! --component-start 2M --type f $TDIR | wc -l)
+       [[ $nfiles == 35 ]] ||
+               error "$LFIND ! --component-start 2M found $nfiles != 35 files"
+
+       # Find files with a specified number of components
+       local nfiles=$($LFIND --component-count 3 --type f $TDIR | wc -l)
+       [[ $nfiles == 15 ]] ||
+               error "lfs find --component-count 3 found $nfiles != 15 files"
+
+       # Remember non-composite files have a component count of zero
+       local nfiles=$($LFIND --component-count 0 --type f $TDIR | wc -l)
+       [[ $nfiles == 10 ]] ||
+               error "lfs find --component-count 0 found $nfiles != 10 files"
+
+       nfiles=$($LFIND ! --component-count 3 --type f $TDIR | wc -l)
+       [[ $nfiles == 20 ]] ||
+               error "$LFIND ! --component-count 3 found $nfiles != 20 files"
+
+       # All files have a flag called "init"
+       local nfiles=$($LFIND --component-flags init --type f $TDIR | wc -l)
+       [[ $nfiles == 35 ]] ||
+               error "$LFIND --component-flags init found $nfiles != 35 files"
+
+       # Multi-component files will have a component not initialized
+       local nfiles=$($LFIND ! --component-flags init --type f $TDIR | wc -l)
+       [[ $nfiles == 15 ]] ||
+               error "$LFIND !--component-flags init found $nfiles != 15 files"
+
+       rm -rf $TDIR
+
+}
+run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
+
 test_57a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        # note test will not do anything if MDS is not local
@@ -6007,21 +6188,9 @@ num_inodes() {
        awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
 }
 
-get_inode_slab_tunables() {
-       awk '/lustre_inode_cache/ {print $9," ",$10," ",$11; exit}' /proc/slabinfo
-}
-
-set_inode_slab_tunables() {
-       echo "lustre_inode_cache $1" > /proc/slabinfo
-}
-
 test_76() { # Now for bug 20433, added originally in bug 1443
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       local SLAB_SETTINGS=$(get_inode_slab_tunables)
        local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
-       # we cannot set limit below 1 which means 1 inode in each
-       # per-cpu cache is still allowed
-       set_inode_slab_tunables "1 1 0"
        cancel_lru_locks osc
        BEFORE_INODES=$(num_inodes)
        echo "before inodes: $BEFORE_INODES"
@@ -6044,7 +6213,6 @@ test_76() { # Now for bug 20433, added originally in bug 1443
                        error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
                fi
        done
-       set_inode_slab_tunables "$SLAB_SETTINGS"
 }
 run_test 76 "confirm clients recycle inodes properly ===="
 
@@ -6784,7 +6952,7 @@ test_101e() {
        done
 
        echo "Cancel LRU locks on lustre client to flush the client cache"
-       cancel_lru_locks osc
+       cancel_lru_locks $OSC
 
        echo "Reset readahead stats"
        $LCTL set_param -n llite.*.read_ahead_stats 0
@@ -6932,7 +7100,7 @@ setup_test102() {
        done
 
        cd $DIR
-       $1 $TAR cf $TMP/f102.tar $tdir --xattrs
+       $1 tar cf $TMP/f102.tar $tdir --xattrs
 }
 
 cleanup_test102() {
@@ -7091,20 +7259,17 @@ compare_stripe_info1() {
        return 0
 }
 
-find_lustre_tar() {
-       [ -n "$(which tar 2>/dev/null)" ] &&
-               strings $(which tar) | grep -q "lustre" && echo tar
+have_xattrs_include() {
+       tar --help | grep -q xattrs-include &&
+               echo --xattrs-include="lustre.*"
 }
 
 test_102d() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       # b10930: tar test for trusted.lov xattr
-       TAR=$(find_lustre_tar)
-       [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
        [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+       XINC=$(have_xattrs_include)
        setup_test102
-       test_mkdir $DIR/$tdir
-       $TAR xf $TMP/$tfile.tar -C $DIR/$tdir --xattrs
+       tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
        cd $DIR/$tdir/$tdir
        compare_stripe_info1
 }
@@ -7112,14 +7277,13 @@ run_test 102d "tar restore stripe info from tarfile,not keep osts"
 
 test_102f() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       # b10930: tar test for trusted.lov xattr
-       TAR=$(find_lustre_tar)
-       [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
        [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+       XINC=$(have_xattrs_include)
        setup_test102
        test_mkdir $DIR/$tdir.restore
        cd $DIR
-       $TAR cf - --xattrs $tdir | $TAR xf - --xattrs -C $DIR/$tdir.restore
+       tar cf - --xattrs $tdir | tar xf - \
+               -C $DIR/$tdir.restore --xattrs $XINC
        cd $DIR/$tdir.restore/$tdir
        compare_stripe_info1
 }
@@ -7193,13 +7357,11 @@ run_test 102i "lgetxattr test on symbolic link ============"
 
 test_102j() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       TAR=$(find_lustre_tar)
-       [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
        [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+       XINC=$(have_xattrs_include)
        setup_test102 "$RUNAS"
-       test_mkdir $DIR/$tdir
        chown $RUNAS_ID $DIR/$tdir
-       $RUNAS $TAR xf $TMP/f102.tar -C $DIR/$tdir --xattrs
+       $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
        cd $DIR/$tdir/$tdir
        compare_stripe_info1 "$RUNAS"
 }
@@ -8577,11 +8739,11 @@ test_120f() {
        $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
                { skip "no early lock cancel on server"; return 0; }
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
-       test_mkdir $DIR/$tdir
+       test_mkdir -c1 $DIR/$tdir
        lru_resize_disable mdc
        lru_resize_disable osc
-       test_mkdir $DIR/$tdir/d1
-       test_mkdir $DIR/$tdir/d2
+       test_mkdir -c1 $DIR/$tdir/d1
+       test_mkdir -c1 $DIR/$tdir/d2
        dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
        dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
        cancel_lru_locks mdc
@@ -9173,7 +9335,7 @@ test_129() {
                        check_mds_dmesg '"has reached"' ||
                                error_exit "reached message should be output"
 
-                       [ $has_warning -eq 0 ] &&
+                       [ $has_warning = "false" ] &&
                                error_exit "warning message should be output"
 
                        dirsize=$(stat -c%s "$DIR/$tdir")
@@ -9904,7 +10066,7 @@ test_133g() {
                -type f \
                -not -name force_lbug \
                -not -name changelog_mask \
-               -exec badarea_io '{}' \; &> /dev/null ||
+               -exec badarea_io '{}' \; ||
                error "find $proc_dirs failed"
 
        local facet
@@ -9919,7 +10081,7 @@ test_133g() {
                        -type f \
                        -not -name force_lbug \
                        -not -name changelog_mask \
-                       -exec badarea_io '{}' \\\; &> /dev/null ||
+                       -exec badarea_io '{}' \\\; ||
                                error "$facet find $facet_proc_dirs failed"
        done
 
@@ -10078,31 +10240,31 @@ test_150() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        local TF="$TMP/$tfile"
 
-        dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
-        cp $TF $DIR/$tfile
-        cancel_lru_locks osc
-        cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
-        remount_client $MOUNT
-        df -P $MOUNT
-        cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
+       dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
+       cp $TF $DIR/$tfile
+       cancel_lru_locks $OSC
+       cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
+       remount_client $MOUNT
+       df -P $MOUNT
+       cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
 
-        $TRUNCATE $TF 6000
-        $TRUNCATE $DIR/$tfile 6000
-        cancel_lru_locks osc
-        cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
+       $TRUNCATE $TF 6000
+       $TRUNCATE $DIR/$tfile 6000
+       cancel_lru_locks $OSC
+       cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
 
-        echo "12345" >>$TF
-        echo "12345" >>$DIR/$tfile
-        cancel_lru_locks osc
-        cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
+       echo "12345" >>$TF
+       echo "12345" >>$DIR/$tfile
+       cancel_lru_locks $OSC
+       cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
 
-        echo "12345" >>$TF
-        echo "12345" >>$DIR/$tfile
-        cancel_lru_locks osc
-        cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
+       echo "12345" >>$TF
+       echo "12345" >>$DIR/$tfile
+       cancel_lru_locks $OSC
+       cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
 
-        rm -f $TF
-        true
+       rm -f $TF
+       true
 }
 run_test 150 "truncate/append tests"
 
@@ -10650,7 +10812,7 @@ test_155_small_load() {
     dd if=/dev/urandom of=$temp bs=6096 count=1 || \
         error "dd of=$temp bs=6096 count=1 failed"
     cp $temp $file
-    cancel_lru_locks osc
+    cancel_lru_locks $OSC
     cmp $temp $file || error "$temp $file differ"
 
     $TRUNCATE $temp 6000
@@ -10952,9 +11114,8 @@ test_156() {
                log "cache hits:: before: $BEFORE, after: $AFTER"
        fi
 
-       rm -f $file
        restore_lustre_params < $p
-       rm -f $p
+       rm -f $p $file
 }
 run_test 156 "Verification of tunables"
 
@@ -11224,6 +11385,186 @@ test_160e() {
 }
 run_test 160e "changelog negative testing"
 
+cleanup_160f() {
+       trap 0
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0 fail_val=0
+       echo "Deregistering changelog client $CL_USER"
+       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $CL_USER
+       echo "Deregistering changelog client $CL_USER2"
+       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $CL_USER2
+       restore_lustre_params < $save_params
+       rm -f $save_params
+}
+
+test_160f() {
+       # do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_gc=1
+       # should be set by default
+
+       local CL_USERS="mdd.$MDT0.changelog_users"
+       local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+       local save_params="$TMP/sanity-$TESTNAME.parameters"
+
+       save_lustre_params $SINGLEMDS \
+               "mdd.$MDT0.changelog_max_idle_time" > $save_params
+       save_lustre_params $SINGLEMDS \
+               "mdd.$MDT0.changelog_min_gc_interval" >> $save_params
+       save_lustre_params $SINGLEMDS \
+               "mdd.$MDT0.changelog_min_free_cat_entries" >> $save_params
+
+       trap cleanup_160f EXIT
+
+       # Create a user
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       echo "Registered as changelog user $CL_USER"
+       CL_USER2=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       echo "Registered as changelog user $CL_USER2"
+       $GET_CL_USERS | grep -q $CL_USER ||
+               error "User $CL_USER not found in changelog_users"
+       $GET_CL_USERS | grep -q $CL_USER2 ||
+               error "User $CL_USER2 not found in changelog_users"
+
+       # generate some changelogs to accumulate
+       mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+       touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
+       touch $DIR/$tdir/${tfile}2 || error "touch $DIR/$tdir/${tfile}2 failed"
+       rm -f $DIR/$tdir/$tfile || error "rm -f $tfile failed"
+
+       # check changelogs have been generated
+       nbcl=$($LFS changelog $MDT0 | wc -l)
+       [[ $nbcl -eq 0 ]] && error "no changelogs found"
+
+       do_facet $SINGLEMDS $LCTL set_param \
+               mdd.$MDT0.changelog_max_idle_time=10
+       do_facet $SINGLEMDS $LCTL set_param \
+               mdd.$MDT0.changelog_min_gc_interval=2
+       do_facet $SINGLEMDS $LCTL set_param \
+               mdd.$MDT0.changelog_min_free_cat_entries=3
+
+       # simulate changelog catalog almost full
+#define OBD_FAIL_CAT_FREE_RECORDS                  0x1313
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1313
+       do_facet $SINGLEMDS $LCTL set_param fail_val=3
+
+       sleep 6
+       USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+       $LFS changelog_clear $MDT0 $CL_USER $(($USER_REC1 + 2))
+       USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+       echo "verifying user clear: $(( $USER_REC1 + 2 )) == $USER_REC2"
+       [ $USER_REC2 == $(($USER_REC1 + 2)) ] ||
+               error "user index expected $(($USER_REC1 + 2)) is $USER_REC2"
+       sleep 5
+
+       # generate one more changelog to trigger fail_loc
+       rm -rf $DIR/$tdir || error "rm -rf $tdir failed"
+
+       # ensure gc thread is done
+       wait_update_facet $SINGLEMDS \
+                         "ps -e -o comm= | grep chlg_gc_thread" "" 20
+
+       # check user still registered
+       $GET_CL_USERS | grep -q $CL_USER ||
+               error "User $CL_USER not found in changelog_users"
+       # check user2 unregistered
+       $GET_CL_USERS | grep -q $CL_USER2 &&
+               error "User $CL_USER2 still found in changelog_users"
+
+       # check changelogs are present and starting at $USER_REC2 + 1
+       FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}')
+       echo "verifying min purge: $(( $USER_REC2 + 1 )) == $FIRST_REC"
+       [ $FIRST_REC == $(($USER_REC2 + 1)) ] ||
+               error "first index should be $(($USER_REC2 + 1)) is $FIRST_REC"
+
+       cleanup_160f
+}
+run_test 160f "changelog garbage collect (timestamped users)"
+
+test_160g() {
+       # do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_gc=1
+       # should be set by default
+
+       local CL_USERS="mdd.$MDT0.changelog_users"
+       local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+       local save_params="$TMP/sanity-$TESTNAME.parameters"
+
+       save_lustre_params $SINGLEMDS \
+               "mdd.$MDT0.changelog_max_idle_indexes" > $save_params
+       save_lustre_params $SINGLEMDS \
+               "mdd.$MDT0.changelog_min_gc_interval" >> $save_params
+       save_lustre_params $SINGLEMDS \
+               "mdd.$MDT0.changelog_min_free_cat_entries" >> $save_params
+
+       trap cleanup_160f EXIT
+
+#define OBD_FAIL_TIME_IN_CHLOG_USER                 0x1314
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1314
+
+       # Create a user
+       CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       echo "Registered as changelog user $CL_USER"
+       CL_USER2=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       echo "Registered as changelog user $CL_USER2"
+       $GET_CL_USERS | grep -q $CL_USER ||
+               error "User $CL_USER not found in changelog_users"
+       $GET_CL_USERS | grep -q $CL_USER2 ||
+               error "User $CL_USER2 not found in changelog_users"
+
+       # generate some changelogs to accumulate
+       mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+       touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
+       touch $DIR/$tdir/${tfile}2 || error "touch $DIR/$tdir/${tfile}2 failed"
+       rm -f $DIR/$tdir/$tfile || error "rm -f $tfile failed"
+
+       # check changelogs have been generated
+       nbcl=$($LFS changelog $MDT0 | wc -l)
+       [[ $nbcl -eq 0 ]] && error "no changelogs found"
+
+       do_facet $SINGLEMDS $LCTL set_param \
+               mdd.$MDT0.changelog_max_idle_indexes=$((nbcl - 1))
+       do_facet $SINGLEMDS $LCTL set_param \
+               mdd.$MDT0.changelog_min_gc_interval=2
+       do_facet $SINGLEMDS $LCTL set_param \
+               mdd.$MDT0.changelog_min_free_cat_entries=3
+
+       # simulate changelog catalog almost full
+#define OBD_FAIL_CAT_FREE_RECORDS                  0x1313
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1313
+       do_facet $SINGLEMDS $LCTL set_param fail_val=3
+
+       USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+       $LFS changelog_clear $MDT0 $CL_USER $(($USER_REC1 + 3))
+       USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+       echo "verifying user clear: $(( $USER_REC1 + 3 )) == $USER_REC2"
+       [ $USER_REC2 == $(($USER_REC1 + 3)) ] ||
+               error "user index expected $(($USER_REC1 + 3)) is $USER_REC2"
+
+       # generate one more changelog to trigger fail_loc
+       rm -rf $DIR/$tdir || error "rm -rf $tdir failed"
+
+       # ensure gc thread is done
+       wait_update_facet $SINGLEMDS \
+                         "ps -e -o comm= | grep chlg_gc_thread" "" 20
+
+       # check user still registered
+       $GET_CL_USERS | grep -q $CL_USER ||
+               error "User $CL_USER not found in changelog_users"
+       # check user2 unregistered
+       $GET_CL_USERS | grep -q $CL_USER2 &&
+               error "User $CL_USER2 still found in changelog_users"
+
+       # check changelogs are present and starting at $USER_REC2 + 1
+       FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}')
+       echo "verifying min purge: $(( $USER_REC2 + 1 )) == $FIRST_REC"
+       [ $FIRST_REC == $(($USER_REC2 + 1)) ] ||
+               error "first index should be $(($USER_REC2 + 1)) is $FIRST_REC"
+
+       cleanup_160f
+}
+run_test 160g "changelog garbage collect (old users)"
+
 test_161a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        test_mkdir -c1 $DIR/$tdir
@@ -12142,8 +12483,12 @@ test_200() {
        local test_path=$POOL_ROOT/$POOL_DIR_NAME
        local file_dir=$POOL_ROOT/file_tst
        local subdir=$test_path/subdir
-
        local rc=0
+
+       if ! combined_mgs_mds ; then
+               mount_mgs_client
+       fi
+
        while : ; do
                # former test_200a test_200b
                pool_add $POOL                          || { rc=$? ; break; }
@@ -12163,7 +12508,7 @@ test_200() {
                pool_create_files $POOL $file_dir $files "$ost_list" \
                                                        || { rc=$? ; break; }
                # former test_200g test_200h
-               pool_lfs_df $POOL                       || { rc=$? ; break; }
+               pool_lfs_df $POOL                       || { rc=$? ; break; }
                pool_file_rel_path $POOL $test_path     || { rc=$? ; break; }
 
                # former test_201a test_201b test_201c
@@ -12171,11 +12516,15 @@ test_200() {
 
                local f=$test_path/$tfile
                pool_remove_all_targets $POOL $f        || { rc=$? ; break; }
-               pool_remove $POOL $f                    || { rc=$? ; break; }
+               pool_remove $POOL $f                    || { rc=$? ; break; }
                break
        done
 
        destroy_test_pools
+
+       if ! combined_mgs_mds ; then
+               umount_mgs_client
+       fi
        return $rc
 }
 run_test 200 "OST pools"
@@ -12616,16 +12965,12 @@ run_test 214 "hash-indexed directory test - bug 20133"
 
 # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
 create_lnet_proc_files() {
-       lctl get_param -n $1 >$TMP/lnet_$1.out || error "cannot read lnet.$1"
-       sysctl lnet.$1 >$TMP/lnet_$1.sys_tmp || error "cannot read lnet.$1"
-
-       sed "s/^lnet.$1\ =\ //g" "$TMP/lnet_$1.sys_tmp" >$TMP/lnet_$1.sys
-       rm -f "$TMP/lnet_$1.sys_tmp"
+       lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
 }
 
 # counterpart of create_lnet_proc_files
 remove_lnet_proc_files() {
-       rm -f $TMP/lnet_$1.out $TMP/lnet_$1.sys
+       rm -f $TMP/lnet_$1.sys
 }
 
 # uses 1st arg as trailing part of filename, 2nd arg as description for reports,
@@ -12735,7 +13080,6 @@ test_215() { # for bugs 18102, 21079, 21517
 
        # can we successfully write to lnet.stats?
        lctl set_param -n stats=0 || error "cannot write to lnet.stats"
-       sysctl -w lnet.stats=0 || error "cannot write to lnet.stats"
 }
 run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
 
@@ -12858,6 +13202,10 @@ test_220() { #LU-325
 
        $LFS df -i
 
+       if ! combined_mgs_mds ; then
+               mount_mgs_client
+       fi
+
        do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
        #define OBD_FAIL_OST_ENOINO              0x229
        do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
@@ -12888,10 +13236,16 @@ test_220() { #LU-325
        do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
        do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
 
-       do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST || return 4
-       do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || return 5
+       do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
+               error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
+       do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
+               error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
        echo "unlink $MDSOBJS files @$next_id..."
-       unlinkmany $DIR/$tdir/f $MDSOBJS || return 6
+       unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
+
+       if ! combined_mgs_mds ; then
+               umount_mgs_client
+       fi
 }
 run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
 
@@ -13063,8 +13417,6 @@ test_225b () {
              skip_env "Need to mount OST to test" && return
        fi
 
-       [ $MDSCOUNT -ge 2 ] &&
-               skip "skipping now for more than one MDT" && return
        local mds=$(facet_host $SINGLEMDS)
        local target=$(do_nodes $mds 'lctl dl' | \
                       awk "{if (\$2 == \"UP\" && \$3 == \"mdt\") {print \$4}}")
@@ -13316,7 +13668,7 @@ test_229() { # LU-2482, LU-3448
        $GETSTRIPE -v $DIR/$tfile
 
        local pattern=$($GETSTRIPE -L $DIR/$tfile)
-       [ X"$pattern" = X"80000001" ] || error "pattern error ($pattern)"
+       [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
 
        local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
        [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
@@ -13971,9 +14323,10 @@ test_239() {
        mkdir -p $DIR/$tdir
        createmany -o $DIR/$tdir/f- 5000
        unlinkmany $DIR/$tdir/f- 5000
-       do_nodes $list "lctl set_param -n osp*.*.sync_changes 1"
-       changes=$(do_nodes $list "lctl get_param -n osc.*MDT*.sync_changes \
-                       osc.*MDT*.sync_in_flight" | calc_sum)
+       [ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.10.53) ] &&
+               do_nodes $list "lctl set_param -n osp.*.force_sync=1"
+       changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
+                       osp.*MDT*.sync_in_flight" | calc_sum)
        [ "$changes" -eq 0 ] || error "$changes not synced"
 }
 run_test 239 "osp_sync test"
@@ -14026,7 +14379,7 @@ run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
 test_241_bio() {
        for LOOP in $(seq $1); do
                dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 2>/dev/null
-               cancel_lru_locks osc || true
+               cancel_lru_locks $OSC || true
        done
 }
 
@@ -14040,7 +14393,7 @@ test_241_dio() {
 test_241a() { # was test_241
        dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960
        ls -la $DIR/$tfile
-       cancel_lru_locks osc
+       cancel_lru_locks $OSC
        test_241_bio 1000 &
        PID=$!
        test_241_dio 1000
@@ -14128,6 +14481,14 @@ test_246() { # LU-7371
 }
 run_test 246 "Read file of size 4095 should return right length"
 
+cleanup_247() {
+       local submount=$1
+
+       trap 0
+       umount_client $submount
+       rmdir $submount
+}
+
 test_247a() {
        lctl get_param -n mdc.$FSNAME-MDT0000*.import |
                grep -q subtree ||
@@ -14139,11 +14500,11 @@ test_247a() {
        mkdir -p $submount || error "mkdir $submount failed"
        FILESET="$FILESET/$tdir" mount_client $submount ||
                error "mount $submount failed"
+       trap "cleanup_247 $submount" EXIT
        echo foo > $submount/$tfile || error "write $submount/$tfile failed"
        [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
                error "read $MOUNT/$tdir/$tfile failed"
-       umount_client $submount || error "umount $submount failed"
-       rmdir $submount
+       cleanup_247 $submount
 }
 run_test 247a "mount subdir as fileset"
 
@@ -14170,12 +14531,12 @@ test_247c() {
 
        mkdir -p $MOUNT/$tdir/dir1
        mkdir -p $submount || error "mkdir $submount failed"
+       trap "cleanup_247 $submount" EXIT
        FILESET="$FILESET/$tdir" mount_client $submount ||
                error "mount $submount failed"
        local fid=$($LFS path2fid $MOUNT/)
        $LFS fid2path $submount $fid && error "fid2path should fail"
-       umount_client $submount || error "umount $submount failed"
-       rmdir $submount
+       cleanup_247 $submount
 }
 run_test 247c "running fid2path outside root"
 
@@ -14189,10 +14550,10 @@ test_247d() {
        mkdir -p $submount || error "mkdir $submount failed"
        FILESET="$FILESET/$tdir" mount_client $submount ||
                error "mount $submount failed"
+       trap "cleanup_247 $submount" EXIT
        local fid=$($LFS path2fid $submount/dir1)
        $LFS fid2path $submount $fid || error "fid2path should succeed"
-       umount_client $submount || error "umount $submount failed"
-       rmdir $submount
+       cleanup_247 $submount
 }
 run_test 247d "running fid2path inside root"
 
@@ -14228,12 +14589,13 @@ test_248() {
        # small read with fast read enabled
        $LCTL set_param -n llite.*.fast_read=1
        local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
-               awk '/copied/ { print $6 }')
-
+               egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
+               sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
        # small read with fast read disabled
        $LCTL set_param -n llite.*.fast_read=0
        local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
-               awk '/copied/ { print $6 }')
+               egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
+               sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
 
        # verify that fast read is 4 times faster for cache read
        [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
@@ -14246,12 +14608,14 @@ test_248() {
        # 1k non-cache read
        cancel_lru_locks osc
        local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
-               awk '/copied/ { print $6 }')
+               egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
+               sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
 
        # 1M non-cache read
        cancel_lru_locks osc
        local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
-               awk '/copied/ { print $6 }')
+               egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
+               sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
 
        # verify that big IO is not 4 times faster than small IO
        [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
@@ -14414,6 +14778,9 @@ test_253() {
                        osp.$mdtosc_proc1.reserved_mb_low)
        echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
 
+       if ! combined_mgs_mds ; then
+               mount_mgs_client
+       fi
        create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
        do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
                error "Adding $ost_name to pool failed"
@@ -14478,6 +14845,10 @@ test_253() {
                error "Remove $ost_name from pool failed"
        do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
                error "Pool destroy fialed"
+
+       if ! combined_mgs_mds ; then
+               umount_mgs_client
+       fi
 }
 run_test 253 "Check object allocation limit"
 
@@ -14617,7 +14988,7 @@ ladvise_willread_performance()
 
        local lowest_speedup=20
        if [ ${average_cache%.*} -lt $lowest_speedup ]; then
-               echo "Speedup with OSS cached read less than $lowest_speedup%, "
+               echo "Speedup with OSS cached read less than $lowest_speedup%," \
                        "got $average_cache%. Skipping ladvise willread check."
                return 0
        fi
@@ -14789,6 +15160,10 @@ test_255c() {
        local difference
        local i
        local rc
+
+       [ $(lustre_version_code ost1) -lt $(version_code 2.10.50) ] &&
+               skip "lustre < 2.10.53 does not support lockahead" && return
+
        test_mkdir -p $DIR/$tdir
        $SETSTRIPE -i 0 $DIR/$tdir
 
@@ -14842,9 +15217,9 @@ test_255c() {
                       ldlm.namespaces.$FSNAME-OST0000*osc-f*.lock_unused_count)
                difference="$((new_count - count))"
 
-               # Test 15 output is divided by 1000 to map down to valid return
+               # Test 15 output is divided by 100 to map down to valid return
                if [ $i -eq 15 ]; then
-                       rc="$((rc * 1000))"
+                       rc="$((rc * 100))"
                fi
 
                if [ $difference -ne $rc ]; then
@@ -14902,11 +15277,12 @@ test_256() {
 
        #after mount new plainllog is used
        touch $DIR/$tdir/{11..19}
-       local TEMP256FILE=$(mktemp TEMP256XXXXXX)
+       do_facet mds1 sync
+       local TEMP256FILE=$(mktemp -u TEMP256XXXXXX)
        cat_sl=$(do_facet mds1 \
        "$DEBUGFS -R \\\"dump changelog_catalog $TEMP256FILE\\\" $mdt_dev; \
         llog_reader $TEMP256FILE | grep \\\"type=1064553b\\\" | wc -l")
-       rm $TEMP256FILE
+       do_facet mds1 rm $TEMP256FILE
 
        if (( cat_sl != 2 )); then
                do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user
@@ -14915,11 +15291,12 @@ test_256() {
 
        $LFS changelog_clear $MDT0 $cl_user 0
 
-       TEMP256FILE=$(mktemp TEMP256XXXXXX)
+       do_facet mds1 sync
+       TEMP256FILE=$(mktemp -u TEMP256XXXXXX)
        cat_sl=$(do_facet mds1 \
        "$DEBUGFS -R \\\"dump changelog_catalog $TEMP256FILE\\\" $mdt_dev; \
         llog_reader $TEMP256FILE | grep \\\"type=1064553b\\\" | wc -l")
-       rm $TEMP256FILE
+       do_facet mds1 rm $TEMP256FILE
 
        do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user
 
@@ -14996,6 +15373,401 @@ test_260() {
 }
 run_test 260 "Check mdc_close fail"
 
+### Data-on-MDT sanity tests ###
+test_270a() {
+
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       # create DoM file
+       local dom=$DIR/$tdir/dom_file
+       local tmp=$DIR/$tdir/tmp_file
+
+       mkdir -p $DIR/$tdir
+
+       # basic checks for DoM component creation
+       $LFS setstripe -E 1024K -E 1024K -L mdt $dom 2>/dev/null &&
+               error "Can set MDT layout to non-first entry"
+
+       $LFS setstripe -E 1024K -L mdt -E 1024K -L mdt $dom 2>/dev/null &&
+               error "Can define multiple entries as MDT layout"
+
+       $LFS setstripe -E 1M -L mdt $dom ||
+               error "Can't create DoM layout"
+
+       [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
+       [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
+       [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
+
+       local mdtidx=$($GETSTRIPE -M $dom)
+       local mdtname=MDT$(printf %04x $mdtidx)
+       local facet=mds$((mdtidx + 1))
+       local space_check=1
+
+       # Skip free space checks with ZFS
+       if [ "$(facet_fstype $facet)" == "zfs" ]; then
+               space_check=0
+       fi
+
+       # write
+       sync
+       local mdtfree1=$(do_facet $facet \
+               lctl get_param -n osd*.*$mdtname.kbytesfree)
+       dd if=/dev/urandom of=$tmp bs=1024 count=100
+       # check also direct IO along write
+       dd if=$tmp of=$dom bs=102400 count=1 oflag=direct
+       sync
+       cmp $tmp $dom || error "file data is different"
+       [ $(stat -c%s $dom) == 102400 ] || error "bad size after write"
+       if [ $space_check == 1 ]; then
+               local mdtfree2=$(do_facet $facet \
+                               lctl get_param -n osd*.*$mdtname.kbytesfree)
+               [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] ||
+                       error "MDT free space is wrong after write"
+       fi
+
+       # truncate
+       $TRUNCATE $dom 10000
+       [ $(stat -c%s $dom) == 10000 ] || error "bad size after truncate"
+       if [ $space_check == 1 ]; then
+               mdtfree1=$(do_facet $facet \
+                               lctl get_param -n osd*.*$mdtname.kbytesfree)
+               [ $(($mdtfree1 - $mdtfree2)) -ge 92 ] ||
+                       error "MDT free space is wrong after truncate"
+       fi
+
+       # append
+       cat $tmp >> $dom
+       sync
+       [ $(stat -c%s $dom) == 112400 ] || error "bad size after append"
+       if [ $space_check == 1 ]; then
+               mdtfree2=$(do_facet $facet \
+                               lctl get_param -n osd*.*$mdtname.kbytesfree)
+               [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] ||
+                       error "MDT free space is wrong after append"
+       fi
+
+       # delete
+       rm $dom
+       if [ $space_check == 1 ]; then
+               mdtfree1=$(do_facet $facet \
+                               lctl get_param -n osd*.*$mdtname.kbytesfree)
+               [ $(($mdtfree1 - $mdtfree2)) -ge 112 ] ||
+                       error "MDT free space is wrong after removal"
+       fi
+
+       # combined striping
+       $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
+               error "Can't create DoM + OST striping"
+
+       dd if=/dev/urandom of=$tmp bs=1024 count=2000
+       # check also direct IO along write
+       dd if=$tmp of=$dom bs=102400 count=20 oflag=direct
+       sync
+       cmp $tmp $dom || error "file data is different"
+       [ $(stat -c%s $dom) == 2048000 ] || error "bad size after write"
+       rm $dom
+       rm $tmp
+
+       return 0
+}
+run_test 270a "DoM: basic functionality tests"
+
+test_270b() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       local dom=$DIR/$tdir/dom_file
+       local max_size=1048576
+
+       mkdir -p $DIR/$tdir
+       $LFS setstripe -E $max_size -L mdt $dom
+
+       # truncate over the limit
+       $TRUNCATE $dom $(($max_size + 1)) &&
+               error "successful truncate over the maximum size"
+       # write over the limit
+       dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
+               error "successful write over the maximum size"
+       # append over the limit
+       dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
+       echo "12345" >> $dom && error "successful append over the maximum size"
+       rm $dom
+
+       return 0
+}
+run_test 270b "DoM: maximum size overflow checks for DoM-only file"
+
+test_270c() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       mkdir -p $DIR/$tdir
+       $LFS setstripe -E 1024K -L mdt $DIR/$tdir
+
+       # check files inherit DoM EA
+       touch $DIR/$tdir/first
+       [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
+               error "bad pattern"
+       [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
+               error "bad stripe count"
+       [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
+               error "bad stripe size"
+
+       # check directory inherits DoM EA and uses it as default
+       mkdir $DIR/$tdir/subdir
+       touch $DIR/$tdir/subdir/second
+       [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
+               error "bad pattern in sub-directory"
+       [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
+               error "bad stripe count in sub-directory"
+       [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
+               error "bad stripe size in sub-directory"
+       return 0
+}
+run_test 270c "DoM: DoM EA inheritance tests"
+
+test_270d() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       mkdir -p $DIR/$tdir
+       $LFS setstripe -E 1024K -L mdt $DIR/$tdir
+
+       # inherit default DoM striping
+       mkdir $DIR/$tdir/subdir
+       touch $DIR/$tdir/subdir/f1
+
+       # change default directory striping
+       $LFS setstripe -c 1 $DIR/$tdir/subdir
+       touch $DIR/$tdir/subdir/f2
+       [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
+               error "wrong default striping in file 2"
+       [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
+               error "bad pattern in file 2"
+       return 0
+}
+run_test 270d "DoM: change striping from DoM to RAID0"
+
+test_270e() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       mkdir -p $DIR/$tdir/dom
+       mkdir -p $DIR/$tdir/norm
+       DOMFILES=20
+       NORMFILES=10
+       $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
+       $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
+
+       createmany -o $DIR/$tdir/dom/dom- $DOMFILES
+       createmany -o $DIR/$tdir/norm/norm- $NORMFILES
+
+       # find DoM files by layout
+       NUM=$($LFIND -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
+       [ $NUM -eq  $DOMFILES ] ||
+               error "lfs find -L: found $NUM, expected $DOMFILES"
+       echo "Test 1: lfs find 20 DOM files by layout: OK"
+
+       # there should be 1 dir with default DOM striping
+       NUM=$($LFIND -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
+       [ $NUM -eq  1 ] ||
+               error "lfs find -L: found $NUM, expected 1 dir"
+       echo "Test 2: lfs find 1 DOM dir by layout: OK"
+
+       # find DoM files by stripe size
+       NUM=$($LFIND -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
+       [ $NUM -eq  $DOMFILES ] ||
+               error "lfs find -S: found $NUM, expected $DOMFILES"
+       echo "Test 4: lfs find 20 DOM files by stripe size: OK"
+
+       # find files by stripe offset except DoM files
+       NUM=$($LFIND -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
+       [ $NUM -eq  $NORMFILES ] ||
+               error "lfs find -i: found $NUM, expected $NORMFILES"
+       echo "Test 5: lfs find no DOM files by stripe index: OK"
+       return 0
+}
+run_test 270e "DoM: lfs find with DoM files test"
+
+test_270f() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       local mdtname=${FSNAME}-MDT0000-mdtlov
+       local dom=$DIR/$tdir/dom_file
+       local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
+                                               lod.$mdtname.dom_stripesize)
+       local dom_limit=131072
+
+       do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
+       local dom_current=$(do_facet mds1 $LCTL get_param -n \
+                                               lod.$mdtname.dom_stripesize)
+       [ ${dom_limit} -eq ${dom_current} ] ||
+               error "Cannot change per-MDT DoM stripe limit to $dom_limit"
+
+       $LFS mkdir -i 0 -c 1 $DIR/$tdir
+       $LFS setstripe -d $DIR/$tdir
+       $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
+               error "Can't set directory default striping"
+
+       # exceed maximum stripe size
+       $LFS setstripe -E $(($dom_limit * 2)) -L mdt $dom &&
+               error "Able to create DoM component size more than LOD limit"
+
+       do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
+       dom_current=$(do_facet mds1 $LCTL get_param -n \
+                                               lod.$mdtname.dom_stripesize)
+       [ 0 -eq ${dom_current} ] ||
+               error "Can't set zero DoM stripe limit"
+
+       # too low values to be aligned with smallest stripe size 64K
+       do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
+       dom_current=$(do_facet mds1 $LCTL get_param -n \
+                                               lod.$mdtname.dom_stripesize)
+       [ 30000 -eq ${dom_current} ] &&
+               error "Can set too small DoM stripe limit"
+
+       do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
+       dom_current=$(do_facet mds1 $LCTL get_param -n \
+                                               lod.$mdtname.dom_stripesize)
+       echo $dom_current
+       [ 2147483648 -eq ${dom_current} ] &&
+               error "Can set too large DoM stripe limit"
+
+       do_facet mds1 $LCTL set_param -n \
+                               lod.$mdtname.dom_stripesize=$((dom_limit * 2))
+       $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
+               error "Can't create DoM component size after limit change"
+       do_facet mds1 $LCTL set_param -n \
+                               lod.$mdtname.dom_stripesize=$((dom_limit / 2))
+       $LFS setstripe -E $dom_limit -L mdt ${dom}_big &&
+               error "Can create big DoM component after limit decrease"
+       touch ${dom}_def ||
+               error "Can't create file with old default layout"
+
+       do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
+       return 0
+}
+run_test 270f "DoM: maximum DoM stripe size checks"
+
+test_271a() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       local dom=$DIR/$tdir/dom
+
+       mkdir -p $DIR/$tdir
+
+       $LFS setstripe -E 1024K -L mdt $dom
+
+       lctl set_param -n mdc.*.stats=clear
+       dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
+       cat $dom > /dev/null
+       local reads=$(lctl get_param -n mdc.*.stats |
+                       awk '/ost_read/ {print $2}')
+       [ -z $reads ] || error "Unexpected $reads READ RPCs"
+       ls $dom
+       rm -f $dom
+}
+run_test 271a "DoM: data is cached for read after write"
+
+test_271b() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       local dom=$DIR/$tdir/dom
+
+       mkdir -p $DIR/$tdir
+
+       $LFS setstripe -E 1024K -L mdt -E EOF $dom
+
+       lctl set_param -n mdc.*.stats=clear
+       dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
+       cancel_lru_locks mdc
+       $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
+       # second stat to check size is cached on client
+       $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
+       local gls=$(lctl get_param -n mdc.*.stats |
+                       awk '/ldlm_glimpse/ {print $2}')
+       [ -z $gls ] || error "Unexpected $gls glimpse RPCs"
+       rm -f $dom
+}
+run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
+
+test_271ba() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       local dom=$DIR/$tdir/dom
+
+       mkdir -p $DIR/$tdir
+
+       $LFS setstripe -E 1024K -L mdt -E EOF $dom
+
+       lctl set_param -n mdc.*.stats=clear
+       lctl set_param -n osc.*.stats=clear
+       dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
+       cancel_lru_locks mdc
+       $CHECKSTAT -t file -s 2097152 $dom || error "stat"
+       # second stat to check size is cached on client
+       $CHECKSTAT -t file -s 2097152 $dom || error "stat"
+       local gls=$(lctl get_param -n mdc.*.stats |
+                       awk '/ldlm_glimpse/ {print $2}')
+       [ -z $gls ] || error "Unexpected $gls glimpse RPCs"
+       local gls=$(lctl get_param -n osc.*.stats |
+                       awk '/ldlm_glimpse/ {print $2}')
+       [ -z $gls ] || error "Unexpected $gls OSC glimpse RPCs"
+       rm -f $dom
+}
+run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
+
+test_271c() {
+       # test to be enabled with lock_convert
+       skip "skipped until lock convert will be implemented" && return
+
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+               skip "Need MDS version at least 2.10.55" && return
+
+       local dom=$DIR/$tdir/dom
+
+       mkdir -p $DIR/$tdir
+
+       $LFS setstripe -E 1024K -L mdt $DIR/$tdir
+
+       local mdtidx=$($LFS getstripe -M $DIR/$tdir)
+       local facet=mds$((mdtidx + 1))
+
+       cancel_lru_locks mdc
+       do_facet $facet lctl set_param -n mdt.*.dom_lock=0
+       createmany -o $dom 1000
+       lctl set_param -n mdc.*.stats=clear
+       smalliomany -w $dom 1000 200
+       lctl get_param -n mdc.*.stats
+       local enq=$(lctl get_param -n mdc.*.stats |
+                       awk '/ldlm_ibits_enqueue/ {print $2}')
+       # Each file has 1 open, 1 IO enqueues, total 2000
+       # but now we have also +1 getxattr for security.capability, total 3000
+       [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
+       unlinkmany $dom 1000
+
+       cancel_lru_locks mdc
+       do_facet $facet lctl set_param -n mdt.*.dom_lock=1
+       createmany -o $dom 1000
+       lctl set_param -n mdc.*.stats=clear
+       smalliomany -w $dom 1000 200
+       lctl get_param -n mdc.*.stats
+       local enq_2=$(lctl get_param -n mdc.*.stats |
+                       awk '/ldlm_ibits_enqueue/ {print $2}')
+       # Expect to see reduced amount of RPCs by 1000 due to single enqueue
+       # for OPEN and IO lock.
+       [ $((enq - enq_2)) -ge 1000 ] ||
+               error "Too many enqueues $enq_2, expected about $((enq - 1000))"
+       unlinkmany $dom 1000
+       return 0
+}
+run_test 271c "DoM: IO lock at open saves enqueue RPCs"
+
 cleanup_test_300() {
        trap 0
        umask $SAVE_UMASK
@@ -15320,17 +16092,17 @@ test_300g() {
        $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
                error "create striped_dir failed"
 
+       $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
+               error "create dir0 fails"
+       stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
+       [ $stripe_index -eq 0 ] ||
+               error "dir0 expect index 0 got $stripe_index"
+
        mkdir $DIR/$tdir/striped_dir/dir1 ||
                error "create dir1 fails"
        stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
        [ $stripe_index -eq 1 ] ||
-               error "dir1 expect 1 got $stripe_index"
-
-       $LFS setdirstripe -i2 $DIR/$tdir/striped_dir/dir2 ||
-               error "create dir2 fails"
-       stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir2)
-       [ $stripe_index -eq 2 ] ||
-               error "dir2 expect 2 got $stripe_index"
+               error "dir1 expect index 1 got $stripe_index"
 
        #check default stripe count/stripe index
        test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
@@ -15920,6 +16692,15 @@ test_313() {
 }
 run_test 313 "io should fail after last_rcvd update fail"
 
+test_314() {
+       $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
+       do_facet ost1 "$LCTL set_param fail_loc=0x720"
+       rm -f $DIR/$tfile
+       wait_delete_completed
+       do_facet ost1 "$LCTL set_param fail_loc=0"
+}
+run_test 314 "OSP shouldn't fail after last_rcvd update failure"
+
 test_fake_rw() {
        local read_write=$1
        if [ "$read_write" = "write" ]; then
@@ -16189,7 +16970,7 @@ test_403() {
 
        wait
 
-       [ `cat $tfile` -gt 0 ] || error "wrong nlink count: `cat $tfile`"
+       [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
 
        rm -f $tfile $file1 $file2
 }
@@ -16251,8 +17032,11 @@ test_406() {
        local def_stripe_size=$($GETSTRIPE -S $MOUNT)
        local def_stripe_offset=$($GETSTRIPE -i $MOUNT)
        local def_pool=$($GETSTRIPE -p $MOUNT)
-
        local test_pool=$TESTNAME
+
+       if ! combined_mgs_mds ; then
+               mount_mgs_client
+       fi
        pool_add $test_pool || error "pool_add failed"
        pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
                error "pool_add_targets failed"
@@ -16314,6 +17098,10 @@ test_406() {
        local f=$DIR/$tdir/$tfile
        pool_remove_all_targets $test_pool $f
        pool_remove $test_pool $f
+
+       if ! combined_mgs_mds ; then
+               umount_mgs_client
+       fi
 }
 run_test 406 "DNE support fs default striping"