Whamcloud - gitweb
LU-4703 tests: Add test to check setxattr fails when it should
[fs/lustre-release.git] / lustre / tests / sanity.sh
index db9807c..a1c5f65 100644 (file)
@@ -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
@@ -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"
@@ -447,6 +466,10 @@ test_17g() {
        [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.3.55) ] &&
                TESTS="4094 4095"
 
+       # skip long symlink name for rhel6.5.
+       # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
+       grep -q '6.5' /etc/redhat-release && TESTS="59 60 61 4062 4063"
+
        for i in $TESTS; do
                local SYMNAME=$(str_repeat 'x' $i)
                ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
@@ -571,7 +594,7 @@ test_17m() {
 
        echo "stop and checking mds${mds_index}: $cmd"
        # e2fsck should not return error
-       stop mds${mds_index} -f
+       stop mds${mds_index}
        do_facet mds${mds_index} $cmd || rc=$?
 
        start mds${mds_index} $devname $MDS_MOUNT_OPTS
@@ -588,7 +611,9 @@ check_fs_consistency_17n() {
        local cmd
        local rc=0
 
-       for mdt_index in $(seq 1 $MDSCOUNT); do
+       # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
+       # so it only check MDT1/MDT2 instead of all of MDTs.
+       for mdt_index in $(seq 1 2); do
                devname=$(mdsdevname $mdt_index)
                cmd="$E2FSCK -fnvd $devname"
 
@@ -626,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"
 
@@ -786,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$ttestnum.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"
@@ -827,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
@@ -990,7 +1036,7 @@ max_pages_per_rpc() {
 
 test_24v() {
        local NRFILES=100000
-       local FREE_INODES=$(lfs_df -i | grep "summary" | awk '{print $4}')
+       local FREE_INODES=$(mdt_free_inodes 0)
        [ $FREE_INODES -lt $NRFILES ] && \
                skip "not enough free inodes $FREE_INODES required $NRFILES" &&
                return
@@ -998,6 +1044,9 @@ test_24v() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        trap simple_cleanup_common EXIT
 
+       # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
+       [ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000
+
        mkdir -p $DIR/$tdir
        createmany -m $DIR/$tdir/$tfile $NRFILES
 
@@ -1050,6 +1099,9 @@ test_24x() {
        mkdir -p $remote_dir/tgt_dir
        touch $remote_dir/tgt_file
 
+       mrename $remote_dir $DIR/ &&
+               error "rename dir cross MDT works!"
+
        mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir &&
                error "rename dir cross MDT works!"
 
@@ -1120,6 +1172,7 @@ run_test 24z "rename one remote dir to another remote dir should fail"
 test_24A() { # LU-3182
        local NFILES=5000
 
+       rm -rf $DIR/$tdir
        mkdir -p $DIR/$tdir
        createmany -m $DIR/$tdir/$tfile $NFILES
        local t=`ls $DIR/$tdir | wc -l`
@@ -1277,10 +1330,10 @@ test_27k() { # bug 2844
        [ ! -d $DIR/d27 ] && test_mkdir -p $DIR d27
        $SETSTRIPE -S 67108864 $FILE || error "setstripe failed"
        BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
-       [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
+       [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "1:$BLKSIZE > $LL_MAX_BLKSIZE"
        dd if=/dev/zero of=$FILE bs=4k count=1
        BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
-       [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
+       [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "2:$BLKSIZE > $LL_MAX_BLKSIZE"
 }
 run_test 27k "limit i_blksize for broken user apps ============="
 
@@ -1355,9 +1408,9 @@ exhaust_precreations() {
        # on the mdt's osc
        local mdtosc_proc1=$(get_mdtosc_proc_path mds${MDSIDX} $OST)
        local last_id=$(do_facet mds${MDSIDX} lctl get_param -n \
-        osc.$mdtosc_proc1.prealloc_last_id)
+                       osc.$mdtosc_proc1.prealloc_last_id)
        local next_id=$(do_facet mds${MDSIDX} lctl get_param -n \
-        osc.$mdtosc_proc1.prealloc_next_id)
+                       osc.$mdtosc_proc1.prealloc_next_id)
 
        local mdtosc_proc2=$(get_mdtosc_proc_path mds${MDSIDX})
        do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc*
@@ -1711,26 +1764,7 @@ check_seq_oid()
                local dev=$(ostdevname $ost)
                local oid_hex
 
-               if [ $(facet_fstype ost$ost) != ldiskfs ]; then
-                       echo "Currently only works with ldiskfs-based OSTs"
-                       continue
-               fi
-
-                log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
-
-                #don't unmount/remount the OSTs if we don't need to do that
-               # LU-2577 changes filter_fid to be smaller, so debugfs needs
-               # update too, until that use mount/ll_decode_filter_fid/mount
-               local dir=$(facet_mntpt ost$ost)
-               local opts=${OST_MOUNT_OPTS}
-
-               if !  do_facet ost$ost test -b ${dev}; then
-                       opts=$(csa_add "$opts" -o loop)
-               fi
-
-               stop ost$ost
-               do_facet ost$ost mount -t $(facet_fstype ost$ost) $opts $dev $dir ||
-                       { error "mounting $dev as $FSTYPE failed"; return 3; }
+               log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
 
                seq=$(echo $seq | sed -e "s/^0x//g")
                if [ $seq == 0 ]; then
@@ -1738,25 +1772,48 @@ check_seq_oid()
                else
                        oid_hex=$(echo $hex | sed -e "s/^0x//g")
                fi
-               local obj_file=$(do_facet ost$ost find $dir/O/$seq -name $oid_hex)
-               local ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID $obj_file)
-               do_facet ost$ost umount -d $dir
-               start ost$ost $dev $OST_MOUNT_OPTS
+               local obj_file="O/$seq/d$((oid %32))/$oid_hex"
 
-               # re-enable when debugfs will understand new filter_fid
-               #local ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
-                #           $dev 2>/dev/null" | grep "parent=")
+               local ff
+               #
+               # Don't unmount/remount the OSTs if we don't need to do that.
+               # LU-2577 changes filter_fid to be smaller, so debugfs needs
+               # update too, until that use mount/ll_decode_filter_fid/mount.
+               # Re-enable when debugfs will understand new filter_fid.
+               #
+               if false && [ $(facet_fstype ost$ost) == ldiskfs ]; then
+                       ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
+                               $dev 2>/dev/null" | grep "parent=")
+               else
+                       stop ost$ost
+                       mount_fstype ost$ost
+                       ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
+                               $(facet_mntpt ost$ost)/$obj_file)
+                       unmount_fstype ost$ost
+                       start ost$ost $dev $OST_MOUNT_OPTS
+               fi
 
-                [ -z "$ff" ] && error "$obj_file: no filter_fid info"
+               [ -z "$ff" ] && error "$obj_file: no filter_fid info"
 
-                echo "$ff" | sed -e 's#.*objid=#got: objid=#'
+               echo "$ff" | sed -e 's#.*objid=#got: objid=#'
 
-                # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
-                # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
-                local ff_parent=$(echo $ff|sed -e 's/.*parent=.//')
-                local ff_pseq=$(echo $ff_parent | cut -d: -f1)
-                local ff_poid=$(echo $ff_parent | cut -d: -f2)
-                local ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//')
+               # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
+               # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
+               local ff_parent=$(echo $ff|sed -e 's/.*parent=.//')
+               local ff_pseq=$(echo $ff_parent | cut -d: -f1)
+               local ff_poid=$(echo $ff_parent | cut -d: -f2)
+               local ff_pstripe
+               if echo $ff_parent | grep -q 'stripe='; then
+                       ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//')
+               else
+                       #
+                       # $LL_DECODE_FILTER_FID does not print "stripe="; look
+                       # into f_ver in this case.  See the comment on
+                       # ff_parent.
+                       #
+                       ff_pstripe=$(echo $ff_parent | cut -d: -f3 |
+                               sed -e 's/\]//')
+               fi
 
                 # compare lmm_seq and filter_fid->ff_parent.f_seq
                 [ $ff_pseq = $lmm_seq ] ||
@@ -1764,7 +1821,7 @@ check_seq_oid()
                 # compare lmm_object_id and filter_fid->ff_parent.f_oid
                 [ $ff_poid = $lmm_oid ] ||
                         error "FF parent OID $ff_poid != $lmm_oid"
-                [ $ff_pstripe = $stripe_nr ] ||
+               (($ff_pstripe == $stripe_nr)) ||
                         error "FF stripe $ff_pstripe != $stripe_nr"
 
                 stripe_nr=$((stripe_nr + 1))
@@ -1802,13 +1859,13 @@ test_27A() { # b=19102
         local restore_count=$($GETSTRIPE -c $MOUNT)
         local restore_offset=$($GETSTRIPE -i $MOUNT)
         $SETSTRIPE -c 0 -i -1 -S 0 $MOUNT
+        wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/  *//g'" "1" 20 ||
+                error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
         local default_size=$($GETSTRIPE -S $MOUNT)
-        local default_count=$($GETSTRIPE -c $MOUNT)
         local default_offset=$($GETSTRIPE -i $MOUNT)
         local dsize=$((1024 * 1024))
         [ $default_size -eq $dsize ] ||
                 error "stripe size $default_size != $dsize"
-        [ $default_count -eq 1 ] || error "stripe count $default_count != 1"
         [ $default_offset -eq -1 ] ||error "stripe offset $default_offset != -1"
         $SETSTRIPE -c $restore_count -i $restore_offset -S $restore_size $MOUNT
 }
@@ -2027,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"
@@ -2109,18 +2164,20 @@ test_31m() {
 run_test 31m "link to file: the same, non-existing, dir==============="
 
 test_31n() {
-       [ -e /proc/self/fd/173 ] && echo "skipping, fd 173 is in use" && return
        touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
        nlink=$(stat --format=%h $DIR/$tfile)
        [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
-       exec 173<$DIR/$tfile
-       trap "exec 173<&-" EXIT
-       nlink=$(stat --dereference --format=%h /proc/self/fd/173)
+       local fd=$(free_fd)
+       local cmd="exec $fd<$DIR/$tfile"
+       eval $cmd
+       cmd="exec $fd<&-"
+       trap "eval $cmd" EXIT
+       nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
        [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
        rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
-       nlink=$(stat --dereference --format=%h /proc/self/fd/173)
+       nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
        [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
-       exec 173<&-
+       eval $cmd
 }
 run_test 31n "check link count of unlinked file"
 
@@ -2149,7 +2206,7 @@ run_test 31o "duplicate hard links with same filename"
 
 cleanup_test32_mount() {
        trap 0
-       $UMOUNT $DIR/$tdir/ext2-mountpoint
+       $UMOUNT -d $DIR/$tdir/ext2-mountpoint
 }
 
 test_32a() {
@@ -2357,7 +2414,7 @@ run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
 
 cleanup_testdir_mount() {
        trap 0
-       $UMOUNT $DIR/$tdir
+       $UMOUNT -d $DIR/$tdir
 }
 
 test_32q() {
@@ -3124,6 +3181,50 @@ test_39n() { # LU-3832
 }
 run_test 39n "check that O_NOATIME is honored"
 
+test_39o() {
+       TESTDIR=$DIR/$tdir/$tfile
+       [ -e $TESTDIR ] && rm -rf $TESTDIR
+       test_mkdir -p $TESTDIR
+       cd $TESTDIR
+       links1=2
+       ls
+       mkdir a b
+       ls
+       links2=$(stat -c %h .)
+       [ $(($links1 + 2)) != $links2 ] &&
+               error "wrong links count $(($links1 + 2)) != $links2"
+       rmdir b
+       links3=$(stat -c %h .)
+       [ $(($links1 + 1)) != $links3 ] &&
+               error "wrong links count $links1 != $links3"
+       return 0
+}
+run_test 39o "directory cached attributes updated after create ========"
+
+test_39p() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+       TESTDIR=$DIR/$tdir/$tfile
+       [ -e $TESTDIR ] && rm -rf $TESTDIR
+       mkdir -p $TESTDIR
+       cd $TESTDIR
+       links1=2
+       ls
+       $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir1
+       $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir2
+       ls
+       links2=$(stat -c %h .)
+       [ $(($links1 + 2)) != $links2 ] &&
+               error "wrong links count $(($links1 + 2)) != $links2"
+       rmdir remote_dir2
+       links3=$(stat -c %h .)
+       [ $(($links1 + 1)) != $links3 ] &&
+               error "wrong links count $links1 != $links3"
+       return 0
+}
+run_test 39p "remote directory cached attributes updated after create ========"
+
+
 test_40() {
        dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
        $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
@@ -3689,7 +3790,7 @@ run_test 51a "special situations: split htree with empty entry =="
 export NUMTEST=70000
 test_51b() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       local BASE=$DIR/$tdir
+       local BASE=$DIR/d${base}.${TESTSUITE}
 
        # cleanup the directory
        rm -fr $BASE
@@ -3716,7 +3817,7 @@ test_51b() {
 run_test 51b "exceed 64k subdirectory nlink limit"
 
 test_51ba() { # LU-993
-       local BASE=$DIR/$tdir
+       local BASE=$DIR/d${base}.${TESTSUITE}
        # unlink all but 100 subdirectories, then check it still works
        local LEFT=100
        [ -f $BASE/fnum ] && local NUMPREV=$(cat $BASE/fnum) && rm $BASE/fnum
@@ -3846,37 +3947,53 @@ test_53() {
        local ost_last_id
        local ostnum
        local node
-       local found=0
+       local found=false
+       local support_last_seq=true
+
+       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.60) ]] ||
+               support_last_seq=false
 
        # only test MDT0000
-        local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
-        for value in $(do_facet $SINGLEMDS lctl get_param osc.$mdtosc.prealloc_last_id) ; do
-                param=$(echo ${value[0]} | cut -d "=" -f1)
-                ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
-                param_seq=$(echo ${param} |
-                           sed -e s/prealloc_last_id/prealloc_last_seq/g)
-               mds_last_seq=$(do_facet $SINGLEMDS lctl get_param -n $param_seq)
-               mds_last=$(do_facet $SINGLEMDS lctl get_param -n $param)
+       local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
+       local value
+       for value in $(do_facet $SINGLEMDS \
+                      $LCTL get_param osc.$mdtosc.prealloc_last_id) ; do
+               param=$(echo ${value[0]} | cut -d "=" -f1)
+               ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
+
+               if $support_last_seq; then
+                       param_seq=$(echo $param |
+                               sed -e s/prealloc_last_id/prealloc_last_seq/g)
+                       mds_last_seq=$(do_facet $SINGLEMDS \
+                                      $LCTL get_param -n $param_seq)
+               fi
+               mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
 
                ostnum=$(index_from_ostuuid ${ostname}_UUID)
                node=$(facet_active_host ost$((ostnum+1)))
                param="obdfilter.$ostname.last_id"
-               for ost_last in $(do_node $node lctl get_param -n $param) ; do
-                       echo "$ostname.last_id=$ost_last ;MDS.last_id=$mds_last"
-                       ost_last_id=$(echo $ost_last | awk -F':' '{print $2}' |
-                                     sed -e "s/^0x//g")
-                       ost_last_seq=$(echo $ost_last | awk -F':' '{print $1}')
-                       if [ $ost_last_seq = $mds_last_seq ]; then
-                               if [ $ost_last_id != $mds_last ]; then
-                                       error "$ost_last != $mds_last_id"
-                               else
-                                       found=1
-                                       break
-                               fi
+               for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
+                       echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
+                       ost_last_id=$ost_last
+
+                       if $support_last_seq; then
+                               ost_last_id=$(echo $ost_last |
+                                             awk -F':' '{print $2}' |
+                                             sed -e "s/^0x//g")
+                               ost_last_seq=$(echo $ost_last |
+                                              awk -F':' '{print $1}')
+                               [[ $ost_last_seq = $mds_last_seq ]] || continue
+                       fi
+
+                       if [[ $ost_last_id != $mds_last ]]; then
+                               error "$ost_last_id != $mds_last"
+                       else
+                               found=true
+                               break
                        fi
                done
-        done
-       [ $found = 0 ] && error "can not match last_seq/last_id for $mdtosc"
+       done
+       $found || error "can not match last_seq/last_id for $mdtosc"
        return 0
 }
 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
@@ -3911,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"
@@ -3921,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 $tdir
-       losetup -d $loopdev
-       rm $loopdev
+       cleanup_54c
 }
 run_test 54c "block device works in lustre ====================="
 
@@ -4014,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() {
@@ -4158,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)"
@@ -4449,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) ||
@@ -4545,6 +4671,9 @@ test_56x() {
 run_test 56x "lfs migration support"
 
 test_56y() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
+               skip "No HSM support on MDS of $(get_lustre_version)," \
+                        "need 2.4.53 at least" && return
        local res=""
 
        local dir0=$DIR/$tdir/$testnum
@@ -4642,7 +4771,7 @@ test_57b() {
        local MDSFREE2=$(do_facet $mymds \
                lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree)
        local MDCFREE2=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree)
-       if [ "$MDCFREE2" -lt "$((MDCFREE - 8))" ]; then
+       if [ "$MDCFREE2" -lt "$((MDCFREE - 16))" ]; then
                if [ "$MDSFREE" != "$MDSFREE2" ]; then
                        error "MDC before $MDCFREE != after $MDCFREE2"
                else
@@ -4760,10 +4889,11 @@ test_62() {
 #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
 
 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
-test_63a() {   # was test_63
+# Though this test is irrelevant anymore, it helped to reveal some
+# other grant bugs (LU-4482), let's keep it.
+test_63a() {   # was test_63
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        MAX_DIRTY_MB=`lctl get_param -n osc.*.max_dirty_mb | head -n 1`
-       lctl set_param -n osc.*.max_dirty_mb 0
        for i in `seq 10` ; do
                dd if=/dev/zero of=$DIR/f63 bs=8k &
                sleep 5
@@ -4771,7 +4901,6 @@ test_63a() {      # was test_63
                sleep 1
        done
 
-       lctl set_param -n osc.*.max_dirty_mb $MAX_DIRTY_MB
        rm -f $DIR/f63 || true
 }
 run_test 63a "Verify oig_wait interruption does not crash ======="
@@ -5751,6 +5880,7 @@ cleanup_101a() {
 
 test_101a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -ge 2 ] && skip "skip now for >= 2 MDTs" && return #LU-4322
        local s
        local discard
        local nreads=10000
@@ -5894,89 +6024,89 @@ test_101c() {
 run_test 101c "check stripe_size aligned read-ahead ================="
 
 set_read_ahead() {
-   $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
-   $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
+       $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
+       $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
 }
 
 test_101d() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        local file=$DIR/$tfile
-       local size=${FILESIZE_101c:-500}
+       local sz_MB=${FILESIZE_101d:-500}
        local ra_MB=${READAHEAD_MB:-40}
 
-       local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
-       [ $space -gt $((size * 1024)) ] ||
-               { skip "Need free space ${size}M, have ${space}K" && return; }
+       local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
+       [ $free_MB -lt $sz_MB ] &&
+               skip "Need free space ${sz_MB}M, have ${free_MB}M" && return
 
-       echo "Creating test file $file of size ${size}M with ${space}K free space"
+       echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
        $SETSTRIPE -c -1 $file || error "setstripe failed"
-       dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed"
+
+       dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
        echo Cancel LRU locks on lustre client to flush the client cache
        cancel_lru_locks osc
 
-    echo Disable read-ahead
-    local old_READAHEAD=$(set_read_ahead 0)
+       echo Disable read-ahead
+       local old_READAHEAD=$(set_read_ahead 0)
 
-    echo Reading the test file $file with read-ahead disabled
-    time_ra_OFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size")
+       echo Reading the test file $file with read-ahead disabled
+       local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
 
-    echo Cancel LRU locks on lustre client to flush the client cache
-    cancel_lru_locks osc
-    echo Enable read-ahead with ${ra_MB}MB
-    set_read_ahead $ra_MB
+       echo Cancel LRU locks on lustre client to flush the client cache
+       cancel_lru_locks osc
+       echo Enable read-ahead with ${ra_MB}MB
+       set_read_ahead $ra_MB
 
-    echo Reading the test file $file with read-ahead enabled
-    time_ra_ON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size")
+       echo Reading the test file $file with read-ahead enabled
+       local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
 
-    echo read-ahead disabled time read $time_ra_OFF
-    echo read-ahead enabled  time read $time_ra_ON
+       echo "read-ahead disabled time read $raOFF"
+       echo "read-ahead enabled  time read $raON"
 
        set_read_ahead $old_READAHEAD
        rm -f $file
        wait_delete_completed
 
-    [ $time_ra_ON -lt $time_ra_OFF ] ||
-        error "read-ahead enabled  time read (${time_ra_ON}s) is more than
-               read-ahead disabled time read (${time_ra_OFF}s) filesize ${size}M"
+       [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
+               error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
 }
-run_test 101d "file read with and without read-ahead enabled  ================="
+run_test 101d "file read with and without read-ahead enabled"
 
 test_101e() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-    local file=$DIR/$tfile
-    local size=500  #KB
-    local count=100
-    local blksize=1024
-
-    local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
-    local need_space=$((count * size))
-    [ $space -gt $need_space ] ||
-        { skip_env "Need free space $need_space, have $space" && return; }
-
-    echo Creating $count ${size}K test files
-    for ((i = 0; i < $count; i++)); do
-        dd if=/dev/zero of=${file}_${i} bs=$blksize count=$size 2>/dev/null
-    done
+       local file=$DIR/$tfile
+       local size_KB=500  #KB
+       local count=100
+       local bsize=1024
+
+       local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
+       local need_KB=$((count * size_KB))
+       [ $free_KB -le $need_KB ] &&
+               skip_env "Need free space $need_KB, have $free_KB" && return
+
+       echo "Creating $count ${size_KB}K test files"
+       for ((i = 0; i < $count; i++)); do
+               dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
+       done
 
-    echo Cancel LRU locks on lustre client to flush the client cache
-    cancel_lru_locks osc
+       echo "Cancel LRU locks on lustre client to flush the client cache"
+       cancel_lru_locks osc
 
-    echo Reset readahead stats
-    $LCTL set_param -n llite.*.read_ahead_stats 0
+       echo "Reset readahead stats"
+       $LCTL set_param -n llite.*.read_ahead_stats 0
 
-    for ((i = 0; i < $count; i++)); do
-        dd if=${file}_${i} of=/dev/null bs=$blksize count=$size 2>/dev/null
-    done
+       for ((i = 0; i < $count; i++)); do
+               dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
+       done
 
-    local miss=$($LCTL get_param -n llite.*.read_ahead_stats | \
-          get_named_value 'misses' | cut -d" " -f1 | calc_total)
+       local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
+                    get_named_value 'misses' | cut -d" " -f1 | calc_total)
 
-    for ((i = 0; i < $count; i++)); do
-        rm -rf ${file}_${i} 2>/dev/null
-    done
+       for ((i = 0; i < $count; i++)); do
+               rm -rf $file.$i 2>/dev/null
+       done
 
-    #10000 means 20% reads are missing in readahead
-    [ $miss -lt 10000 ] ||  error "misses too much for small reads"
+       #10000 means 20% reads are missing in readahead
+       [ $miss -lt 10000 ] ||  error "misses too much for small reads"
 }
 run_test 101e "check read-ahead for small read(1k) for small files(500k)"
 
@@ -6338,10 +6468,106 @@ test_102l() {
 
        return 0;
 }
-run_test 102l "listxattr filter test =================================="
+run_test 102l "listxattr size test =================================="
+
+test_102m() { # LU-3403 llite: error of listxattr when buffer is small
+       local path=$DIR/$tfile
+       touch $path
+
+       listxattr_size_check $path || error "listattr_size_check $path failed"
+}
+run_test 102m "Ensure listxattr fails on small bufffer ========"
 
 cleanup_test102
 
+getxattr() { # getxattr path name
+       # Return the base64 encoding of the value of xattr name on path.
+       local path=$1
+       local name=$2
+
+       # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
+       # file: $path
+       # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
+       #
+       # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
+
+       getfattr --absolute-names --encoding=base64 --name=$name $path |
+               awk -F= -v name=$name '$1 == name {
+                       print substr($0, index($0, "=") + 1);
+       }'
+}
+
+test_102n() { # LU-4101 mdt: protect internal xattrs
+       local file0=$DIR/$tfile.0
+       local file1=$DIR/$tfile.1
+       local xattr0=$TMP/$tfile.0
+       local xattr1=$TMP/$tfile.1
+       local name
+       local value
+
+       if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.50) ]
+       then
+               skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
+               return
+       fi
+
+       rm -rf $file0 $file1 $xattr0 $xattr1
+       touch $file0 $file1
+
+       # Get 'before' xattrs of $file1.
+       getfattr --absolute-names --dump --match=- $file1 > $xattr0
+
+       for name in lov lma lmv link fid version som hsm lfsck_namespace; do
+               # Try to copy xattr from $file0 to $file1.
+               value=$(getxattr $file0 trusted.$name 2> /dev/null)
+
+               setfattr --name=trusted.$name --value="$value" $file1 ||
+                       error "setxattr 'trusted.$name' failed"
+
+               # Try to set a garbage xattr.
+               value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
+
+               setfattr --name=trusted.$name --value="$value" $file1 ||
+                       error "setxattr 'trusted.$name' failed"
+
+               # Try to remove the xattr from $file1. We don't care if this
+               # appears to succeed or fail, we just don't want there to be
+               # any changes or crashes.
+               setfattr --remove=$trusted.$name $file1 2> /dev/null
+       done
+
+       # Get 'after' xattrs of file1.
+       getfattr --absolute-names --dump --match=- $file1 > $xattr1
+
+       if ! diff $xattr0 $xattr1; then
+               error "before and after xattrs of '$file1' differ"
+       fi
+
+       rm -rf $file0 $file1 $xattr0 $xattr1
+
+       return 0
+}
+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
@@ -6603,53 +6829,79 @@ test_116a() { # was previously test_116()
        [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return
 
        echo -n "Free space priority "
-       lctl get_param -n lov.*-clilov-*.qos_prio_free
+       do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free |
+               head -1
        declare -a AVAIL
        free_min_max
-       [ $MINV -gt 960000 ] && skip "too much free space in OST$MINI, skip" &&\
-               return
 
-       # generate uneven OSTs
+       [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip" && return
+       trap simple_cleanup_common EXIT
+
+       # Check if we need to generate uneven OSTs
        test_mkdir -p $DIR/$tdir/OST${MINI}
-       declare -i FILL
-       FILL=$(($MINV / 4))
-       echo "Filling 25% remaining space in OST${MINI} with ${FILL}Kb"
-       $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI}||error "setstripe failed"
-       i=0
-       while [ $FILL -gt 0 ]; do
-           i=$(($i + 1))
-           dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i bs=2M count=1 2>/dev/null
-           FILL=$(($FILL - 2048))
-           echo -n .
-       done
-       FILL=$(($MINV / 4))
-       sync
-       sleep_maxage
+       local FILL=$(($MINV / 4))
+       local DIFF=$(($MAXV - $MINV))
+       local DIFF2=$(($DIFF * 100 / $MINV))
+
+       local threshold=$(do_facet $SINGLEMDS \
+               lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -1)
+       threshold=${threshold%%%}
+       echo -n "Check for uneven OSTs: "
+       echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
+
+       if [ $DIFF2 -gt $threshold ]; then
+               echo "ok"
+               echo "Don't need to fill OST$MINI"
+       else
+               # generate uneven OSTs. Write 2% over the QOS threshold value
+               echo "no"
+               DIFF=$(($threshold - $DIFF2 + 2))
+               DIFF2=$(( ($MINV * $DIFF)/100 ))
+               echo "Fill ${DIFF}% remaining space in OST${MINI} with ${DIFF2}KB"
+               $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
+                       error "setstripe failed"
+               DIFF=$(($DIFF2 / 2048))
+               i=0
+               while [ $i -lt $DIFF ]; do
+                       i=$(($i + 1))
+                       dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
+                               bs=2M count=1 2>/dev/null
+                       echo -n .
+               done
+               echo .
+               sync
+               sleep_maxage
+               free_min_max
+       fi
 
-       free_min_max
        DIFF=$(($MAXV - $MINV))
        DIFF2=$(($DIFF * 100 / $MINV))
-       echo -n "diff=${DIFF}=${DIFF2}% must be > 20% for QOS mode..."
-       if [ $DIFF2 -gt 20 ]; then
-           echo "ok"
+       echo -n "diff=${DIFF}=${DIFF2}% must be > ${threshold}% for QOS mode..."
+       if [ $DIFF2 -gt $threshold ]; then
+               echo "ok"
        else
-           echo "failed - QOS mode won't be used"
-           error_ignore "QOS imbalance criteria not met"
-           return
+               echo "failed - QOS mode won't be used"
+               skip "QOS imbalance criteria not met"
+               simple_cleanup_common
+               return
        fi
 
        MINI1=$MINI; MINV1=$MINV
        MAXI1=$MAXI; MAXV1=$MAXV
 
        # now fill using QOS
-       echo writing a bunch of files to QOS-assigned OSTs
        $SETSTRIPE -c 1 $DIR/$tdir
+       FILL=$(($FILL / 200))
+       if [ $FILL -gt 600 ]; then
+               FILL=600
+       fi
+       echo "writing $FILL files to QOS-assigned OSTs"
        i=0
-       while [ $FILL -gt 0 ]; do
-           i=$(($i + 1))
-           dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1024 count=200 2>/dev/null
-           FILL=$(($FILL - 200))
-           echo -n .
+       while [ $i -lt $FILL ]; do
+               i=$(($i + 1))
+               dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
+                       count=1 2>/dev/null
+               echo -n .
        done
        echo "wrote $i 200k files"
        sync
@@ -6661,26 +6913,30 @@ test_116a() { # was previously test_116()
        echo "free space delta: orig $DIFF final $DIFF2"
        [ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
        DIFF=$(($MINV1 - ${AVAIL[$MINI1]}))
-       echo "Wrote $DIFF to smaller OST $MINI1"
+       echo "Wrote ${DIFF}KB to smaller OST $MINI1"
        DIFF2=$(($MAXV1 - ${AVAIL[$MAXI1]}))
-       echo "Wrote $DIFF2 to larger OST $MAXI1"
-       [ $DIFF -gt 0 ] && echo "Wrote $(($DIFF2 * 100 / $DIFF - 100))% more data to larger OST $MAXI1"
+       echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
+       FILL=$(($DIFF2 * 100 / $DIFF - 100))
+       [ $DIFF -gt 0 ] &&
+               echo "Wrote ${FILL}% more data to larger OST $MAXI1"
 
        # Figure out which files were written where
        UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
-               awk '/'$MINI1': / {print $2; exit}')
+                 awk '/'$MINI1': / {print $2; exit}')
        echo $UUID
-        MINC=$($GETSTRIPE --obd $UUID $DIR/$tdir | wc -l)
+       MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
        echo "$MINC files created on smaller OST $MINI1"
        UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
-               awk '/'$MAXI1': / {print $2; exit}')
+                 awk '/'$MAXI1': / {print $2; exit}')
        echo $UUID
-        MAXC=$($GETSTRIPE --obd $UUID $DIR/$tdir | wc -l)
+       MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
        echo "$MAXC files created on larger OST $MAXI1"
-       [ $MINC -gt 0 ] && echo "Wrote $(($MAXC * 100 / $MINC - 100))% more files to larger OST $MAXI1"
-       [ $MAXC -gt $MINC ] || error_ignore "stripe QOS didn't balance free space"
-
-       rm -rf $DIR/$tdir
+       FILL=$(($MAXC * 100 / $MINC - 100))
+       [ $MINC -gt 0 ] &&
+               echo "Wrote ${FILL}% more files to larger OST $MAXI1"
+       [ $MAXC -gt $MINC ] ||
+               error_ignore LU-9 "stripe QOS didn't balance free space"
+       simple_cleanup_common
 }
 run_test 116a "stripe QOS: free space balance ==================="
 
@@ -6710,7 +6966,7 @@ test_117() # bug 10891
         echo "Truncate succeeded."
        rm -f $DIR/$tfile
 }
-run_test 117 "verify fsfilt_extend =========="
+run_test 117 "verify osd extend =========="
 
 NO_SLOW_RESENDCOUNT=4
 export OLD_RESENDCOUNT=""
@@ -7178,7 +7434,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
 
@@ -7188,12 +7444,16 @@ 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}'`
+       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 -c1 $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
@@ -7203,8 +7463,8 @@ 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
@@ -7224,13 +7484,13 @@ 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
+       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
@@ -7248,9 +7508,9 @@ 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
+       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
@@ -7270,7 +7530,7 @@ 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
@@ -7300,11 +7560,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
@@ -7791,34 +8051,44 @@ test_129() {
                return
        fi
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
-
        ENOSPC=28
        EFBIG=27
 
+       rm -rf $DIR/$tdir
        test_mkdir -p $DIR/$tdir
 
-       MAX=$(stat -c%s "$DIR/$tdir")
+       # block size of mds1
+       local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
+       local MDSBLOCKSIZE=$($LCTL get_param -n mdc.*MDT0000*.blocksize)
+       local MAX=$((MDSBLOCKSIZE * 3))
        set_dir_limits $MAX
-       local I=0
+       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=$?
                #check two errors ENOSPC for new version of ext4 max_dir_size patch
                #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
                #and EFBIG for previous versions
-               if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then
+               if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
                        set_dir_limits 0
                        echo "return code $rc received as expected"
-                       multiop $DIR/$tdir/$J Oc
-                       rc=$?
+                       multiop $DIR/$tdir/$J Oc ||
+                               error_exit "multiop failed w/o dir size limit"
+
                        I=$(stat -c%s "$DIR/$tdir")
-                       if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then
-                               return 0
+
+                       if [ $(lustre_version_code $SINGLEMDS) -lt \
+                                       $(version_code 2.4.51) ]
+                       then
+                               [ $I -eq $MAX ] && return 0
                        else
-                               error_exit "return code $rc current dir size $I " \
-                                          "previous limit $MAX"
+                               [ $I -gt $MAX ] && return 0
                        fi
+                       error_exit "current dir size $I, previous limit $MAX"
                elif [ $rc -ne 0 ]; then
                        set_dir_limits 0
                        error_exit "return code $rc received instead of expected " \
@@ -7829,7 +8099,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 ========================"
 
@@ -8026,10 +8296,14 @@ test_130d() {
        $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file||error "setstripe on $fm_file"
        [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
                skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return
-       dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT || error "dd failed on $fm_file"
+
+       local actual_stripecnt=$($GETSTRIPE -c $fm_file)
+       dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripecnt ||
+               error "dd failed on $fm_file"
 
        filefrag -ves $fm_file || error "filefrag $fm_file failed"
-       filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+       filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" |
+               grep -v "ext:" | grep -v "found"`
 
        last_lun=`echo $filefrag_op | cut -d: -f5`
 
@@ -8053,7 +8327,7 @@ test_130d() {
                (( tot_len += ext_len ))
                last_lun=$frag_lun
        done
-       if (( num_luns != OSTCOUNT || tot_len != 1024 )); then
+       if (( num_luns != actual_stripecnt || tot_len != 1024 )); then
                cleanup_130
                error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
                return
@@ -8815,8 +9089,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."
@@ -8967,7 +9243,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
@@ -9009,6 +9285,39 @@ test_154c() {
 }
 run_test 154c "lfs path2fid and fid2path multiple arguments"
 
+test_154d() {
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.53) ]] &&
+               skip "Need MDS version at least 2.5.53" && return
+
+       if remote_mds; then
+               nid=$($LCTL list_nids | sed  "s/\./\\\./g")
+       else
+               nid="0@lo"
+       fi
+       local proc_ofile="mdt.*.exports.'$nid'.open_files"
+       local fd
+       local cmd
+
+       rm -f $DIR/$tfile
+       touch $DIR/$tfile
+
+       fid=$($LFS path2fid $DIR/$tfile)
+       # Open the file
+       fd=$(free_fd)
+       cmd="exec $fd<$DIR/$tfile"
+       eval $cmd
+       fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
+       echo $fid_list | grep $fid
+       rc=$?
+
+       cmd="exec $fd>/dev/null"
+       eval $cmd
+       if [ $rc -ne 0 ]; then
+               error "FID $fid not found in open files list $fid_list"
+       fi
+}
+run_test 154d "Verify open file fid"
+
 test_155_small_load() {
     local temp=$TMP/$tfile
     local file=$DIR/$tfile
@@ -9234,12 +9543,11 @@ test_156() {
     BEFORE=`roc_hit`
     cat $file >/dev/null
     AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == 0"; then
-        error_ignore 20762 "IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
-
+       if ! let "AFTER - BEFORE == 0"; then
+               error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
     log "Turn on the read cache and turn off the write cache"
     set_cache read on
@@ -9253,11 +9561,11 @@ test_156() {
     cancel_lru_locks osc
     cat $file >/dev/null
     AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == 0"; then
-        error_ignore 20762 "IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
+       if ! let "AFTER - BEFORE == 0"; then
+               error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
     log "Read again; it should be satisfied from the cache."
     BEFORE=`roc_hit`
@@ -9277,7 +9585,7 @@ run_test 156 "Verification of tunables ============================"
 #Changelogs
 err17935 () {
        if [ $MDSCOUNT -gt 1 ]; then
-               error_ignore 17935 $*
+               error_ignore bz17935 $*
        else
                error $*
        fi
@@ -9307,7 +9615,7 @@ changelog_extract_field() {
                tail -1
 }
 
-test_160() {
+test_160a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
        [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
@@ -9403,18 +9711,49 @@ test_160() {
                echo "$USERS other changelog users; can't verify off"
        fi
 }
-run_test 160 "changelog sanity"
+run_test 160a "changelog sanity"
+
+test_160b() { # LU-3587
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
+               { skip "Need MDS version at least 2.2.0"; return; }
+
+       local CL_USERS="mdd.$MDT0.changelog_users"
+       local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+       USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
+       echo "Registered as changelog user $USER"
+       $GET_CL_USERS | grep -q $USER ||
+               error "User $USER not found in changelog_users"
+
+       local LONGNAME1=$(str_repeat a 255)
+       local LONGNAME2=$(str_repeat b 255)
+
+       cd $DIR
+       echo "creating very long named file"
+       touch $LONGNAME1 || error "create of $LONGNAME1 failed"
+       echo "moving very long named file"
+       mv $LONGNAME1 $LONGNAME2
+
+       $LFS changelog $MDT0 | grep RENME
+
+       echo "deregistering $USER"
+       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+
+       rm -f $LONGNAME2
+}
+run_test 160b "Verify that very long rename doesn't crash in changelog"
 
 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
@@ -9767,6 +10106,15 @@ obdecho_test() {
        local pages=${3:-64}
         local rc=0
         local id
+
+       local count=10
+       local obd_size=$(get_obd_size $node $OBD)
+       local page_size=$(get_page_size $node)
+       if [[ -n "$obd_size" ]]; then
+               local new_count=$((obd_size / (pages * page_size / 1024)))
+               [[ $new_count -ge $count ]] || count=$new_count
+       fi
+
         do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
         [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
                            rc=2; }
@@ -9778,7 +10126,7 @@ obdecho_test() {
        [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
                           rc=4; }
        [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec "                 \
-                          "test_brw 10 w v $pages $id" || rc=4; }
+                          "test_brw $count w v $pages $id" || rc=4; }
        [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
                           rc=4; }
        [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec "    \
@@ -9933,7 +10281,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
@@ -10742,6 +11090,31 @@ test_208() {
 }
 run_test 208 "Exclusive open"
 
+test_209() {
+       [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
+               skip_env "must have disp_stripe" && return
+
+       touch $DIR/$tfile
+       sync; sleep 5; sync;
+
+       echo 3 > /proc/sys/vm/drop_caches
+       req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
+
+       # open/close 500 times
+       for i in $(seq 500); do
+               cat $DIR/$tfile
+       done
+
+       echo 3 > /proc/sys/vm/drop_caches
+       req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
+
+       echo "before: $req_before, after: $req_after"
+       [ $((req_after - req_before)) -ge 300 ] &&
+               error "open/close requests are not freed"
+       return 0
+}
+run_test 209 "read-only open/close requests should be freed promptly"
+
 test_212() {
        size=`date +%s`
        size=$((size % 8192 + 1))
@@ -10763,14 +11136,15 @@ test_213() {
 run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
 
 test_214() { # for bug 20133
-       test_mkdir -p $DIR/d214p/d214c
+       mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
        for (( i=0; i < 340; i++ )) ; do
-               touch $DIR/d214p/d214c/a$i
+               touch $DIR/$tdir/d214c/a$i
        done
 
-       ls -l $DIR/d214p || error "ls -l $DIR/d214p failed"
-       mv $DIR/d214p/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
+       ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
+       mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
        ls $DIR/d214c || error "ls $DIR/d214c failed"
+       rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
        rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
 }
 run_test 214 "hash-indexed directory test - bug 20133"
@@ -10995,6 +11369,10 @@ test_219() {
         dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
         $LCTL set_param fail_loc=0x411
         dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
+
+       # LU-4201
+       dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
+       $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
 }
 run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
 
@@ -11412,6 +11790,9 @@ test_228c() {
 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
 
 test_229() { # LU-2482, LU-3448
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
+               skip "No HSM support on MDS of $(get_lustre_version)," \
+                        "need 2.4.53 at least" && return
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
 
@@ -11430,26 +11811,13 @@ test_229() { # LU-2482, LU-3448
        [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
        stat $DIR/$tfile || error "failed to stat released file"
 
-       $TRUNCATE $DIR/$tfile 200000 &&
-               error "truncate of released file should fail"
-
-       # Ensure that nothing happened anyway.
-       $CHECKSTAT -s 0 $DIR/$tfile ||
-               error "released file size should not change"
-
-       # Stripe count should be no change after truncate
-       stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe failed"
-       [ $stripe_count -eq 2 ] || error "after trunc: ($stripe_count)"
-
        chown $RUNAS_ID $DIR/$tfile ||
                error "chown $RUNAS_ID $DIR/$tfile failed"
 
        chgrp $RUNAS_ID $DIR/$tfile ||
                error "chgrp $RUNAS_ID $DIR/$tfile failed"
 
-       touch $DIR/$tfile ||
-               error "touch $DIR/$tfile failed"
-
+       touch $DIR/$tfile || error "touch $DIR/$tfile failed"
        rm $DIR/$tfile || error "failed to remove released file"
 }
 run_test 229 "getstripe/stat/rm/attr changes work on released files"
@@ -11482,39 +11850,197 @@ test_230b() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
        local MDTIDX=1
-       local remote_dir=$DIR/$tdir/remote_dir
-       local rc=0
+       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
-       $LFS mkdir -i $MDTIDX $remote_dir ||
-               error "create remote directory failed"
+       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"
 
-       $LFS mkdir -i 0 $remote_dir/new_dir &&
-               error "nested remote directory create succeed!"
+       for file in $(find $DIR/$tdir); do
+               stat $file || error "stat $file failed"
+       done
 
-       do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=1
-       $LFS mkdir -i 0 $remote_dir/new_dir || rc=$?
-       do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=0
+       do_facet mds1 lctl set_param fail_loc=0
+       do_facet mds1 lctl set_param fail_val=0
 
-       [ $rc -ne 0 ] &&
-          error "create remote directory failed after set enable_remote_dir"
+       $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
 
-       rm -rf $remote_dir || error "first unlink remote directory failed"
+       mkdir -p $DIR/$tdir
 
-       $RUNAS -G$RUNAS_GID $LFS mkdir -i $MDTIDX $DIR/$tfile &&
-                                                       error "chown worked"
+       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
 
-       do_facet mds$MDTIDX lctl set_param \
-                               mdt.*.enable_remote_dir_gid=$RUNAS_GID
-       $LFS mkdir -i $MDTIDX $remote_dir || rc=$?
-       do_facet mds$MDTIDX lctl set_param mdt.*.enable_remote_dir_gid=0
+       $LFS mv -M $MDTIDX -v $DIR/$tdir || error "migrate remote dir error"
 
-       [ $rc -ne 0 ] &&
-          error "create remote dir failed after set enable_remote_dir_gid"
+       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 -r $DIR/$tdir || error "second unlink remote directory failed"
+       rm -rf $DIR/$tdir || error "rm dir failed after migration"
 }
-run_test 230b "nested remote directory should be failed"
+run_test 230d "check migrate big directory"
 
 test_231a()
 {
@@ -11580,7 +12106,7 @@ test_232() {
 }
 run_test 232 "failed lock should not block umount"
 
-test_233() {
+test_233a() {
        [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] ||
        { skip "Need MDS version at least 2.3.64"; return; }
 
@@ -11588,7 +12114,21 @@ test_233() {
        stat $MOUNT/.lustre/fid/$fid > /dev/null ||
                error "cannot access $MOUNT using its FID '$fid'"
 }
-run_test 233 "checking that OBF of the FS root succeeds"
+run_test 233a "checking that OBF of the FS root succeeds"
+
+test_233b() {
+       [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.90) ] ||
+       { skip "Need MDS version at least 2.5.90"; return; }
+
+       local fid=$($LFS path2fid $MOUNT/.lustre)
+       stat $MOUNT/.lustre/fid/$fid > /dev/null ||
+               error "cannot access $MOUNT/.lustre using its FID '$fid'"
+
+       fid=$($LFS path2fid $MOUNT/.lustre/fid)
+       stat $MOUNT/.lustre/fid/$fid > /dev/null ||
+               error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
+}
+run_test 233b "checking that OBF of the FS .lustre succeeds"
 
 test_234() {
        local p="$TMP/sanityN-$TESTNAME.parameters"
@@ -11600,8 +12140,6 @@ test_234() {
        touch $DIR/$tdir/$tfile || error "touch failed"
        # OBD_FAIL_LLITE_XATTR_ENOMEM
        $LCTL set_param fail_loc=0x1405
-       setfattr -n user.attr -v value $DIR/$tdir/$tfile &&
-               error "setfattr should have failed with ENOMEM"
        if [ ! -f /etc/SuSE-release ]; then
                # attr pre-2.4.44-7 had a bug with rc
                # LU-3703 - SLES clients have older attr
@@ -11632,6 +12170,276 @@ test_235() {
 }
 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 -c1 $DIR/$tdir || error "mkdir $tdir failed"
+
+       local ref1=/etc/passwd
+       local ref2=/etc/group
+       local file1=$DIR/$tdir/f1
+       local file2=$DIR/$tdir/f2
+
+       $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
+       cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
+       $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
+       cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
+       local fd=$(free_fd)
+       local cmd="exec $fd<>$file2"
+       eval $cmd
+       rm $file2
+       $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
+               error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
+       cmd="exec $fd>&-"
+       eval $cmd
+       cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
+
+       #cleanup
+       rm -rf $DIR/$tdir
+}
+run_test 236 "Layout swap on open unlinked file"
+
+# test to verify file handle related system calls
+# (name_to_handle_at/open_by_handle_at)
+# The new system calls are supported in glibc >= 2.14.
+
+test_237() {
+       echo "Test file_handle syscalls" > $DIR/$tfile
+       check_fhandle_syscalls $DIR/$tfile ||
+               error "check_fhandle_syscalls failed"
+}
+run_test 237 "Verify name_to_handle_at/open_by_handle_at syscalls"
+
+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
 #
@@ -11651,6 +12459,7 @@ test_900() {
 run_test 900 "umount should not race with any mgc requeue thread"
 
 complete $SECONDS
+[ -f $EXT2_DEV ] && rm $EXT2_DEV || true
 check_and_cleanup_lustre
 if [ "$I_MOUNTED" != "yes" ]; then
        lctl set_param debug="$OLDDEBUG" 2> /dev/null || true