Whamcloud - gitweb
LU-2469 test: Skip failing ZFS tests
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
index b453de7..4e60922 100644 (file)
@@ -9,19 +9,35 @@ set -e
 
 ONLY=${ONLY:-"$*"}
 
-# bug number for skipped test:
-ALWAYS_EXCEPT="$CONF_SANITY_EXCEPT"
+# bug number for skipped test:     LU-2828
+ALWAYS_EXCEPT="$CONF_SANITY_EXCEPT 59 64"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
+is_sles11()                                            # LU-2181
+{
+       if [ -r /etc/SuSE-release ]
+       then
+               local vers=`grep VERSION /etc/SuSE-release | awk '{print $3}'`
+               local patchlev=`grep PATCHLEVEL /etc/SuSE-release \
+                       | awk '{print $3}'`
+               if [ $vers -eq 11 ] && [ $patchlev -eq 2 ]
+               then
+                       return 0
+               fi
+       fi
+       return 1
+}
+
+if is_sles11; then                                     # LU-2181
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 23a 34b"
+fi
+
 if [ "$FAILURE_MODE" = "HARD" ]; then
        CONFIG_EXCEPTIONS="24a " && \
        echo "Except the tests: $CONFIG_EXCEPTIONS for FAILURE_MODE=$FAILURE_MODE, bug 23573" && \
        ALWAYS_EXCEPT="$ALWAYS_EXCEPT $CONFIG_EXCEPTIONS"
 fi
 
-# LU-2059
-ALWAYS_EXCEPT="$ALWAYS_EXCEPT 5d 19b 21b 27a"
-
 # bug number for skipped test:
 # a tool to create lustre filesystem images
 ALWAYS_EXCEPT="32newtarball $ALWAYS_EXCEPT"
@@ -59,6 +75,10 @@ if [[ "$LDISKFS_MKFS_OPTS" != *lazy_itable_init* ]]; then
        LDISKFS_MKFS_OPTS=$(csa_add "$LDISKFS_MKFS_OPTS" -E lazy_itable_init)
 fi
 
