Whamcloud - gitweb
LU-4131 mdd: Changelog not logging file truncate.
[fs/lustre-release.git] / lustre / tests / sanity.sh
index f580097..7a430d0 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/bash
-# -*- tab-width: 4; indent-tabs-mode: t; -*-
+# -*- tab-width: 8; indent-tabs-mode: t; -*-
 #
 # Run select tests by setting ONLY, or as arguments to the script.
 # Skip specific tests by setting EXCEPT.
@@ -58,7 +58,7 @@ init_test_env $@
 . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
 init_logging
 
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d"
 
 [ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
 # bug number for skipped test:        LU-1593 LU-2610 LU-2833 LU-1957 LU-2805
@@ -106,8 +106,8 @@ check_and_setup_lustre
 DIR=${DIR:-$MOUNT}
 assert_DIR
 
-MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid | \
-    awk '{gsub(/_UUID/,""); print $1}' | head -1)
+MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid |
+       awk '{ gsub(/_UUID/,""); print $1 }' | head -n1)
 LOVNAME=$($LCTL get_param -n llite.*.lov.common_name | tail -n 1)
 OSTCOUNT=$($LCTL get_param -n lov.$LOVNAME.numobd)
 STRIPECOUNT=$($LCTL get_param -n lov.$LOVNAME.stripecount)
@@ -193,6 +193,25 @@ test_3() {
 }
 run_test 3 "mkdir; touch; rmdir; check dir ====================="
 