+[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
+# bug number for skipped test:        LU-2778 LU-2059
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 57b     50h"
+
 init_logging
 
 #
@@ -70,31 +90,6 @@ require_dsh_ost || exit 0
 
 assert_DIR
 
-reformat() {
-        formatall
-}
-
-writeconf1() {
-       local facet=$1
-       local dev=$2
-
-       stop ${facet} -f
-       rm -f ${facet}active
-       # who knows if/where $TUNEFS is installed?  Better reformat if it fails...
-       do_facet ${facet} "$TUNEFS --quiet --writeconf $dev" ||
-               { echo "tunefs failed, reformatting instead" && reformat_and_config && return 1; }
-       return 0
-}
-
-writeconf() {
-       # we need ldiskfs
-       load_modules
-       # if writeconf fails anywhere, we reformat everything
-       writeconf1 mds `mdsdevname 1` || return 0
-       writeconf1 ost1 `ostdevname 1` || return 0
-       writeconf1 ost2 `ostdevname 2` || return 0
-}
-
 gen_config() {
        # The MGS must be started before the OSTs for a new fs, so start
        # and stop to generate the startup logs.
@@ -113,20 +108,54 @@ reformat_and_config() {
        gen_config
 }
 
+writeconf_or_reformat() {
+       # There are at most 2 OSTs for write_conf test
+       # who knows if/where $TUNEFS is installed?
+       # Better reformat if it fails...
+       writeconf_all $MDSCOUNT 2 ||
+               { echo "tunefs failed, reformatting instead" &&
+                 reformat_and_config && return 1; }
+       return 0
+}
+
+reformat() {
+        formatall
+}
+
 start_mgs () {
        echo "start mgs"
        start mgs $MGSDEV $MGS_MOUNT_OPTS
 }
 
-start_mds() {
-       local facet=$SINGLEMDS
-       # we can not use MDSDEV1 here because SINGLEMDS could be set not to mds1 only
-       local num=$(echo $facet | tr -d "mds")
+start_mdt() {
+       local num=$1
+       local facet=mds$num
        local dev=$(mdsdevname $num)
+       shift 1
+
        echo "start mds service on `facet_active_host $facet`"
        start $facet ${dev} $MDS_MOUNT_OPTS $@ || return 94
 }
 
+stop_mdt() {
+       local num=$1
+       local facet=mds$num
+       local dev=$(mdsdevname $num)
+       shift 1
+
+       echo "stop mds service on `facet_active_host $facet`"
+       # These tests all use non-failover stop
+       stop $facet -f  || return 97
+}
+
+start_mds() {
+       local num
+
+       for num in $(seq $MDSCOUNT); do
+               start_mdt $num $@ || return 94
+       done
+}
+
 start_mgsmds() {
        if ! combined_mgs_mds ; then
                start_mgs
@@ -135,9 +164,10 @@ start_mgsmds() {
 }
 
 stop_mds() {
-       echo "stop mds service on `facet_active_host $SINGLEMDS`"
-       # These tests all use non-failover stop
-       stop $SINGLEMDS -f  || return 97
+       local num
+       for num in $(seq $MDSCOUNT); do
+               stop_mdt $num || return 97
+       done
 }
 
 stop_mgs() {
@@ -284,9 +314,9 @@ test_1() {
 run_test 1 "start up ost twice (should return errors)"
 
 test_2() {
-       start_mds
+       start_mdt 1
        echo "start mds second time.."
-       start_mds && error "2nd MDT start should fail"
+       start_mdt 1 && error "2nd MDT start should fail"
        start_ost
        mount_client $MOUNT
        check_mount || return 43
@@ -421,6 +451,9 @@ test_5d() {
        grep " $MOUNT " /etc/mtab && \
                error false "unexpected entry in mtab before mount" && return 10
 
+       [ "$(facet_fstype ost1)" = "zfs" ] &&
+               skip "LU-2059: no local config for ZFS OSTs" && return
+
        local rc=0
        start_ost
        start_mds
@@ -612,8 +645,14 @@ test_18() {
                 log "use STORED_MDSSIZE=$STORED_MDSSIZE"
 
         # check if the block device is large enough
-        [ -z "$OK" ] && $(is_blkdev $SINGLEMDS $MDSDEV $MIN) && OK=1 &&
-                myMDSSIZE=$MIN && log "use device $MDSDEV with MIN=$MIN"
+       is_blkdev $SINGLEMDS $MDSDEV $MIN
+       local large_enough=$?
+       if [ -n "$OK" ]; then
+               [ $large_enough -ne 0 ] && OK=""
+       else
+               [ $large_enough -eq 0 ] && OK=1 && myMDSSIZE=$MIN &&
+                       log "use device $MDSDEV with MIN=$MIN"
+       fi
 
         # check if a loopback device has enough space for fs metadata (5%)
 
@@ -660,6 +699,9 @@ test_19a() {
 run_test 19a "start/stop MDS without OSTs"
 
 test_19b() {
+       [ "$(facet_fstype ost1)" = "zfs" ] &&
+               skip "LU-2059: no local config for ZFS OSTs" && return
+
        start_ost || return 1
        stop_ost -f || return 2
 }
@@ -696,6 +738,9 @@ test_21a() {
 run_test 21a "start mds before ost, stop ost first"
 
 test_21b() {
+       [ "$(facet_fstype ost1)" = "zfs" ] &&
+               skip "LU-2059: no local config for ZFS OSTs" && return
+
         start_ost
        start_mds
         wait_osc_import_state mds ost FULL
@@ -713,7 +758,7 @@ test_21c() {
        stop_ost2
        stop_mds
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
 }
 run_test 21c "start mds between two osts, stop mds last"
 
@@ -736,18 +781,22 @@ test_21d() {
         stop_mds
         stop_mgs
         #writeconf to remove all ost2 traces for subsequent tests
-        writeconf
+       writeconf_or_reformat
         start_mgs
 }
 run_test 21d "start mgs then ost and then mds"
 
 test_22() {
+       local num
+
        start_mds
 
        echo Client mount with ost in logs, but none running
        start_ost
        # wait until mds connected to ost and open client connection
-        wait_osc_import_state mds ost FULL
+       for num in $(seq 1 $MDSCOUNT); do
+               wait_osc_import_state mds${num} ost FULL
+       done
        stop_ost
        mount_client $MOUNT
        # check_mount will block trying to contact ost
@@ -767,8 +816,10 @@ test_22() {
                sleep $((TIMEOUT + TIMEOUT + TIMEOUT))
        fi
        mount_client $MOUNT
-        wait_osc_import_state mds ost FULL
-        wait_osc_import_state client ost FULL
+       for num in $(seq 1 $MDSCOUNT); do
+               wait_osc_import_state mds${num} ost FULL
+       done
+       wait_osc_import_state client ost FULL
        check_mount || return 41
        pass
 
@@ -876,11 +927,12 @@ test_24a() {
 
        # test 8-char fsname as well
        local FSNAME2=test1234
-       add fs2mds $(mkfs_opts mds1) --nomgs --mgsnode=$MGSNID \
+
+       add fs2mds $(mkfs_opts mds1 ${fs2mdsdev} ) --nomgs --mgsnode=$MGSNID \
                --fsname=${FSNAME2} --reformat $fs2mdsdev $fs2mdsvdev || exit 10
 
-       add fs2ost $(mkfs_opts ost1) --fsname=${FSNAME2} --reformat \
-               $fs2ostdev $fs2ostvdev || exit 10
+       add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --fsname=${FSNAME2} \
+               --reformat $fs2ostdev $fs2ostvdev || exit 10
 
        setup
        start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_24a EXIT INT
@@ -926,8 +978,8 @@ test_24b() {
        local fs2mdsdev=$(mdsdevname 1_2)
        local fs2mdsvdev=$(mdsvdevname 1_2)
 
-       add fs2mds $(mkfs_opts mds1) --mgs --fsname=${FSNAME}2 --reformat \
-               $fs2mdsdev $fs2mdsvdev || exit 10
+       add fs2mds $(mkfs_opts mds1 ${fs2mdsdev} ) --mgs --fsname=${FSNAME}2 \
+               --reformat $fs2mdsdev $fs2mdsvdev || exit 10
        setup
        start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && return 2
        cleanup || return 6
@@ -961,6 +1013,9 @@ test_26() {
 run_test 26 "MDT startup failure cleans LOV (should return errs)"
 
 test_27a() {
+       [ "$(facet_fstype ost1)" = "zfs" ] &&
+               skip "LU-2059: no local config for ZFS OSTs" && return
+
        start_ost || return 1
        start_mds || return 2
        echo "Requeue thread should have started: "
@@ -974,8 +1029,9 @@ run_test 27a "Reacquire MGS lock if OST started first"
 
 test_27b() {
        # FIXME. ~grev
-        setup
-        local device=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }')
+       setup
+       local device=$(do_facet $SINGLEMDS "lctl get_param -n devices" |
+                       awk '($3 ~ "mdt" && $4 ~ "MDT0000") { print $4 }')
 
        facet_failover $SINGLEMDS
        set_conf_param_and_check $SINGLEMDS                             \
@@ -1035,28 +1091,30 @@ test_29() {
            echo "Live client success: got $RESULT"
        fi
 
-       # check MDT too
-       local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0001)
-       mdtosc=${mdtosc/-MDT*/-MDT\*}
-       local MPROC="osc.$mdtosc.active"
-       local MAX=30
-       local WAIT=0
-       while [ 1 ]; do
-           sleep 5
-           RESULT=`do_facet $SINGLEMDS " lctl get_param -n $MPROC"`
-           [ ${PIPESTATUS[0]} = 0 ] || error "Can't read $MPROC"
-           if [ $RESULT -eq $DEAC ]; then
-               echo "MDT deactivated also after $WAIT sec (got $RESULT)"
-               break
-           fi
-           WAIT=$((WAIT + 5))
-           if [ $WAIT -eq $MAX ]; then
-               echo "MDT not deactivated: wanted $DEAC got $RESULT"
-               return 4
-           fi
-           echo "Waiting $(($MAX - $WAIT)) secs for MDT deactivated"
+       # check MDTs too
+       for num in $(seq $MDSCOUNT); do
+               local mdtosc=$(get_mdtosc_proc_path mds${num} $FSNAME-OST0001)
+               local MPROC="osc.$mdtosc.active"
+               local MAX=30
+               local WAIT=0
+               while [ 1 ]; do
+                       sleep 5
+                       RESULT=$(do_facet mds${num} " lctl get_param -n $MPROC")
+                       [ ${PIPESTATUS[0]} = 0 ] || error "Can't read $MPROC"
+                       if [ $RESULT -eq $DEAC ]; then
+                               echo -n "MDT deactivated also after"
+                               echo "$WAIT sec (got $RESULT)"
+                               break
+                       fi
+                       WAIT=$((WAIT + 5))
+                       if [ $WAIT -eq $MAX ]; then
+                               echo -n "MDT not deactivated: wanted $DEAC"
+                               echo  "got $RESULT"
+                               return 4
+                       fi
+                       echo "Waiting $(($MAX - $WAIT))secs for MDT deactivated"
+               done
        done
-
         # test new client starts deactivated
        umount_client $MOUNT || return 200
        mount_client $MOUNT
@@ -1076,7 +1134,7 @@ test_29() {
        stop_ost2
        cleanup_nocli
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
 }
 run_test 29 "permanently remove an OST"
 
@@ -1219,7 +1277,7 @@ test_32newtarball() {
                          sed -e 's/\./_/g')    # E.g., "1.8.7" -> "1_8"
        dst=$(cd $dst; pwd)
        pushd $tmp/img
-       tar cjvf $dst/disk$version-$FSTYPE.tar.bz2 -S *
+       tar cjvf $dst/disk$version-$(facet_fstype $SINGLEMDS).tar.bz2 -S *
        popd
 
        rm -r $tmp
@@ -1244,9 +1302,13 @@ t32_check() {
                exit 0
        fi
 
-       local IMGTYPE=$FSTYPE
+       if [ -n "$($LCTL list_nids | grep -v '\(tcp\|lo\)[[:digit:]]*$')" ]; then
+               skip "LU-2200: Test cannot run over Infiniband"
+               exit 0
+       fi
+
+       local IMGTYPE=$(facet_fstype $SINGLEMDS)
 
-       [ ! -z "$MDSFSTYPE" ] && IMGTYPE=$MDSFSTYPE
        tarballs=$($r find $RLUSTRE/tests -maxdepth 1 -name \'disk*-$IMGTYPE.tar.bz2\')
 
        if [ -z "$tarballs" ]; then
@@ -1267,6 +1329,9 @@ t32_test_cleanup() {
        if $shall_cleanup_mdt; then
                $r umount -d $tmp/mnt/mdt || rc=$?
        fi
+       if $shall_cleanup_mdt1; then
+               $r umount -d $tmp/mnt/mdt1 || rc=$?
+       fi
        if $shall_cleanup_ost; then
                $r umount -d $tmp/mnt/ost || rc=$?
        fi
@@ -1294,7 +1359,8 @@ t32_reload_modules() {
 
        while ((i < 20)); do
                echo "Unloading modules on $node: Attempt $i"
-               do_rpc_nodes $node $LUSTRE_RMMOD $FSTYPE && all_removed=true
+               do_rpc_nodes $node $LUSTRE_RMMOD $(facet_fstype $SINGLEMDS) &&
+                       all_removed=true
                do_rpc_nodes $node check_mem_leak || return 1
                if $all_removed; then
                        load_modules
@@ -1327,11 +1393,15 @@ t32_wait_til_devices_gone() {
 t32_test() {
        local tarball=$1
        local writeconf=$2
+       local dne_upgrade=${dne_upgrade:-"no"}
        local shall_cleanup_mdt=false
+       local shall_cleanup_mdt1=false
        local shall_cleanup_ost=false
        local shall_cleanup_lustre=false
        local node=$(facet_active_host $SINGLEMDS)
        local r="do_node $node"
+       local node2=$(facet_active_host mds2)
+       local r2="do_node $node2"
        local tmp=$TMP/t32
        local img_commit
        local img_kernel
@@ -1380,6 +1450,28 @@ t32_test() {
        }
        shall_cleanup_mdt=true
 
+       if [ "$dne_upgrade" != "no" ]; then
+               echo "mkfs new MDT...."
+               add mds2 $(mkfs_opts mds2 $(mdsdevname 2) $fsname) --reformat \
+                       $(mdsdevname 2) $(mdsvdevname 2) > /dev/null || {
+                       error_noexit "Mkfs new MDT failed"
+                       return 1
+               }
+
+               $r2 $TUNEFS --dryrun $(mdsdevname 2) || {
+                       error_noexit "tunefs.lustre before mounting the MDT"
+                       return 1
+               }
+
+               echo "mount new MDT...."
+               $r2 mkdir -p $tmp/mnt/mdt1
+               $r2 mount -t lustre -o $mopts $(mdsdevname 2) $tmp/mnt/mdt1 || {
+                       error_noexit "mount mdt1 failed"
+                       return 1
+               }
+               shall_cleanup_mdt1=true
+       fi
+
        uuid=$($r $LCTL get_param -n mdt.$fsname-MDT0000.uuid) || {
                error_noexit "Getting MDT UUID"
                return 1
@@ -1438,6 +1530,23 @@ t32_test() {
                return 1
        }
 
+       if [ "$dne_upgrade" != "no" ]; then
+               $r2 $LCTL conf_param \
+                               $fsname-MDT0001.mdc.max_rpcs_in_flight=9 || {
+                       error_noexit "Setting MDT1 \"max_rpcs_in_flight\""
+                       return 1
+               }
+               $r2 $LCTL conf_param $fsname-MDT0001.failover.node=$nid || {
+                       error_noexit "Setting MDT1 \"failover.node\""
+                       return 1
+               }
+               $r2 $LCTL conf_param $fsname-MDT0001.lov.stripesize=4M || {
+                       error_noexit "Setting MDT1 \"lov.stripesize\""
+                       return 1
+               }
+
+       fi
+
        if [ "$writeconf" ]; then
                mount -t lustre $nid:/$fsname $tmp/mnt/lustre || {
                        error_noexit "Mounting the client"
@@ -1445,10 +1554,40 @@ t32_test() {
                }
                shall_cleanup_lustre=true
                $LCTL set_param debug="$PTLDEBUG"
+               if [ "$dne_upgrade" != "no" ]; then
+                       $LFS mkdir -i 1 $tmp/mnt/lustre/remote_dir || {
+                               error_noexit "set remote dir failed"
+                               return 1
+                       }
 
-               if $r test -f $tmp/sha1sums; then
-                       $r sort -k 2 $tmp/sha1sums >$tmp/sha1sums.orig
                        pushd $tmp/mnt/lustre
+                       tar -cf - . --exclude=./remote_dir |
+                               tar -xvf - -C remote_dir 1>/dev/null || {
+                               error_noexit "cp to remote dir failed"
+                               return 1
+                       }
+                       popd
+               fi
+
+               dd if=/dev/zero of=$tmp/mnt/lustre/tmp_file bs=10k count=10 || {
+                       error_noexit "dd failed"
+                       return 1
+               }
+               rm -rf $tmp/mnt/lustre/tmp_file || {
+                       error_noexit "rm failed"
+                       return 1
+               }
+
+               if $r test -f $tmp/sha1sums; then
+                       # LU-2393 - do both sorts on same node to ensure locale
+                       # is identical
+                       $r cat $tmp/sha1sums | sort -k 2 >$tmp/sha1sums.orig
+                       if [ "$dne_upgrade" != "no" ]; then
+                               pushd $tmp/mnt/lustre/remote_dir
+                       else
+                               pushd $tmp/mnt/lustre
+                       fi
+
                        find ! -name .lustre -type f -exec sha1sum {} \; |
                                sort -k 2 >$tmp/sha1sums || {
                                error_noexit "sha1sum"
@@ -1463,12 +1602,21 @@ t32_test() {
                        echo "sha1sum verification skipped"
                fi
 
+               if [ "$dne_upgrade" != "no" ]; then
+                       rm -rf $tmp/mnt/lustre/remote_dir || {
+                               error_noexit "remove remote dir failed"
+                               return 1
+                       }
+               fi
+
                if $r test -f $tmp/list; then
                        #
                        # There is not a Test Framework API to copy files to or
                        # from a remote node.
                        #
-                       $r sort -k 6 $tmp/list >$tmp/list.orig
+                       # LU-2393 - do both sorts on same node to ensure locale
+                       # is identical
+                       $r cat $tmp/list | sort -k 6 >$tmp/list.orig
                        pushd $tmp/mnt/lustre
                        ls -Rni --time-style=+%s | sort -k 6 >$tmp/list || {
                                error_noexit "ls"
@@ -1504,7 +1652,8 @@ t32_test() {
                # regenerate every image for each test addition.
                #
 
-               nrpcs_orig=$($LCTL get_param -n mdc.*.max_rpcs_in_flight) || {
+               nrpcs_orig=$($LCTL get_param \
+                               -n mdc.*MDT0000*.max_rpcs_in_flight) || {
                        error_noexit "Getting \"max_rpcs_in_flight\""
                        return 1
                }
@@ -1513,8 +1662,8 @@ t32_test() {
                        error_noexit "Changing \"max_rpcs_in_flight\""
                        return 1
                }
-               wait_update $HOSTNAME "$LCTL get_param -n mdc.*.max_rpcs_in_flight"     \
-                           $nrpcs || {
+               wait_update $HOSTNAME "$LCTL get_param \
+                       -n mdc.*MDT0000*.max_rpcs_in_flight" $nrpcs || {
                        error_noexit "Verifying \"max_rpcs_in_flight\""
                        return 1
                }
@@ -1581,6 +1730,20 @@ test_32b() {
 }
 run_test 32b "Upgrade with writeconf"
 
+test_32c() {
+       local tarballs
+       local tarball
+       local rc=0
+
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       t32_check
+       for tarball in $tarballs; do
+               dne_upgrade=yes t32_test $tarball writeconf || rc=$?
+       done
+       return $rc
+}
+run_test 32c "dne upgrade test"
+
 test_33a() { # bug 12333, was test_33
         local rc=0
         local FSNAME2=test-123
@@ -1605,10 +1768,11 @@ test_33a() { # bug 12333, was test_33
                mkfsoptions="--mkfsoptions=\\\"-J size=8\\\"" # See bug 17931.
        fi
 
-       add fs2mds $(mkfs_opts mds1) --fsname=${FSNAME2} --reformat \
-               $mkfsoptions $fs2mdsdev $fs2mdsvdev || exit 10
-       add fs2ost $(mkfs_opts ost1) --mgsnode=$MGSNID --fsname=${FSNAME2} \
-               --index=8191 --reformat $fs2ostdev $fs2ostvdev || exit 10
+       add fs2mds $(mkfs_opts mds1 ${fs2mdsdev}) --mgs --fsname=${FSNAME2} \
+               --reformat $mkfsoptions $fs2mdsdev $fs2mdsvdev || exit 10
+       add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --mgsnode=$MGSNID \
+               --fsname=${FSNAME2} --index=8191 --reformat $fs2ostdev \
+               $fs2ostvdev || exit 10
 
         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_24a EXIT INT
         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
@@ -1633,7 +1797,7 @@ test_33b() {      # was test_34
 
         do_facet client dd if=/dev/zero of=$MOUNT/24 bs=1024k count=1
         # Drop lock cancelation reply during umount
-       #define OBD_FAIL_LDLM_CANCEL             0x304
+       #define OBD_FAIL_LDLM_CANCEL_NET                        0x304
         do_facet client lctl set_param fail_loc=0x80000304
         #lctl set_param debug=-1
         umount_client $MOUNT
@@ -1697,7 +1861,8 @@ test_35a() { # bug 12459
        log "Set up a fake failnode for the MDS"
        FAKENID="127.0.0.2"
        local device=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
-       do_facet mgs $LCTL conf_param ${device}.failover.node=$FAKENID || return 4
+       do_facet mgs "$LCTL conf_param ${device}.failover.node=" \
+               "$(h2$NETTYPE $FAKENID)" || return 4
 
        log "Wait for RECONNECT_INTERVAL seconds (10s)"
        sleep 10
@@ -1705,13 +1870,13 @@ test_35a() { # bug 12459
        MSG="conf-sanity.sh test_35a `date +%F%kh%Mm%Ss`"
        $LCTL clear
        log "$MSG"
-       log "Stopping the MDT:"
-       stop_mds || return 5
+       log "Stopping the MDT: $device"
+       stop_mdt 1 || return 5
 
        df $MOUNT > /dev/null 2>&1 &
        DFPID=$!
-       log "Restarting the MDT:"
-       start_mds || return 6
+       log "Restarting the MDT: $device"
+       start_mdt 1 || return 6
        log "Wait for df ($DFPID) ... "
        wait $DFPID
        log "done"
@@ -1733,7 +1898,7 @@ test_35a() { # bug 12459
        [ "$NEXTCONN" != "0" ] && log "The client didn't try to reconnect to the last active server (tried ${NEXTCONN} instead)" && return 7
        cleanup
        # remove nid settings
-       writeconf
+       writeconf_or_reformat
 }
 run_test 35a "Reconnect to the last active server first"
 
@@ -1751,8 +1916,8 @@ test_35b() { # bug 18674
        FAKENID="127.0.0.2"
        local device=$(do_facet $SINGLEMDS "$LCTL get_param -n devices" | \
                        awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
-       do_facet mgs "$LCTL conf_param ${device}.failover.node=$FAKENID" || \
-               return 1
+       do_facet mgs "$LCTL conf_param ${device}.failover.node=" \
+               "$(h2$NETTYPE $FAKENID)" || return 1
 
        local at_max_saved=0
        # adaptive timeouts may prevent seeing the issue
@@ -1813,7 +1978,7 @@ test_35b() { # bug 18674
 
        cleanup
        # remove nid settings
-       writeconf
+       writeconf_or_reformat
 }
 run_test 35b "Continue reconnection retries, if the active server is busy"
 
@@ -1842,14 +2007,14 @@ test_36() { # 12743
        local fs2ostvdev=$(ostvdevname 1_2)
        local fs3ostvdev=$(ostvdevname 2_2)
 
-       add fs2mds $(mkfs_opts mds1) --fsname=${FSNAME2} --reformat \
-               $fs2mdsdev $fs2mdsvdev || exit 10
+       add fs2mds $(mkfs_opts mds1 ${fs2mdsdev}) --mgs --fsname=${FSNAME2} \
+               --reformat $fs2mdsdev $fs2mdsvdev || exit 10
        # XXX after we support non 4K disk blocksize in ldiskfs, specify a
        #     different one than the default value here.
-       add fs2ost $(mkfs_opts ost1) --mgsnode=$MGSNID --fsname=${FSNAME2} \
-               --reformat $fs2ostdev $fs2ostvdev || exit 10
-       add fs3ost $(mkfs_opts ost1) --mgsnode=$MGSNID --fsname=${FSNAME2} \
-               --reformat $fs3ostdev $fs3ostvdev || exit 10
+       add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --mgsnode=$MGSNID \
+               --fsname=${FSNAME2} --reformat $fs2ostdev $fs2ostvdev || exit 10
+       add fs3ost $(mkfs_opts ost1 ${fs3ostdev}) --mgsnode=$MGSNID \
+               --fsname=${FSNAME2} --reformat $fs3ostdev $fs3ostvdev || exit 10
 
         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS
         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
@@ -2079,15 +2244,23 @@ test_41b() {
 run_test 41b "mount mds with --nosvc and --nomgs on first mount"
 
 test_42() { #bug 14693
-        setup
-        check_mount || return 2
-        do_facet mgs $LCTL conf_param lustre.llite.some_wrong_param=10
-        umount_client $MOUNT
-        mount_client $MOUNT || return 1
-        cleanup
-        return 0
+       setup
+       check_mount || error "client was not mounted"
+
+       do_facet mgs $LCTL conf_param $FSNAME.llite.some_wrong_param=10
+       umount_client $MOUNT ||
+               error "unmounting client failed with invalid llite param"
+       mount_client $MOUNT ||
+               error "mounting client failed with invalid llite param"
+
+       do_facet mgs $LCTL conf_param $FSNAME.sys.some_wrong_param=20
+       cleanup || error "stopping $FSNAME failed with invalid sys param"
+       setup
+       check_mount || "client was not mounted with invalid sys param"
+       cleanup || error "stopping $FSNAME failed with invalid sys param"
+       return 0
 }
-run_test 42 "invalid config param should not prevent client from mounting"
+run_test 42 "allow client/server mount/unmount with invalid config param"
 
 test_43() {
        [ $UID -ne 0 -o $RUNAS_ID -eq 0 ] && skip_env "run as root"
@@ -2244,7 +2417,7 @@ cleanup_46a() {
        stop_mds || rc=$?
        cleanup_nocli || rc=$?
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
        return $rc
 }
 
@@ -2486,7 +2659,7 @@ test_50c() {
        stop_ost2 || error "Unable to stop OST2"
        stop_mds || error "Unable to stop MDS"
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
 }
 run_test 50c "lazystatfs one server down =========================="
 
@@ -2508,7 +2681,7 @@ test_50d() {
        stop_ost2 || error "Unable to stop OST2"
        stop_mds || error "Unable to stop MDS"
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
 }
 run_test 50d "lazystatfs client/server conn race =========================="
 
@@ -2590,7 +2763,7 @@ test_50f() {
        stop_ost || error "Unable to stop OST1"
        stop_mds || error "Unable to stop MDS"
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
 }
 run_test 50f "normal statfs one server in down =========================="
 
@@ -2618,10 +2791,46 @@ test_50g() {
        stop_ost || error "Unable to stop OST1"
        stop_mds || error "Unable to stop MDS"
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
 }
 run_test 50g "deactivated OST should not cause panic====================="
 
+# LU-642
+test_50h() {
+       # prepare MDT/OST, make OSC inactive for OST1
+       [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2, skipping" && return
+       do_facet ost1 "$TUNEFS --param osc.active=0 `ostdevname 1`" ||
+               error "tunefs OST1 failed"
+       start_mds  || error "Unable to start MDT"
+       start_ost  || error "Unable to start OST1"
+       start_ost2 || error "Unable to start OST2"
+       mount_client $MOUNT || error "client start failed"
+
+       mkdir -p $DIR/$tdir
+
+       # activatate OSC for OST1
+       local TEST="$LCTL get_param -n osc.${FSNAME}-OST0000-osc-[!M]*.active"
+       set_conf_param_and_check client                                 \
+               "$TEST" "${FSNAME}-OST0000.osc.active" 1 ||
+               error "Unable to activate OST1"
+
+       mkdir -p $DIR/$tdir/2
+       $LFS setstripe -c -1 -i 0 $DIR/$tdir/2
+       sleep 1 && echo "create a file after OST1 is activated"
+       # create some file
+       createmany -o $DIR/$tdir/2/$tfile-%d 1
+
+       # check OSC import is working
+       stat $DIR/$tdir/2/* >/dev/null 2>&1 ||
+               error "some OSC imports are still not connected"
+
+       # cleanup
+       umount_client $MOUNT || error "Unable to umount client"
+       stop_ost2 || error "Unable to stop OST2"
+       cleanup_nocli
+}
+run_test 50h "LU-642: activate deactivated OST  ==="
+
 test_51() {
        local LOCAL_TIMEOUT=20
 
@@ -2641,7 +2850,7 @@ test_51() {
        stop_ost2 || return 3
        cleanup
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
 }
 run_test 51 "Verify that mdt_reint handles RMF_MDT_MD correctly when an OST is added"
 
@@ -2755,9 +2964,10 @@ test_52() {
 
        # backup objects
        echo backup objects to $ost1tmp/objects
-       local objects=$(do_node $ost1node 'find '$ost1mnt'/O/0 -type f -size +0'\
-                       '-newer '$ost1tmp'/modified_first -regex ".*\/[0-9]+"')
-       copy_files_xattrs $ost1node $ost1tmp/objects $ost1tmp/object_xattrs $objects
+       local objects=$(do_node $ost1node 'find '$ost1mnt'/O/[0-9]* -type f'\
+               '-size +0 -newer '$ost1tmp'/modified_first -regex ".*\/[0-9]+"')
+       copy_files_xattrs $ost1node $ost1tmp/objects $ost1tmp/object_xattrs \
+                       $objects
        [ $? -eq 0 ] || { error "Unable to copy objects"; return 13; }
 
        # move objects to lost+found
@@ -2813,7 +3023,6 @@ thread_sanity() {
        local nthrs
         shift 4
 
-        setup
         check_mount || return 41
 
         # We need to expand $parampat, but it may match multiple parameters, so
@@ -2887,18 +3096,28 @@ thread_sanity() {
 
         load_modules
         setup
-        cleanup
 }
 
 test_53a() {
+       setup
        thread_sanity OST ost1 'ost.*.ost' 'oss_num_threads' '16'
+       cleanup
 }
 run_test 53a "check OSS thread count params"
 
 test_53b() {
-       thread_sanity MDT $SINGLEMDS 'mdt.*.*.' 'mdt_num_threads' '16'
+       setup
+       local mds=$(do_facet $SINGLEMDS "lctl get_param -N mds.*.*.threads_max \
+                   2>/dev/null")
+       if [ -z "$mds" ]; then
+               #running this on an old MDT
+               thread_sanity MDT $SINGLEMDS 'mdt.*.*.' 'mdt_num_threads' 16
+       else
+               thread_sanity MDT $SINGLEMDS 'mds.*.*.' 'mds_num_threads' 16
+       fi
+       cleanup
 }
-run_test 53b "check MDT thread count params"
+run_test 53b "check MDS thread count params"
 
 test_54a() {
        if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
@@ -2942,10 +3161,10 @@ test_55() {
 
        for i in 1023 2048
        do
-               add mds1 $(mkfs_opts mds1) --reformat $mdsdev $mdsvdev ||
-                       exit 10
-               add ost1 $(mkfs_opts ost1) --index=$i --reformat \
-                       $(ostdevname 1) $(ostvdevname 1)
+               add mds1 $(mkfs_opts mds1 ${mdsdev}) --reformat $mdsdev \
+                       $mdsvdev || exit 10
+               add ost1 $(mkfs_opts ost1 $(ostdevname 1)) --index=$i \
+                       --reformat $(ostdevname 1) $(ostvdevname 1)
                setup_noconfig
                stopall
                setup_noconfig
@@ -2969,10 +3188,14 @@ test_56() {
        local mds_journal_size_orig=$MDSJOURNALSIZE
 
        MDSJOURNALSIZE=16
-       add mds1 $(mkfs_opts mds1) --reformat $(mdsdevname 1) $(mdsvdevname 1)
-       add ost1 $(mkfs_opts ost1) --index=1000 --reformat \
+
+       for num in $(seq 1 $MDSCOUNT); do
+               add mds${num} $(mkfs_opts mds${num} $(mdsdevname $num)) \
+                       --reformat $(mdsdevname $num) $(mdsvdevname $num)
+       done
+       add ost1 $(mkfs_opts ost1 $(ostdevname 1)) --index=1000 --reformat \
                $(ostdevname 1) $(ostvdevname 1)
-       add ost2 $(mkfs_opts ost2) --index=10000 --reformat \
+       add ost2 $(mkfs_opts ost2 $(ostdevname 2)) --index=10000 --reformat \
                $(ostdevname 2) $(ostvdevname 2)
 
        start_mgsmds
@@ -2989,7 +3212,7 @@ run_test 56 "check big indexes"
 
 test_57a() { # bug 22656
        local NID=$(do_facet ost1 "$LCTL get_param nis" | tail -1 | awk '{print $1}')
-       writeconf
+       writeconf_or_reformat
        do_facet ost1 "$TUNEFS --failnode=$NID `ostdevname 1`" || error "tunefs failed"
        start_mgsmds
        start_ost && error "OST registration from failnode should fail"
@@ -2999,7 +3222,7 @@ run_test 57a "initial registration from failnode should fail (should return errs
 
 test_57b() {
        local NID=$(do_facet ost1 "$LCTL get_param nis" | tail -1 | awk '{print $1}')
-       writeconf
+       writeconf_or_reformat
        do_facet ost1 "$TUNEFS --servicenode=$NID `ostdevname 1`" || error "tunefs failed"
        start_mgsmds
        start_ost || error "OST registration from servicenode should not fail"
@@ -3064,19 +3287,24 @@ test_59() {
        stop_ost2 >> /dev/null
        cleanup_nocli >> /dev/null
        #writeconf to remove all ost2 traces for subsequent tests
-       writeconf
+       writeconf_or_reformat
 }
 run_test 59 "writeconf mount option"
 
 test_60() { # LU-471
+       local num
+
        if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
                skip "Only applicable to ldiskfs-based MDTs"
                return
        fi
 
-       add mds1 $(mkfs_opts mds1) \
-               --mkfsoptions='\" -E stride=64 -O ^uninit_bg\"' --reformat \
-               $(mdsdevname 1) $(mdsvdevname 1) || exit 10
+       for num in $(seq $MDSCOUNT); do
+               add mds${num} $(mkfs_opts mds${num} $(mdsdevname $num)) \
+                       --mkfsoptions='\" -E stride=64 -O ^uninit_bg\"' \
+                       --reformat $(mdsdevname $num) $(mdsvdevname $num) ||
+                       exit 10
+       done
 
        dump=$(do_facet $SINGLEMDS dumpe2fs $(mdsdevname 1))
        rc=${PIPESTATUS[0]}
@@ -3101,10 +3329,13 @@ test_61() { # LU-80
        if [ $(facet_fstype $SINGLEMDS) == ldiskfs ] &&
           ! large_xattr_enabled; then
                reformat=true
-               local mds_dev=$(mdsdevname ${SINGLEMDS//mds/})
                LDISKFS_MKFS_OPTS+=" -O large_xattr"
-               add $SINGLEMDS $(mkfs_opts $SINGLEMDS) --reformat $mds_dev ||
-                       error "reformatting $mds_dev failed"
+
+               for num in $(seq $MDSCOUNT); do
+                       add mds${num} $(mkfs_opts mds$num $(mdsdevname $num)) \
+                       --reformat $(mdsdevname $num) $(mdsvdevname $num) ||
+                       error "add mds $num failed"
+               done
        fi
 
     setup_noconfig || error "setting up the filesystem failed"
@@ -3212,14 +3443,406 @@ test_64() {
        echo "$LFS df"
        $LFS df --lazy || error "lfs df failed"
        cleanup || return $?
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf_or_reformat
 }
 run_test 64 "check lfs df --lazy "
 
+test_65() { # LU-2237
+       # Currently, the test is only valid for ldiskfs backend
+       [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
+               skip "non-ldiskfs backend" && return
+
+       local devname=$(mdsdevname ${SINGLEMDS//mds/})
+       local brpt=$(facet_mntpt brpt)
+       local opts=""
+
+       if ! do_facet $SINGLEMDS "test -b $devname"; then
+               opts="-o loop"
+       fi
+
+       stop_mds
+       local obj=$(do_facet $SINGLEMDS \
+                   "$DEBUGFS -c -R \\\"stat last_rcvd\\\" $devname" |
+                   grep Inode)
+       if [ -z "$obj" ]; then
+               # The MDT may be just re-formatted, mount the MDT for the
+               # first time to guarantee the "last_rcvd" file is there.
+               start_mds || error "fail to mount the MDS for the first time"
+               stop_mds
+       fi
+
+       # remove the "last_rcvd" file
+       do_facet $SINGLEMDS "mkdir -p $brpt"
+       do_facet $SINGLEMDS \
+               "mount -t $(facet_fstype $SINGLEMDS) $opts $devname $brpt"
+       do_facet $SINGLEMDS "rm -f ${brpt}/last_rcvd"
+       do_facet $SINGLEMDS "umount $brpt"
+
+       # restart MDS, the "last_rcvd" file should be recreated.
+       start_mds || error "fail to restart the MDS"
+       stop_mds
+       obj=$(do_facet $SINGLEMDS \
+             "$DEBUGFS -c -R \\\"stat last_rcvd\\\" $devname" | grep Inode)
+       [ -n "$obj" ] || error "fail to re-create the last_rcvd"
+}
+run_test 65 "re-create the lost last_rcvd file when server mount"
+
+test_66() {
+       [[ $(lustre_version_code mgs) -ge $(version_code 2.3.59) ]] ||
+               { skip "Need MGS version at least 2.3.59"; return 0; }
+
+       setup
+       local OST1_NID=$(do_facet ost1 $LCTL list_nids | head -1)
+       local MDS_NID=$(do_facet $SINGLEMDS $LCTL list_nids | head -1)
+
+       echo "replace_nids should fail if MDS, OSTs and clients are UP"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 $OST1_NID &&
+               error "replace_nids fail"
+
+       umount_client $MOUNT || error "unmounting client failed"
+       echo "replace_nids should fail if MDS and OSTs are UP"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 $OST1_NID &&
+               error "replace_nids fail"
+
+       stop_ost
+       echo "replace_nids should fail if MDS is UP"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 $OST1_NID &&
+               error "replace_nids fail"
+
+       stop_mds || error "stopping mds failed"
+
+       if combined_mgs_mds; then
+               start_mds "-o nosvc" ||
+                       error "starting mds with nosvc option failed"
+       fi
+
+       echo "command should accept two parameters"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 &&
+               error "command should accept two params"
+
+       echo "correct device name should be passed"
+       do_facet mgs $LCTL replace_nids $FSNAME-WRONG0000 $OST1_NID &&
+               error "wrong devname"
+
+       echo "wrong nids list should not destroy the system"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 "wrong nids list" &&
+               error "wrong parse"
+
+       echo "replace OST nid"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 $OST1_NID ||
+               error "replace nids failed"
+
+       echo "command should accept two parameters"
+       do_facet mgs $LCTL replace_nids $FSNAME-MDT0000 &&
+               error "command should accept two params"
+
+       echo "wrong nids list should not destroy the system"
+       do_facet mgs $LCTL replace_nids $FSNAME-MDT0000 "wrong nids list" &&
+               error "wrong parse"
+
+       echo "replace MDS nid"
+       do_facet mgs $LCTL replace_nids $FSNAME-MDT0000 $MDS_NID ||
+               error "replace nids failed"
+
+       if ! combined_mgs_mds ; then
+               stop_mgs
+       else
+               stop_mds
+       fi
+
+       setup_noconfig
+       check_mount || error "error after nid replace"
+       cleanup
+       reformat
+}
+run_test 66 "replace nids"
+
+test_70a() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+
+       start_mdt 1 || error "MDT0 start fail"
+
+       start_ost || error "OST0 start fail"
+
+       start_mdt 2 || error "MDT1 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+
+       mkdir -p $DIR/$tdir || error "create dir fail"
+
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir ||
+                                       error "create remote dir fail"
+
+       rm -rf $DIR/$tdir || error "delete dir fail"
+       cleanup || return $?
+}
+run_test 70a "start MDT0, then OST, then MDT1"
+
+test_70b() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+
+       start_ost || error "OST0 start fail"
+
+       start_mdt 1 || error "MDT0 start fail"
+       start_mdt 2 || error "MDT1 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+
+       mkdir -p $DIR/$tdir || error "create dir fail"
+
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir ||
+                                       error "create remote dir fail"
+
+       rm -rf $DIR/$tdir || error "delete dir fail"
+
+       cleanup || return $?
+}
+run_test 70b "start OST, MDT1, MDT0"
+
+test_70c() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+
+       start_mdt 1 || error "MDT0 start fail"
+       start_mdt 2 || error "MDT1 start fail"
+       start_ost || error "OST0 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+       stop_mdt 1 || error "MDT1 start fail"
+
+       local mdc_for_mdt1=$($LCTL dl | grep MDT0000-mdc | awk '{print $4}')
+       echo "deactivate $mdc_for_mdt1"
+        $LCTL --device $mdc_for_mdt1 deactivate || return 1
+
+       mkdir -p $DIR/$tdir && error "mkdir succeed"
+
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir &&
+                                       error "create remote dir succeed"
+
+       cleanup || return $?
+}
+run_test 70c "stop MDT0, mkdir fail, create remote dir fail"
+
+test_70d() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local MDTIDX=1
+
+       start_mdt 1 || error "MDT0 start fail"
+       start_mdt 2 || error "MDT1 start fail"
+       start_ost || error "OST0 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+
+       stop_mdt 2 || error "MDT1 start fail"
+
+       local mdc_for_mdt2=$($LCTL dl | grep MDT0001-mdc |
+                            awk '{print $4}')
+       echo "deactivate $mdc_for_mdt2"
+        $LCTL --device $mdc_for_mdt2 deactivate ||
+                       error "set $mdc_for_mdt2 deactivate failed"
+
+       mkdir -p $DIR/$tdir || error "mkdir fail"
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir &&
+                       error "create remote dir succeed"
+
+       rm -rf $DIR/$tdir || error "delete dir fail"
+
+       cleanup || return $?
+}
+run_test 70d "stop MDT1, mkdir succeed, create remote dir fail"
+
+test_71a() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       if combined_mgs_mds; then
+               skip "needs separate MGS/MDT" && return
+       fi
+       local MDTIDX=1
+
+       start_mdt 1 || error "MDT0 start fail"
+       start_ost || error "OST0 start fail"
+       start_mdt 2 || error "MDT1 start fail"
+       start_ost2 || error "OST1 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+
+       mkdir -p $DIR/$tdir || error "mkdir fail"
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir ||
+                       error "create remote dir succeed"
+
+       mcreate $DIR/$tdir/remote_dir/$tfile || error "create file failed"
+       rm -rf $DIR/$tdir || error "delete dir fail"
+
+       umount_client $MOUNT
+       stop_mdt 1 || error "MDT0 stop fail"
+       stop_mdt 2 || error "MDT1 stop fail"
+       stop_ost || error "OST0 stop fail"
+       stop_ost2 || error "OST1 stop fail"
+}
+run_test 71a "start MDT0 OST0, MDT1, OST1"
+
+test_71b() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       if combined_mgs_mds; then
+               skip "needs separate MGS/MDT" && return
+       fi
+       local MDTIDX=1
+
+       start_mdt 2 || error "MDT1 start fail"
+       start_ost || error "OST0 start fail"
+       start_mdt 1 || error "MDT0 start fail"
+       start_ost2 || error "OST1 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+
+       mkdir -p $DIR/$tdir || error "mkdir fail"
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir ||
+                       error "create remote dir succeed"
+
+       mcreate $DIR/$tdir/remote_dir/$tfile || error "create file failed"
+       rm -rf $DIR/$tdir || error "delete dir fail"
+
+       umount_client $MOUNT
+       stop_mdt 1 || error "MDT0 stop fail"
+       stop_mdt 2 || error "MDT1 stop fail"
+       stop_ost || error "OST0 stop fail"
+       stop_ost2 || error "OST1 stop fail"
+}
+run_test 71b "start MDT1, OST0, MDT0, OST1"
+
+test_71c() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       if combined_mgs_mds; then
+               skip "needs separate MGS/MDT" && return
+       fi
+       local MDTIDX=1
+
+       start_ost || error "OST0 start fail"
+       start_ost2 || error "OST1 start fail"
+       start_mdt 2 || error "MDT1 start fail"
+       start_mdt 1 || error "MDT0 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+
+       mkdir -p $DIR/$tdir || error "mkdir fail"
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir ||
+                       error "create remote dir succeed"
+
+       mcreate $DIR/$tdir/remote_dir/$tfile || error "create file failed"
+       rm -rf $DIR/$tdir || error "delete dir fail"
+
+       umount_client $MOUNT
+       stop_mdt 1 || error "MDT0 stop fail"
+       stop_mdt 2 || error "MDT1 stop fail"
+       stop_ost || error "OST0 stop fail"
+       stop_ost2 || error "OST1 stop fail"
+
+}
+run_test 71c "start OST0, OST1, MDT1, MDT0"
+
+test_71d() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       if combined_mgs_mds; then
+               skip "needs separate MGS/MDT" && return
+       fi
+       local MDTIDX=1
+
+       start_ost || error "OST0 start fail"
+       start_mdt 2 || error "MDT0 start fail"
+       start_mdt 1 || error "MDT0 start fail"
+       start_ost2 || error "OST1 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+
+       mkdir -p $DIR/$tdir || error "mkdir fail"
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir ||
+                       error "create remote dir succeed"
+
+       mcreate $DIR/$tdir/remote_dir/$tfile || error "create file failed"
+       rm -rf $DIR/$tdir || error "delete dir fail"
+
+       umount_client $MOUNT
+       stop_mdt 1 || error "MDT0 stop fail"
+       stop_mdt 2 || error "MDT1 stop fail"
+       stop_ost || error "OST0 stop fail"
+       stop_ost2 || error "OST1 stop fail"
+
+}
+run_test 71d "start OST0, MDT1, MDT0, OST1"
+
+test_71e() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       if combined_mgs_mds; then
+               skip "needs separate MGS/MDT" && return
+       fi
+       local MDTIDX=1
+
+       start_ost || error "OST0 start fail"
+       start_mdt 2 || error "MDT1 start fail"
+       start_ost2 || error "OST1 start fail"
+       start_mdt 1 || error "MDT0 start fail"
+
+       mount_client $MOUNT || error "mount client fails"
+
+       mkdir -p $DIR/$tdir || error "mkdir fail"
+       $LFS mkdir -i $MDTIDX $DIR/$tdir/remote_dir ||
+                       error "create remote dir succeed"
+
+       mcreate $DIR/$tdir/remote_dir/$tfile || error "create file failed"
+       rm -rf $DIR/$tdir || error "delete dir fail"
+
+       umount_client $MOUNT
+       stop_mdt 1 || error "MDT0 stop fail"
+       stop_mdt 2 || error "MDT1 stop fail"
+       stop_ost || error "OST0 stop fail"
+       stop_ost2 || error "OST1 stop fail"
+
+}
+run_test 71e "start OST0, MDT1, OST1, MDT0"
+
+test_72() { #LU-2634
+       local mdsdev=$(mdsdevname 1)
+       local ostdev=$(ostdevname 1)
+       local cmd="$E2FSCK -fnvd $mdsdev"
+       local fn=3
+
+       #tune MDT with "-O extents"
+       add $SINGLEMDS \
+               $(mkfs_opts $SINGLEMDS ${mdsdev}) --reformat $mdsdev ||
+                       error "add $SINGLEMDS failed"
+       $TUNE2FS -O extents $mdsdev
+       add ost1 $(mkfs_opts ost1 $ostdev) --reformat $ostdev ||
+               error "add $ostdev failed"
+       start_mgsmds || error "start mds failed"
+       start_ost || error "start ost failed"
+       mount_client $MOUNT || error "mount client failed"
+
+       #create some short symlinks
+       mkdir -p $DIR/$tdir
+       createmany -o $DIR/$tdir/$tfile-%d $fn
+       echo "create $fn short symlinks"
+       for i in $(seq -w 1 $fn); do
+               ln -s $DIR/$tdir/$tfile-$i $MOUNT/$tfile-$i
+       done
+       ls -al $MOUNT
+
+       #umount
+       umount_client $MOUNT || error "umount client failed"
+       stop_mds || error "stop mds failed"
+       stop_ost || error "stop ost failed"
+
+       #run e2fsck
+       run_e2fsck $(facet_active_host $SINGLEMDS) $mdsdev "-n"
+}
+run_test 72 "test fast symlink with extents flag enabled"
+
 if ! combined_mgs_mds ; then
        stop mgs
 fi
 
 cleanup_gss
 
-complete $(basename $0) $SECONDS
+complete $SECONDS
 exit_status