+# LU-4471 - failed rmdir on remote directories still removes directory on MDT0
+test_4() {
+       local MDTIDX=1
+       local remote_dir=remote_dir
+
+       [ $MDSCOUNT -ge 2 ] && skip "skip now for LU-4690" && return #LU-4690
+       test_mkdir $DIR/$remote_dir ||
+               error "Create remote directory failed"
+
+       touch $DIR/$remote_dir/$tfile ||
+               error "Create file under remote directory failed"
+
+       rmdir $DIR/$remote_dir &&
+               error "Expect error removing in-use dir $DIR/$remote_dir"
+
+       test -d $DIR/$remote_dir || error "Remote directory disappeared"
+}
+run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
+
 test_5() {
        test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
        test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
@@ -496,9 +515,9 @@ test_17i() { #bug 20018
 run_test 17i "don't panic on short symlink"
 
 test_17k() { #bug 22301
-        rsync --help | grep -q xattr ||
-                skip_env "$(rsync --version| head -1) does not support xattrs"
-       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       rsync --help | grep -q xattr ||
+               skip_env "$(rsync --version | head -n1) does not support xattrs"
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return 0
        test_mkdir -p $DIR/$tdir
        test_mkdir -p $DIR/$tdir.new
        touch $DIR/$tdir/$tfile
@@ -632,14 +651,35 @@ test_17n() {
                        error "create files under remote dir failed $i"
        done
 
-       check_fs_consistency_17n || error "e2fsck report error"
+       check_fs_consistency_17n ||
+               error "e2fsck report error after create files under remote dir"
 
        for ((i=0;i<10;i++)); do
                rm -rf $DIR/$tdir/remote_dir_${i} ||
                        error "destroy remote dir error $i"
        done
 
-       check_fs_consistency_17n || error "e2fsck report error"
+       check_fs_consistency_17n ||
+               error "e2fsck report error after unlink files under remote dir"
+
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.50) ] &&
+               skip "lustre < 2.4.50 does not support migrate mv " && return
+
+       for ((i=0; i<10; i++)); do
+               mkdir -p $DIR/$tdir/remote_dir_${i}
+               createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
+                       error "create files under remote dir failed $i"
+               $LFS mv -M 1 $DIR/$tdir/remote_dir_${i} ||
+                       error "migrate remote dir error $i"
+       done
+       check_fs_consistency_17n || error "e2fsck report error after migration"
+
+       for ((i=0;i<10;i++)); do
+               rm -rf $DIR/$tdir/remote_dir_${i} ||
+                       error "destroy remote dir error $i"
+       done
+
+       check_fs_consistency_17n || error "e2fsck report error after unlink"
 }
 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
 
@@ -792,9 +832,9 @@ test_24c() {
 run_test 24c "rename directory to non-existent target"
 
 test_24d() {
-       test_mkdir $DIR/$tdir
-       test_mkdir $DIR/$tdir/d$testnum.1
-       test_mkdir $DIR/$tdir/d$testnum.2
+       test_mkdir -c1 $DIR/$tdir
+       test_mkdir -c1 $DIR/$tdir/d$testnum.1
+       test_mkdir -c1 $DIR/$tdir/d$testnum.2
        mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
        $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
        $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
@@ -833,10 +873,10 @@ test_24g() {
 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======"
 
 test_24h() {
-       test_mkdir $DIR/R8a
-       test_mkdir $DIR/R8b
-       test_mkdir $DIR/R8a/d
-       test_mkdir $DIR/R8b/e
+       test_mkdir -c1 $DIR/R8a
+       test_mkdir -c1 $DIR/R8b
+       test_mkdir -c1 $DIR/R8a/d
+       test_mkdir -c1 $DIR/R8b/e
        mrename $DIR/R8a/d $DIR/R8b/e
        $CHECKSTAT -a $DIR/R8a/d || error
        $CHECKSTAT -t dir $DIR/R8b/e || error
@@ -991,7 +1031,7 @@ simple_cleanup_common() {
 }
 
 max_pages_per_rpc() {
-       $LCTL get_param -n mdc.*.max_pages_per_rpc | head -1
+       $LCTL get_param -n mdc.*.max_pages_per_rpc | head -n1
 }
 
 test_24v() {
@@ -2044,76 +2084,74 @@ test_31f() { # bug 4554
 run_test 31f "remove of open directory with open-unlink file ==="
 
 test_31g() {
-        echo "-- cross directory link --"
-        test_mkdir $DIR/d31ga
-        test_mkdir $DIR/d31gb
-        touch $DIR/d31ga/f
-        ln $DIR/d31ga/f $DIR/d31gb/g
-        $CHECKSTAT -t file $DIR/d31ga/f || error "source"
-        [ `stat -c%h $DIR/d31ga/f` == '2' ] || error "source nlink"
-        $CHECKSTAT -t file $DIR/d31gb/g || error "target"
-        [ `stat -c%h $DIR/d31gb/g` == '2' ] || error "target nlink"
+       echo "-- cross directory link --"
+       test_mkdir -c1 $DIR/${tdir}ga
+       test_mkdir -c1 $DIR/${tdir}gb
+       touch $DIR/${tdir}ga/f
+       ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g
+       $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source"
+       [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink"
+       $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target"
+       [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink"
 }
 run_test 31g "cross directory link==============="
 
 test_31h() {
-        echo "-- cross directory link --"
-        test_mkdir $DIR/d31h
-        test_mkdir $DIR/d31h/dir
-        touch $DIR/d31h/f
-        ln $DIR/d31h/f $DIR/d31h/dir/g
-        $CHECKSTAT -t file $DIR/d31h/f || error "source"
-        [ `stat -c%h $DIR/d31h/f` == '2' ] || error "source nlink"
-        $CHECKSTAT -t file $DIR/d31h/dir/g || error "target"
-        [ `stat -c%h $DIR/d31h/dir/g` == '2' ] || error "target nlink"
+       echo "-- cross directory link --"
+       test_mkdir -c1 $DIR/${tdir}
+       test_mkdir -c1 $DIR/${tdir}/dir
+       touch $DIR/${tdir}/f
+       ln $DIR/${tdir}/f $DIR/${tdir}/dir/g
+       $CHECKSTAT -t file $DIR/${tdir}/f || error "source"
+       [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink"
+       $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target"
+       [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink"
 }
 run_test 31h "cross directory link under child==============="
 
 test_31i() {
-        echo "-- cross directory link --"
-        test_mkdir $DIR/d31i
-        test_mkdir $DIR/d31i/dir
-        touch $DIR/d31i/dir/f
-        ln $DIR/d31i/dir/f $DIR/d31i/g
-        $CHECKSTAT -t file $DIR/d31i/dir/f || error "source"
-        [ `stat -c%h $DIR/d31i/dir/f` == '2' ] || error "source nlink"
-        $CHECKSTAT -t file $DIR/d31i/g || error "target"
-        [ `stat -c%h $DIR/d31i/g` == '2' ] || error "target nlink"
+       echo "-- cross directory link --"
+       test_mkdir -c1 $DIR/$tdir
+       test_mkdir -c1 $DIR/$tdir/dir
+       touch $DIR/$tdir/dir/f
+       ln $DIR/$tdir/dir/f $DIR/$tdir/g
+       $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source"
+       [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink"
+       $CHECKSTAT -t file $DIR/$tdir/g || error "target"
+       [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink"
 }
 run_test 31i "cross directory link under parent==============="
 
-
 test_31j() {
-        test_mkdir $DIR/d31j
-        test_mkdir $DIR/d31j/dir1
-        ln $DIR/d31j/dir1 $DIR/d31j/dir2 && error "ln for dir"
-        link $DIR/d31j/dir1 $DIR/d31j/dir3 && error "link for dir"
-        mlink $DIR/d31j/dir1 $DIR/d31j/dir4 && error "mlink for dir"
-        mlink $DIR/d31j/dir1 $DIR/d31j/dir1 && error "mlink to the same dir"
+       test_mkdir -c1 -p $DIR/$tdir
+       test_mkdir -c1 -p $DIR/$tdir/dir1
+       ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir"
+       link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir"
+       mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir"
+       mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir"
        return 0
 }
 run_test 31j "link for directory==============="
 
-
 test_31k() {
-        test_mkdir $DIR/d31k
-        touch $DIR/d31k/s
-        touch $DIR/d31k/exist
-        mlink $DIR/d31k/s $DIR/d31k/t || error "mlink"
-        mlink $DIR/d31k/s $DIR/d31k/exist && error "mlink to exist file"
-        mlink $DIR/d31k/s $DIR/d31k/s && error "mlink to the same file"
-        mlink $DIR/d31k/s $DIR/d31k && error "mlink to parent dir"
-        mlink $DIR/d31k $DIR/d31k/s && error "mlink parent dir to target"
-        mlink $DIR/d31k/not-exist $DIR/d31k/foo && error "mlink non-existing to new"
-        mlink $DIR/d31k/not-exist $DIR/d31k/s && error "mlink non-existing to exist"
+        test_mkdir -c1 -p $DIR/$tdir
+        touch $DIR/$tdir/s
+        touch $DIR/$tdir/exist
+        mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink"
+        mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file"
+        mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file"
+        mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir"
+        mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target"
+        mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new"
+        mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist"
        return 0
 }
 run_test 31k "link to file: the same, non-existing, dir==============="
 
 test_31m() {
-        test_mkdir $DIR/d31m
+        mkdir $DIR/d31m
         touch $DIR/d31m/s
-        test_mkdir $DIR/d31m2
+        mkdir $DIR/d31m2
         touch $DIR/d31m2/exist
         mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink"
         mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file"
@@ -3990,6 +4028,16 @@ find_loop_dev() {
        done
 }
 
+cleanup_54c() {
+       loopdev="$DIR/loop54c"
+
+       trap 0
+       $UMOUNT -d $tdir || rc=$?
+       losetup -d $loopdev || true
+       rm $loopdev
+       return $rc
+}
+
 test_54c() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        tfile="$DIR/f54c"
@@ -4000,17 +4048,16 @@ test_54c() {
        [ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return
        mknod $loopdev b 7 $LOOPNUM
        echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..."
-       dd if=/dev/zero of=$tfile bs=`page_size` seek=1024 count=1 > /dev/null
+       dd if=/dev/zero of=$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null
        losetup $loopdev $tfile || error "can't set up $loopdev for $tfile"
+       trap cleanup_54c EXIT
        mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
        test_mkdir -p $tdir
        mount -t ext2 $loopdev $tdir || error "error mounting $loopdev on $tdir"
        dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write"
        df $tdir
        dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read"
-       $UMOUNT -d $tdir
-       losetup -d $loopdev
-       rm $loopdev
+       cleanup_54c
 }
 run_test 54c "block device works in lustre ====================="
 
@@ -4093,23 +4140,24 @@ run_test 56a "check $GETSTRIPE"
 NUMFILES=3
 NUMDIRS=3
 setup_56() {
-        local LOCAL_NUMFILES="$1"
-        local LOCAL_NUMDIRS="$2"
-        local MKDIR_PARAMS="$3"
-
-        if [ ! -d "$TDIR" ] ; then
-                test_mkdir -p $TDIR
-                [ "$MKDIR_PARAMS" ] && $SETSTRIPE $MKDIR_PARAMS $TDIR
-                for i in `seq 1 $LOCAL_NUMFILES` ; do
-                        touch $TDIR/file$i
-                done
-                for i in `seq 1 $LOCAL_NUMDIRS` ; do
-                        test_mkdir $TDIR/dir$i
-                        for j in `seq 1 $LOCAL_NUMFILES` ; do
-                                touch $TDIR/dir$i/file$j
-                        done
-                done
-        fi
+       local LOCAL_NUMFILES="$1"
+       local LOCAL_NUMDIRS="$2"
+       local MKDIR_PARAMS="$3"
+       local DIR_STRIPE_PARAMS="$4"
+
+       if [ ! -d "$TDIR" ] ; then
+               test_mkdir -p $DIR_STRIPE_PARAMS $TDIR
+               [ "$MKDIR_PARAMS" ] && $SETSTRIPE $MKDIR_PARAMS $TDIR
+               for i in `seq 1 $LOCAL_NUMFILES` ; do
+                       touch $TDIR/file$i
+               done
+               for i in `seq 1 $LOCAL_NUMDIRS` ; do
+                       test_mkdir $DIR_STRIPE_PARAMS $TDIR/dir$i
+                       for j in `seq 1 $LOCAL_NUMFILES` ; do
+                               touch $TDIR/dir$i/file$j
+                       done
+               done
+       fi
 }
 
 setup_56_special() {
@@ -4237,7 +4285,6 @@ run_test 56n "check lfs find -type l ============================="
 test_56o() {
        TDIR=$DIR/${tdir}o
        setup_56 $NUMFILES $NUMDIRS
-
        utime $TDIR/file1 > /dev/null || error "utime (1)"
        utime $TDIR/file2 > /dev/null || error "utime (2)"
        utime $TDIR/dir1 > /dev/null || error "utime (3)"
@@ -4528,7 +4575,7 @@ test_56w() {
        TDIR=$DIR/${tdir}w
 
     rm -rf $TDIR || error "remove $TDIR failed"
-    setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT"
+    setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
 
     local stripe_size
     stripe_size=$($GETSTRIPE -S -d $TDIR) ||
@@ -5578,7 +5625,8 @@ test_78() { # bug 10901
        [ $F78SIZE -gt $MEMTOTAL ] && F78SIZE=$MEMTOTAL
        [ $F78SIZE -gt 512 ] && F78SIZE=512
        [ $F78SIZE -gt $((MAXFREE / 1024)) ] && F78SIZE=$((MAXFREE / 1024))
-       SMALLESTOST=`lfs df $DIR |grep OST | awk '{print $4}' |sort -n |head -1`
+       SMALLESTOST=$(lfs df $DIR | grep OST | awk '{ print $4 }' | sort -n |
+               head -n1)
        echo "Smallest OST: $SMALLESTOST"
        [ $SMALLESTOST -lt 10240 ] && \
                skip "too small OSTSIZE, useless to run large O_DIRECT test" && return 0
@@ -5589,12 +5637,12 @@ test_78() { # bug 10901
        [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
        echo "File size: $F78SIZE"
        $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
-       for i in `seq 1 $NSEQ`
-       do
-               FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
-               echo directIO rdwr round $i of $NSEQ
-               $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
-       done
+       for i in `seq 1 $NSEQ`
+       do
+               FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
+               echo directIO rdwr round $i of $NSEQ
+               $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
+       done
 
        rm -f $DIR/$tfile
 }
@@ -6502,6 +6550,25 @@ test_102n() { # LU-4101 mdt: protect internal xattrs
 }
 run_test 102n "silently ignore setxattr on internal trusted xattrs"
 
+test_102p() { # LU-4703 setxattr did not check ownership
+       local testfile=$DIR/$tfile
+
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.56) ] &&
+               skip "MDS needs to be at least 2.5.56" && return
+
+       touch $testfile
+
+       echo "setfacl as user..."
+       $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
+       [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
+
+       echo "setfattr as user..."
+       setfacl -m "u:$RUNAS_ID:---" $testfile
+       $RUNAS setfattr -x system.posix_acl_access $testfile
+       [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
+}
+run_test 102p "check setxattr(2) correctly fails without permission"
+
 run_acl_subtest()
 {
     $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
@@ -6552,7 +6619,11 @@ test_103 () {
        fi
 
        echo "LU-2561 newly created file is same size as directory..."
-       run_acl_subtest 2561 || error "LU-2561 test failed"
+       if [ $(facet_fstype $SINGLEMDS) != "zfs" ]; then
+               run_acl_subtest 2561 || error "LU-2561 test failed"
+       else
+               run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
+       fi
 
        cd $SAVE_PWD
        umask $SAVE_UMASK
@@ -6764,7 +6835,7 @@ test_116a() { # was previously test_116()
 
        echo -n "Free space priority "
        do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free |
-               head -1
+               head -n1
        declare -a AVAIL
        free_min_max
 
@@ -6778,7 +6849,7 @@ test_116a() { # was previously test_116()
        local DIFF2=$(($DIFF * 100 / $MINV))
 
        local threshold=$(do_facet $SINGLEMDS \
-               lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -1)
+               lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
        threshold=${threshold%%%}
        echo -n "Check for uneven OSTs: "
        echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
@@ -6878,14 +6949,17 @@ test_116b() { # LU-2093
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
 #define OBD_FAIL_MDS_OSC_CREATE_FAIL     0x147
        local old_rr
-       old_rr=$(do_facet $SINGLEMDS lctl get_param -n lov.*mdtlov*.qos_threshold_rr)
-       do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr 0
+       old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
+               lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
+       do_facet $SINGLEMDS lctl set_param \
+               lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
        mkdir -p $DIR/$tdir
        do_facet $SINGLEMDS lctl set_param fail_loc=0x147
        createmany -o $DIR/$tdir/f- 20 || error "can't create"
        do_facet $SINGLEMDS lctl set_param fail_loc=0
        rm -rf $DIR/$tdir
-       do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr $old_rr
+       do_facet $SINGLEMDS lctl set_param \
+               lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
 }
 run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
 
@@ -6906,7 +6980,7 @@ NO_SLOW_RESENDCOUNT=4
 export OLD_RESENDCOUNT=""
 set_resend_count () {
        local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
-       OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -1)
+       OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
        lctl set_param -n $PROC_RESENDCOUNT $1
        echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
 }
@@ -7368,7 +7442,7 @@ run_test 119d "The DIO path should try to send a new rpc once one is completed"
 
 test_120a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-        test_mkdir -p $DIR/$tdir
+       test_mkdir -p $DIR/$tdir
         [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
                skip "no early lock cancel on server" && return 0
 
@@ -7378,89 +7452,113 @@ test_120a() {
        # asynchronous object destroy at MDT could cause bl ast to client
        cancel_lru_locks osc
 
-        stat $DIR/$tdir > /dev/null
-        can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
-        blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
-        test_mkdir $DIR/$tdir/d1
-        can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
-        blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
-        [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
-        [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
-        lru_resize_enable mdc
-        lru_resize_enable osc
+       stat $DIR/$tdir > /dev/null
+       can1=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       test_mkdir -c1 $DIR/$tdir/d1
+       can2=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+       [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+       lru_resize_enable mdc
+       lru_resize_enable osc
 }
 run_test 120a "Early Lock Cancel: mkdir test"
 
 test_120b() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-        test_mkdir -p $DIR/$tdir
-        [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
+        test_mkdir $DIR/$tdir
+        [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
                skip "no early lock cancel on server" && return 0
         lru_resize_disable mdc
         lru_resize_disable osc
         cancel_lru_locks mdc
         stat $DIR/$tdir > /dev/null
-        can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
-        blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
-        touch $DIR/$tdir/f1
-        can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
-        blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
-        [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
-        [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
-        lru_resize_enable mdc
-        lru_resize_enable osc
+       can1=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       touch $DIR/$tdir/f1
+       can2=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+       [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+       lru_resize_enable mdc
+       lru_resize_enable osc
 }
 run_test 120b "Early Lock Cancel: create test"
 
 test_120c() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-        test_mkdir -p $DIR/$tdir
-        [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
-               skip "no early lock cancel on server" && return 0
+       test_mkdir -c1 $DIR/$tdir
+       [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
+              skip "no early lock cancel on server" && return 0
         lru_resize_disable mdc
         lru_resize_disable osc
-       test_mkdir -p $DIR/$tdir/d1
-       test_mkdir -p $DIR/$tdir/d2
-        touch $DIR/$tdir/d1/f1
-        cancel_lru_locks mdc
-        stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
-        can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
-        blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
-        ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
-        can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
-        blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
-        [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
-        [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
-        lru_resize_enable mdc
-        lru_resize_enable osc
+       test_mkdir -p -c1 $DIR/$tdir/d1
+       test_mkdir -p -c1 $DIR/$tdir/d2
+       touch $DIR/$tdir/d1/f1
+       cancel_lru_locks mdc
+       stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
+       can1=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
+       can2=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+       [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+       lru_resize_enable mdc
+       lru_resize_enable osc
 }
 run_test 120c "Early Lock Cancel: link test"
 
 test_120d() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-        test_mkdir -p $DIR/$tdir
-        [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
-               skip "no early lock cancel on server" && return 0
-        lru_resize_disable mdc
-        lru_resize_disable osc
-        touch $DIR/$tdir
-        cancel_lru_locks mdc
-        stat $DIR/$tdir > /dev/null
-        can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
-        blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
-        chmod a+x $DIR/$tdir
-        can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
-        blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
-        [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
-        [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
-        lru_resize_enable mdc
-        lru_resize_enable osc
+       test_mkdir -p -c1 $DIR/$tdir
+       [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
+              skip "no early lock cancel on server" && return 0
+       lru_resize_disable mdc
+       lru_resize_disable osc
+       touch $DIR/$tdir
+       cancel_lru_locks mdc
+       stat $DIR/$tdir > /dev/null
+       can1=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       chmod a+x $DIR/$tdir
+       can2=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+       [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+       lru_resize_enable mdc
+       lru_resize_enable osc
 }
 run_test 120d "Early Lock Cancel: setattr test"
 
 test_120e() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-        test_mkdir -p $DIR/$tdir
+        test_mkdir -p -c1 $DIR/$tdir
         [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
                skip "no early lock cancel on server" && return 0
         lru_resize_disable mdc
@@ -7470,19 +7568,21 @@ test_120e() {
         cancel_lru_locks osc
         dd if=$DIR/$tdir/f1 of=/dev/null
         stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
-        can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
-              awk '/ldlm_cancel/ {print $2}'`
-        blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
-              awk '/ldlm_bl_callback/ {print $2}'`
-        unlink $DIR/$tdir/f1
-        can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
-              awk '/ldlm_cancel/ {print $2}'`
-        blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
-              awk '/ldlm_bl_callback/ {print $2}'`
-        [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
-        [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
-        lru_resize_enable mdc
-        lru_resize_enable osc
+       can1=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       unlink $DIR/$tdir/f1
+       can2=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+       [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+       lru_resize_enable mdc
+       lru_resize_enable osc
 }
 run_test 120e "Early Lock Cancel: unlink test"
 
@@ -7490,11 +7590,11 @@ test_120f() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
         [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
                skip "no early lock cancel on server" && return 0
-        test_mkdir -p $DIR/$tdir
+        test_mkdir -p -c1 $DIR/$tdir
         lru_resize_disable mdc
         lru_resize_disable osc
-       test_mkdir -p $DIR/$tdir/d1
-       test_mkdir -p $DIR/$tdir/d2
+       test_mkdir -p -c1 $DIR/$tdir/d1
+       test_mkdir -p -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
@@ -7502,19 +7602,21 @@ test_120f() {
         dd if=$DIR/$tdir/d1/f1 of=/dev/null
         dd if=$DIR/$tdir/d2/f2 of=/dev/null
         stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
-        can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
-              awk '/ldlm_cancel/ {print $2}'`
-        blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
-              awk '/ldlm_bl_callback/ {print $2}'`
-        mv $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
-        can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
-              awk '/ldlm_cancel/ {print $2}'`
-        blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
-              awk '/ldlm_bl_callback/ {print $2}'`
-        [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
-        [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
-        lru_resize_enable mdc
-        lru_resize_enable osc
+       can1=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       mv $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
+       can2=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+       [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+       lru_resize_enable mdc
+       lru_resize_enable osc
 }
 run_test 120f "Early Lock Cancel: rename test"
 
@@ -7531,32 +7633,35 @@ test_120g() {
         cancel_lru_locks osc
         t0=`date +%s`
 
-        can0=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
-              awk '/ldlm_cancel/ {print $2}'`
-        blk0=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
-              awk '/ldlm_bl_callback/ {print $2}'`
-        createmany -o $DIR/$tdir/f $count
-        sync
-        can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
-              awk '/ldlm_cancel/ {print $2}'`
-        blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
-              awk '/ldlm_bl_callback/ {print $2}'`
-        t1=`date +%s`
-        echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
-        echo rm $count files
-        rm -r $DIR/$tdir
-        sync
-        can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
-              awk '/ldlm_cancel/ {print $2}'`
-        blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
-              awk '/ldlm_bl_callback/ {print $2}'`
-        t2=`date +%s`
-        echo total: $count removes in $((t2-t1))
-        echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
-        sleep 2
-        # wait for commitment of removal
-        lru_resize_enable mdc
-        lru_resize_enable osc
+       can0=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       createmany -o $DIR/$tdir/f $count
+       sync
+       can1=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       t1=$(date +%s)
+       echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
+       echo rm $count files
+       rm -r $DIR/$tdir
+       sync
+       can2=$(do_facet $SINGLEMDS \
+              "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+              awk '/ldlm_cancel/ {print $2}')
+       blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+              awk '/ldlm_bl_callback/ {print $2}')
+       t2=$(date +%s)
+       echo total: $count removes in $((t2-t1))
+       echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
+       sleep 2
+       # wait for commitment of removal
+       lru_resize_enable mdc
+       lru_resize_enable osc
 }
 run_test 120g "Early Lock Cancel: performance test"
 
@@ -7981,7 +8086,6 @@ test_129() {
                return
        fi
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
-
        ENOSPC=28
        EFBIG=27
 
@@ -7995,6 +8099,9 @@ test_129() {
        set_dir_limits $MAX
        local I=$(stat -c%s "$DIR/$tdir")
        local J=0
+       local STRIPE_COUNT=1
+       [ $MDSCOUNT -ge 2 ] && STRIPE_COUNT=$($LFS getdirstripe -c $DIR/$tdir)
+       MAX=$((MAX*STRIPE_COUNT))
        while [ ! $I -gt $MAX ]; do
                $MULTIOP $DIR/$tdir/$J Oc
                rc=$?
@@ -8027,7 +8134,7 @@ test_129() {
        done
 
        set_dir_limits 0
-       error "exceeded dir size limit $MAX x $MDSCOUNT $MAX : $I bytes"
+       error "exceeded dir size limit $MAX($MDSCOUNT) : $I bytes"
 }
 run_test 129 "test directory size limit ========================"
 
@@ -9017,8 +9124,10 @@ dot_lustre_fid_permission_check() {
        rm -f $test_dir/$tfile.1
        echo "truncate fid $fid"
        $TRUNCATE $ffid 777 || error "truncate $ffid failed."
-       echo "link fid $fid"
-       ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
+       if [ $MDSCOUNT -lt 2 ]; then #FIXME when cross-MDT hard link is working
+               echo "link fid $fid"
+               ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed."
+       fi
        if [ -n $(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl) ]; then
                echo "setfacl fid $fid"
                setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed."
@@ -9169,7 +9278,7 @@ test_154b() {
        local rc=0
 
        mkdir -p $DIR/$tdir
-       $LFS mkdir -i $MDTIDX $remote_dir ||
+       $LFS mkdir -i $MDTIDX -c $MDSCOUNT $remote_dir ||
                error "create remote directory failed"
 
        cp /etc/hosts $remote_dir/$tfile
@@ -9605,18 +9714,18 @@ test_160a() {
 
        MIN_REC=$($GET_CL_USERS |
                awk 'min == "" || $2 < min {min = $2}; END {print min}')
-       FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}')
+       FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}')
        echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC"
        [ $FIRST_REC == $(($MIN_REC + 1)) ] ||
                err17935 "first index should be $(($MIN_REC + 1)) is $FIRST_REC"
 
        # LU-3446 changelog index reset on MDT restart
        local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
-       CUR_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+       CUR_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
        $LFS changelog_clear $MDT0 $USER 0
        stop $SINGLEMDS || error "Fail to stop MDT."
        start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
-       CUR_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+       CUR_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
        echo "verifying index survives MDT restart: $CUR_REC1 == $CUR_REC2"
        [ $CUR_REC1 == $CUR_REC2 ] ||
                err17935 "current index should be $CUR_REC1 is $CUR_REC2"
@@ -9628,9 +9737,9 @@ test_160a() {
 
        USERS=$(( $($GET_CL_USERS | wc -l) - 2 ))
        if [ $USERS -eq 0 ]; then
-               LAST_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+               LAST_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
                touch $DIR/$tdir/chloe
-               LAST_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+               LAST_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
                echo "verify changelogs are off: $LAST_REC1 == $LAST_REC2"
                [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
        else
@@ -9670,16 +9779,42 @@ test_160b() { # LU-3587
 }
 run_test 160b "Verify that very long rename doesn't crash in changelog"
 
+test_160c() {
+       local rc=0
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+
+       # Registration step
+       local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+
+       rm -rf $DIR/$tdir
+       mkdir -p $DIR/$tdir
+       $MCREATE $DIR/$tdir/foo_160c
+       changelog_chmask "TRUNC"
+       $TRUNCATE $DIR/$tdir/foo_160c 200
+       changelog_chmask "TRUNC"
+       $TRUNCATE $DIR/$tdir/foo_160c 199
+       $LFS changelog $MDT0
+       TRUNCS=$($LFS changelog $MDT0 | tail -5 | grep -c "TRUNC")
+       [ $TRUNCS -eq 1 ] || err17935 "TRUNC changelog mask count $TRUNCS != 1"
+       $LFS changelog_clear $MDT0 $USER 0
+
+       # Deregistration step
+       echo "deregistering $USER"
+       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+}
+run_test 160c "verify that changelog log catch the truncate event"
+
 test_161a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-    test_mkdir -p $DIR/$tdir
-    cp /etc/hosts $DIR/$tdir/$tfile
-    test_mkdir $DIR/$tdir/foo1
-    test_mkdir $DIR/$tdir/foo2
-    ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
-    ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
-    ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
-    ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
+       test_mkdir -p -c1 $DIR/$tdir
+       cp /etc/hosts $DIR/$tdir/$tfile
+       test_mkdir -c1 $DIR/$tdir/foo1
+       test_mkdir -c1 $DIR/$tdir/foo2
+       ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
+       ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
+       ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
+       ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
        local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
        if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
                $LFS fid2path $DIR $FID
@@ -10118,7 +10253,8 @@ test_180c() { # LU-2598
        do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
                rmmod_remote=true || error "failed to load module obdecho"
 
-       target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ {print $4}'|head -1)
+       target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ { print $4 }' |
+               head -n1)
        if [[ -n $target ]]; then
                obdecho_test "$target" ost1 "$pages" ||
                        rc=${PIPESTATUS[0]}
@@ -10207,7 +10343,7 @@ test_184a() {
        check_swap_layouts_support && return 0
 
        dir0=$DIR/$tdir/$testnum
-       test_mkdir -p $dir0 || error "creating dir $dir0"
+       test_mkdir -p -c1 $dir0 || error "creating dir $dir0"
        ref1=/etc/passwd
        ref2=/etc/group
        file1=$dir0/f1
@@ -10581,7 +10717,7 @@ pool_remove_first_target() {
        local pool=$1
 
        local pname="lov.$FSNAME-*.pools.$pool"
-       local t=$($LCTL get_param -n $pname | head -1)
+       local t=$($LCTL get_param -n $pname | head -n1)
        do_facet mgs $LCTL pool_remove $FSNAME.$pool $t
        wait_update $HOSTNAME "lctl get_param -n $pname | grep $t" "" || {
                error_noexit "$t not removed from $FSNAME.$pool"
@@ -10602,7 +10738,7 @@ pool_remove_all_targets() {
                error_noexit "Pool $FSNAME.$pool cannot be drained"
                return 1
        }
-       # striping on an empty/nonexistant pool should fall back 
+       # striping on an empty/nonexistant pool should fall back
        # to "pool of everything"
        touch $file || {
                error_noexit "failed to use fallback striping for empty pool"
@@ -11772,11 +11908,207 @@ test_230a() {
 }
 run_test 230a "Create remote directory and files under the remote directory"
 
+test_230b() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       local mdt_index
+       local i
+       local file
+       local pid
+       local stripe_count
+       local migrate_dir=$DIR/$tdir/migrate_dir
+       local other_dir=$DIR/$tdir/other_dir
+
+       mkdir -p $migrate_dir
+       mkdir -p $other_dir
+       for ((i=0; i<10; i++)); do
+               mkdir -p $migrate_dir/dir_${i}
+               createmany -o $migrate_dir/dir_${i}/f 10 ||
+                       error "create files under remote dir failed $i"
+       done
+
+       cp /etc/passwd $migrate_dir/$tfile
+       cp /etc/passwd $other_dir/$tfile
+       mkdir -p $migrate_dir/dir_default_stripe2
+       $LFS setstripe -c 2 $migrate_dir/dir_default_stripe2
+       $LFS setstripe -c 2 $migrate_dir/${tfile}_stripe2
+
+       mkdir -p $other_dir
+       ln $migrate_dir/$tfile $other_dir/luna
+       ln $migrate_dir/$tfile $migrate_dir/sofia
+       ln $other_dir/$tfile $migrate_dir/david
+       ln -s $migrate_dir/$tfile $other_dir/zachary
+       ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
+       ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
+
+       $LFS mv -v -M $MDTIDX $migrate_dir ||
+                       error "migrate remote dir error"
+
+       echo "migratate to MDT1, then checking.."
+       for ((i=0; i<10; i++)); do
+               for file in $(find $migrate_dir/dir_${i}); do
+                       mdt_index=$($LFS getstripe -M $file)
+                       [ $mdt_index == $MDTIDX ] ||
+                               error "$file is not on MDT${MDTIDX}"
+               done
+       done
+
+       # the multiple link file should still in MDT0
+       mdt_index=$($LFS getstripe -M $migrate_dir/$tfile)
+       [ $mdt_index == 0 ] ||
+               error "$file is not on MDT${MDTIDX}"
+
+       diff /etc/passwd $migrate_dir/$tfile ||
+               error "$tfile different after migration"
+
+       diff /etc/passwd $other_dir/luna ||
+               error "luna different after migration"
+
+       diff /etc/passwd $migrate_dir/sofia ||
+               error "sofia different after migration"
+
+       diff /etc/passwd $migrate_dir/david ||
+               error "david different after migration"
+
+       diff /etc/passwd $other_dir/zachary ||
+               error "zachary different after migration"
+
+       diff /etc/passwd $migrate_dir/${tfile}_ln ||
+               error "${tfile}_ln different after migration"
+
+       diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
+               error "${tfile}_ln_other different after migration"
+
+       stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
+       [ $stripe_count = 2 ] ||
+                       error "dir strpe_count $d != 2 after migration."
+
+       stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
+       [ $stripe_count = 2 ] ||
+                       error "file strpe_count $d != 2 after migration."
+
+       #migrate back to MDT0
+       MDTIDX=0
+       $LFS mv -v -M $MDTIDX $migrate_dir ||
+                       error "migrate remote dir error"
+
+       echo "migrate back to MDT0, checking.."
+       for file in $(find $migrate_dir); do
+               mdt_index=$($LFS getstripe -M $file)
+               [ $mdt_index == $MDTIDX ] ||
+                       error "$file is not on MDT${MDTIDX}"
+       done
+
+       diff /etc/passwd ${migrate_dir}/$tfile ||
+               error "$tfile different after migration"
+
+       diff /etc/passwd ${other_dir}/luna ||
+               error "luna different after migration"
+
+       diff /etc/passwd ${migrate_dir}/sofia ||
+               error "sofia different after migration"
+
+       diff /etc/passwd ${other_dir}/zachary ||
+               error "zachary different after migration"
+
+       diff /etc/passwd $migrate_dir/${tfile}_ln ||
+               error "${tfile}_ln different after migration"
+
+       diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
+               error "${tfile}_ln_other different after migration"
+
+       stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
+       [ $stripe_count = 2 ] ||
+               error "dir strpe_count $d != 2 after migration."
+
+       stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
+       [ $stripe_count = 2 ] ||
+               error "file strpe_count $d != 2 after migration."
+
+       rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230b "migrate directory"
+
+test_230c() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       local mdt_index
+       local file
+
+       #If migrating directory fails in the middle, all entries of
+       #the directory is still accessiable.
+       mkdir -p $DIR/$tdir
+       stat $DIR/$tdir
+       createmany -o $DIR/$tdir/f 10 ||
+               error "create files under ${tdir} failed"
+
+       #failed after migrating 5 entries
+       #OBD_FAIL_MIGRATE_ENTRIES       0x1801
+       do_facet mds1 lctl set_param fail_loc=0x20001801
+       do_facet mds1 lctl  set_param fail_val=5
+       local t=`ls $DIR/$tdir | wc -l`
+       $LFS mv -M $MDTIDX $DIR/$tdir &&
+               error "migrate should failed after 5 entries"
+       local u=`ls $DIR/$tdir | wc -l`
+       [ "$u" == "$t" ] || error "$u != $t during migration"
+
+       for file in $(find $DIR/$tdir); do
+               stat $file || error "stat $file failed"
+       done
+
+       do_facet mds1 lctl set_param fail_loc=0
+       do_facet mds1 lctl set_param fail_val=0
+
+       $LFS mv -M $MDTIDX $DIR/$tdir ||
+               error "migrate open files should failed with open files"
+
+       echo "Finish migration, then checking.."
+       for file in $(find $DIR/$tdir); do
+               mdt_index=$($LFS getstripe -M $file)
+               [ $mdt_index == $MDTIDX ] ||
+                       error "$file is not on MDT${MDTIDX}"
+       done
+
+       rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230c "check directory accessiblity if migration is failed"
+
+test_230d() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       local mdt_index
+       local i
+       local j
+
+       mkdir -p $DIR/$tdir
+
+       for ((i=0; i<100; i++)); do
+               mkdir -p $DIR/$tdir/dir_${i}
+               createmany -o $DIR/$tdir/dir_${i}/f 100 ||
+                       error "create files under remote dir failed $i"
+       done
+
+       $LFS mv -M $MDTIDX -v $DIR/$tdir || error "migrate remote dir error"
+
+       echo "Finish migration, then checking.."
+       for file in $(find $DIR/$tdir); do
+               mdt_index=$($LFS getstripe -M $file)
+               [ $mdt_index == $MDTIDX ] ||
+                       error "$file is not on MDT${MDTIDX}"
+       done
+
+       rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230d "check migrate big directory"
+
 test_231a()
 {
        # For simplicity this test assumes that max_pages_per_rpc
        # is the same across all OSCs
-       local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -1)
+       local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
        local bulk_size=$((max_pages * 4096))
 
        mkdir -p $DIR/$tdir
@@ -11903,7 +12235,7 @@ run_test 235 "LU-1715: flock deadlock detection does not work properly"
 #LU-2935
 test_236() {
        check_swap_layouts_support && return 0
-       test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+       test_mkdir -p -c1 $DIR/$tdir || error "mkdir $tdir failed"
 
        local ref1=/etc/passwd
        local ref2=/etc/group
@@ -11940,6 +12272,253 @@ test_237() {
 }
 run_test 237 "Verify name_to_handle_at/open_by_handle_at syscalls"
 
+# LU-4659 linkea consistency
+test_238() {
+       touch $DIR/$tfile
+       ln $DIR/$tfile $DIR/$tfile.lnk
+       touch $DIR/$tfile.new
+       mv $DIR/$tfile.new $DIR/$tfile
+       local fid1=$(lfs path2fid $DIR/$tfile)
+       local fid2=$(lfs path2fid $DIR/$tfile.lnk)
+       local path1=$(lfs fid2path $FSNAME $fid1)
+       [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
+       local path2=$(lfs fid2path $FSNAME $fid2)
+       [ $tfile.lnk == $path2 ] ||
+               error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
+       rm -f $DIR/$tfile*
+}
+run_test 238 "Verify linkea consistency"
+
+test_striped_dir() {
+       local mdt_index=$1
+       local stripe_count
+       local stripe_index
+
+       mkdir -p $DIR/$tdir
+       $LFS setdirstripe -i $mdt_index -c 2 -t all_char $DIR/$tdir/striped_dir ||
+               error "set striped dir error"
+
+       stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
+       if [ "$stripe_count" != "2" ]; then
+               error "stripe_count is $stripe_count, expect 2"
+       fi
+
+       stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
+       if [ "$stripe_index" != "$mdt_index" ]; then
+               error "stripe_index is $stripe_index, expect $mdt_index"
+       fi
+
+       [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
+               error "nlink error after create striped dir"
+
+       mkdir $DIR/$tdir/striped_dir/a
+       mkdir $DIR/$tdir/striped_dir/b
+
+       stat $DIR/$tdir/striped_dir/a ||
+               error "create dir under striped dir failed"
+       stat $DIR/$tdir/striped_dir/b ||
+               error "create dir under striped dir failed"
+
+       [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] ||
+               error "nlink error after mkdir"
+
+       rmdir $DIR/$tdir/striped_dir/a
+       [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] ||
+               error "nlink error after rmdir"
+
+       rmdir $DIR/$tdir/striped_dir/b
+       [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
+               error "nlink error after rmdir"
+
+       rmdir $DIR/$tdir/striped_dir ||
+               error "rmdir striped dir error"
+       true
+}
+
+test_300a() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+       test_striped_dir 0 || error "failed on striped dir on MDT0"
+       test_striped_dir 1 || error "failed on striped dir on MDT0"
+}
+run_test 300a "basic striped dir sanity test"
+
+test_300b() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local i
+       local mtime1
+       local mtime2
+       local mtime3
+
+       test_mkdir $DIR/$tdir || error "mkdir fail"
+       $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
+               error "set striped dir error"
+       for ((i=0; i<10; i++)); do
+               mtime1=$(stat -c %Y $DIR/$tdir/striped_dir)
+               sleep 1
+               touch $DIR/$tdir/striped_dir/file_$i ||
+                                       error "touch error $i"
+               mtime2=$(stat -c %Y $DIR/$tdir/striped_dir)
+               [ $mtime1 -eq $mtime2 ] &&
+                       error "mtime not change after create"
+               sleep 1
+               rm -f $DIR/$tdir/striped_dir/file_$i ||
+                                       error "unlink error $i"
+               mtime3=$(stat -c %Y $DIR/$tdir/striped_dir)
+               [ $mtime2 -eq $mtime3 ] &&
+                       error "mtime did not change after unlink"
+       done
+       true
+}
+run_test 300b "check ctime/mtime for striped dir"
+
+test_300c() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local file_count
+
+       mkdir -p $DIR/$tdir
+       $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir ||
+               error "set striped dir error"
+
+       chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir ||
+               error "chown striped dir failed"
+
+       $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 ||
+               error "create 5k files failed"
+
+       file_count=$(ls $DIR/$tdir/striped_dir | wc -l)
+
+       [ "$file_count" = 5000 ] || error "file count $file_count != 5000"
+
+       rm -rf $DIR/$tdir
+}
+run_test 300c "chown && check ls under striped directory"
+
+test_300d() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local stripe_count
+       local file
+
+       mkdir -p $DIR/$tdir
+       $SETSTRIPE -c 2 $DIR/$tdir
+
+       #local striped directory
+       $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
+               error "set striped dir error"
+       createmany -o $DIR/$tdir/striped_dir/f 10 ||
+               error "create 10 files failed"
+
+       #remote striped directory
+       $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
+               error "set striped dir error"
+       createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
+               error "create 10 files failed"
+
+       for file in $(find $DIR/$tdir); do
+               stripe_count=$($GETSTRIPE -c $file)
+               [ $stripe_count -eq 2 ] ||
+                       error "wrong stripe $stripe_count for $file"
+       done
+
+       rm -rf $DIR/$tdir
+}
+run_test 300d "check default stripe under striped directory"
+
+test_300e() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local stripe_count
+       local file
+
+       mkdir -p $DIR/$tdir
+
+       $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
+               error "set striped dir error"
+
+       touch $DIR/$tdir/striped_dir/a
+       touch $DIR/$tdir/striped_dir/b
+       touch $DIR/$tdir/striped_dir/c
+
+       mkdir $DIR/$tdir/striped_dir/dir_a
+       mkdir $DIR/$tdir/striped_dir/dir_b
+       mkdir $DIR/$tdir/striped_dir/dir_c
+
+       $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_a ||
+               error "set striped dir under striped dir error"
+
+       $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_b ||
+               error "set striped dir under striped dir error"
+
+       $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_c ||
+               error "set striped dir under striped dir error"
+
+       mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/b &&
+               error "rename file under striped dir should fail"
+
+       mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b &&
+               error "rename dir under striped dir should fail"
+
+       mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b &&
+               error "rename dir under different stripes should fail"
+
+       mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
+               error "rename file under striped dir should succeed"
+
+       mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_c ||
+               error "rename dir under striped dir should succeed"
+
+       rm -rf $DIR/$tdir
+}
+run_test 300e "check rename under striped directory"
+
+test_300f() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local stripe_count
+       local file
+
+       rm -rf $DIR/$tdir
+       mkdir -p $DIR/$tdir
+
+       $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
+               error "set striped dir error"
+
+       $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir1 ||
+               error "set striped dir error"
+
+       touch $DIR/$tdir/striped_dir/a
+       mkdir $DIR/$tdir/striped_dir/dir_a
+       $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a ||
+               error "create striped dir under striped dir fails"
+
+       touch $DIR/$tdir/striped_dir1/b
+       mkdir $DIR/$tdir/striped_dir1/dir_b
+       $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
+               error "create striped dir under striped dir fails"
+
+       mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/b &&
+               error "rename file under different striped dir should fail"
+
+       mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b &&
+               error "rename dir under different striped dir should fail"
+
+       mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b &&
+               error "rename striped dir under diff striped dir should fail"
+
+       mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
+               error "rename file under diff striped dirs fails"
+
+       mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_a ||
+               error "rename dir under diff striped dirs fails"
+
+       rm -rf $DIR/$tdir
+}
+run_test 300f "check rename cross striped directory"
+
 #
 # tests that do cleanup/setup should be run at the end
 #