Whamcloud - gitweb
LU-5319 tests: testcases for multiple modify RPCs feature
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
index 006798d..4c2aa80 100644 (file)
@@ -4,8 +4,8 @@ set -e
 
 ONLY=${ONLY:-"$*"}
 
-# bug number for skipped test:     LU-2828
-ALWAYS_EXCEPT="$CONF_SANITY_EXCEPT 59 64"
+# bug number for skipped test:     LU-7005
+ALWAYS_EXCEPT="$CONF_SANITY_EXCEPT 50i"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
 is_sles11()                                            # LU-2181
@@ -59,6 +59,14 @@ STORED_OSTSIZE=$OSTSIZE
 MDSSIZE=200000
 OSTSIZE=200000
 
+fs2mds_HOST=$mds_HOST
+fs2ost_HOST=$ost_HOST
+fs3ost_HOST=$ost_HOST
+
+MDSDEV1_2=$fs2mds_DEV
+OSTDEV1_2=$fs2ost_DEV
+OSTDEV2_2=$fs3ost_DEV
+
 if ! combined_mgs_mds; then
     # bug number for skipped test:    23954
     ALWAYS_EXCEPT="$ALWAYS_EXCEPT       24b"
@@ -70,8 +78,8 @@ if [[ "$LDISKFS_MKFS_OPTS" != *lazy_itable_init* ]]; then
 fi
 
 [ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test:        LU-2778 LU-4444
-       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 57b     69"
+# bug number for skipped test:        LU-4444
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 69"
 
 init_logging
 
@@ -249,6 +257,16 @@ cleanup() {
        cleanup_nocli || return $?
 }
 
+cleanup_fs2() {
+       trap 0
+       echo "umount $MOUNT2 ..."
+       umount $MOUNT2 || true
+       echo "stopping fs2mds ..."
+       stop fs2mds -f || true
+       echo "stopping fs2ost ..."
+       stop fs2ost -f || true
+}
+
 check_mount() {
        do_facet client "cp /etc/passwd $DIR/a" || return 71
        do_facet client "rm $DIR/a" || return 72
@@ -303,9 +321,9 @@ test_1() {
 run_test 1 "start up ost twice (should return errors)"
 
 test_2() {
-       start_mdt 1 || error "MDT0 start fail"
+       start_mds || error "MDT start failed"
        echo "start mds second time.."
-       start_mdt 1 && error "2nd MDT start should fail"
+       start_mds && error "2nd MDT start should fail"
        start_ost || error "OST start failed"
        mount_client $MOUNT || error "mount_client failed to start client"
        check_mount || error "check_mount failed"
@@ -759,6 +777,58 @@ test_21d() {
 }
 run_test 21d "start mgs then ost and then mds"
 
+cleanup_21e() {
+       MGSNID="$saved_mgsnid"
+       cleanup_fs2
+       echo "stopping fs2mgs ..."
+       stop $fs2mgs -f || true
+}
+
+test_21e() { # LU-5863
+       if [[ -z "$fs3ost_DEV" || -z "$fs2ost_DEV" || -z "$fs2mds_DEV" ]]; then
+               is_blkdev $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) &&
+               skip_env "mixed loopback and real device not working" && return
+       fi
+
+       local fs2mdsdev=$(mdsdevname 1_2)
+       local fs2ostdev=$(ostdevname 1_2)
+       local fs3ostdev=$(ostdevname 2_2)
+
+       local fs2mdsvdev=$(mdsvdevname 1_2)
+       local fs2ostvdev=$(ostvdevname 1_2)
+       local fs3ostvdev=$(ostvdevname 2_2)
+
+       # temporarily use fs3ost as fs2mgs
+       local fs2mgs=fs3ost
+       local fs2mgsdev=$fs3ostdev
+       local fs2mgsvdev=$fs3ostvdev
+
+       local fsname=test1234
+
+       add $fs2mgs $(mkfs_opts mgs $fs2mgsdev) --fsname=$fsname \
+               --reformat $fs2mgsdev $fs2mgsvdev || error "add fs2mgs failed"
+       start $fs2mgs $fs2mgsdev $MGS_MOUNT_OPTS && trap cleanup_21e EXIT INT ||
+               error "start fs2mgs failed"
+
+       local saved_mgsnid="$MGSNID"
+       MGSNID=$(do_facet $fs2mgs $LCTL list_nids | xargs | tr ' ' ,)
+
+       add fs2mds $(mkfs_opts mds1 $fs2mdsdev $fsname) \
+               --reformat $fs2mdsdev $fs2mdsvdev || error "add fs2mds failed"
+       add fs2ost $(mkfs_opts ost1 $fs2ostdev $fsname) \
+               --reformat $fs2ostdev $fs2ostvdev || error "add fs2ost failed"
+
+       start fs2ost $fs2ostdev $OST_MOUNT_OPTS || error "start fs2ost failed"
+       start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS || error "start fs2mds failed"
+
+       mkdir -p $MOUNT2 || error "mkdir $MOUNT2 failed"
+       $MOUNT_CMD $MGSNID:/$fsname $MOUNT2 || error "mount $MOUNT2 failed"
+       DIR=$MOUNT2 MOUNT=$MOUNT2 check_mount || error "check $MOUNT2 failed"
+
+       cleanup_21e
+}
+run_test 21e "separate MGS and MDS"
+
 test_22() {
        start_mds || error "MDS start failed"
 
@@ -862,23 +932,6 @@ test_23b() {    # was test_23
 }
 run_test 23b "Simulate -EINTR during mount"
 
-fs2mds_HOST=$mds_HOST
-fs2ost_HOST=$ost_HOST
-
-MDSDEV1_2=$fs2mds_DEV
-OSTDEV1_2=$fs2ost_DEV
-OSTDEV2_2=$fs3ost_DEV
-
-cleanup_fs2() {
-       trap 0
-       echo "umount $MOUNT2 ..."
-       umount $MOUNT2 || true
-       echo "stopping fs2mds ..."
-       stop fs2mds -f || true
-       echo "stopping fs2ost ..."
-       stop fs2ost -f || true
-}
-
 test_24a() {
        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
@@ -1099,7 +1152,7 @@ test_28a() { # LU-4221
 
        # Check 3.
        # prepare a non-symlink parameter in the OSD
-       name="lma_self_repair"
+       name="auto_scrub"
        param="$device.osd.$name"
        cmd="$LCTL get_param -n osd-*.$device.$name"
 
@@ -1475,7 +1528,7 @@ t32_wait_til_devices_gone() {
        done
        echo "waiting for dev on $node: dev $devices loop $loops given up"
        do_rpc_nodes $node "losetup -a"
-       do_rpc_nodes $node "$LCTL devices_list"
+       do_rpc_nodes $node "$LCTL device_list"
        return 1
 }
 
@@ -1590,6 +1643,7 @@ t32_test() {
 
        trap 'trap - RETURN; t32_test_cleanup' RETURN
 
+       load_modules
        mkdir -p $tmp/mnt/lustre || error "mkdir $tmp/mnt/lustre failed"
        $r mkdir -p $tmp/mnt/{mdt,ost}
        $r tar xjvf $tarball -S -C $tmp || {
@@ -1605,7 +1659,7 @@ t32_test() {
        echo "  Commit: $img_commit"
        echo "  Kernel: $img_kernel"
        echo "    Arch: $img_arch"
-       echo "OST version: $(get_lustre_version ost1)"
+       echo "OST version: $(lustre_build_version ost1)"
 
        # The conversion can be made only when both of the following
        # conditions are satisfied:
@@ -1780,6 +1834,10 @@ t32_test() {
                error_noexit "Setting \"lov.stripesize\""
                return 1
        }
+       $r $LCTL conf_param $fsname-MDT0000.mdd.atime_diff=70 || {
+               error_noexit "Setting \"mdd.atime_diff\""
+               return 1
+       }
 
        if [ "$ff_convert" != "no" -a $(facet_fstype ost1) == "ldiskfs" ]; then
                $r $LCTL lfsck_start -M $fsname-OST0000 || {
@@ -1836,11 +1894,13 @@ t32_test() {
                }
 
                if [ "$dne_upgrade" != "no" ]; then
-                       $LFS mkdir -i 1 $tmp/mnt/lustre/remote_dir || {
+                       $LFS mkdir -i 1 -c2 $tmp/mnt/lustre/remote_dir || {
                                error_noexit "set remote dir failed"
                                return 1
                        }
 
+                       $LFS setdirstripe -D -c2 $tmp/mnt/lustre/remote_dir
+
                        pushd $tmp/mnt/lustre
                        tar -cf - . --exclude=./remote_dir |
                                tar -xvf - -C remote_dir 1>/dev/null || {
@@ -2033,6 +2093,9 @@ test_32c() {
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
        t32_check
        for tarball in $tarballs; do
+               # Do not support 1_8 and 2_1 direct upgrade to DNE2 anymore */
+               echo $tarball | grep "1_8" && continue
+               echo $tarball | grep "2_1" && continue
                dne_upgrade=yes t32_test $tarball writeconf || rc=$?
        done
        return $rc
@@ -2293,7 +2356,6 @@ test_36() { # 12743
 
        local rc=0
        local FSNAME2=test1234
-       local fs3ost_HOST=$ost_HOST
        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
        [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST && fs3ost_HOST=$ost1_HOST
@@ -2511,9 +2573,14 @@ test_41a() { #bug 14134
 
        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
-       start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nosvc -n
+       start_mdt 1 -o nosvc -n
+       if [ $MDSCOUNT -ge 2 ]; then
+               for num in $(seq 2 $MDSCOUNT); do
+                       start_mdt $num || return
+               done
+       fi
        start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
-       start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nomgs,force
+       start_mdt 1 -o nomgs,force
        mount_client $MOUNT || error "mount_client $MOUNT failed"
        sleep 5
 
@@ -2541,9 +2608,14 @@ test_41b() {
        reformat
        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
-       start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nosvc -n
+       start_mdt 1 -o nosvc -n
+       if [ $MDSCOUNT -ge 2 ]; then
+               for num in $(seq 2 $MDSCOUNT); do
+                       start_mdt $num || return
+               done
+       fi
        start_ost || error "Unable to start OST1"
-       start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nomgs,force
+       start_mdt 1 -o nomgs,force
        mount_client $MOUNT || error "mount_client $MOUNT failed"
        sleep 5
 
@@ -2568,7 +2640,7 @@ test_41c() {
                { skip "Need MDS version 2.5.4+ or 2.5.26+ or 2.6.52+"; return; }
 
        cleanup
-       # MDT concurent start
+       # MDT concurrent start
        #define OBD_FAIL_TGT_DELAY_CONNECT 0x703
        do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x703"
        start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS &
@@ -2589,10 +2661,17 @@ test_41c() {
                echo "2nd MDT start succeed"
        else
                stop mds1 -f
-               error "unexpected concurent MDT mounts result, rc=$rc rc2=$rc2"
+               error "unexpected concurrent MDT mounts result, rc=$rc rc2=$rc2"
        fi
 
-       # OST concurent start
+       if [ $MDSCOUNT -ge 2 ]; then
+               for num in $(seq 2 $MDSCOUNT); do
+                       start_mdt $num || return
+               done
+       fi
+
+       # OST concurrent start
+
        #define OBD_FAIL_TGT_DELAY_CONNECT 0x703
        do_facet ost1 "$LCTL set_param fail_loc=0x703"
        start ost1 $(ostdevname 1) $OST_MOUNT_OPTS &
@@ -2612,26 +2691,26 @@ test_41c() {
                echo "1st OST start failed with EALREADY"
                echo "2nd OST start succeed"
        else
-               stop mds1 -f
+               stop_mds -f
                stop ost1 -f
-               error "unexpected concurent OST mounts result, rc=$rc rc2=$rc2"
+               error "unexpected concurrent OST mounts result, rc=$rc rc2=$rc2"
        fi
        # cleanup
-       stop mds1 -f
+       stop_mds
        stop ost1 -f
 
        # verify everything ok
        start_mds
        if [ $? != 0 ]
        then
-               stop mds1 -f
+               stop_mds
                error "MDT(s) start failed"
        fi
 
        start_ost
        if [ $? != 0 ]
        then
-               stop mds1 -f
+               stop_mds
                stop ost1 -f
                error "OST(s) start failed"
        fi
@@ -2639,20 +2718,20 @@ test_41c() {
        mount_client $MOUNT
        if [ $? != 0 ]
        then
-               stop mds1 -f
+               stop_mds
                stop ost1 -f
                error "client start failed"
        fi
        check_mount
        if [ $? != 0 ]
        then
-               stop mds1 -f
+               stop_mds
                stop ost1 -f
                error "client mount failed"
        fi
        cleanup
 }
-run_test 41c "concurent mounts of MDT/OST should all fail but one"
+run_test 41c "concurrent mounts of MDT/OST should all fail but one"
 
 test_42() { #bug 14693
        setup
@@ -2966,7 +3045,7 @@ run_test 47 "server restart does not make client loss lru_resize settings"
 cleanup_48() {
        trap 0
 
-       # reformat after this test is needed - if test will failed
+       # reformat after this test is needed - if the test fails,
        # we will have unkillable file at FS
        reformat_and_config
 }
@@ -3306,6 +3385,52 @@ test_50h() {
 }
 run_test 50h "LU-642: activate deactivated OST"
 
+test_50i() {
+       # prepare MDT/OST, make OSC inactive for OST1
+       [ "$MDSCOUNT" -lt "2" ] && skip_env "$MDSCOUNT < 2, skipping" && return
+
+       [ $(facet_fstype ost1) == zfs ] && import_zpool ost1
+       load_modules
+       do_facet mds2 "$TUNEFS --param mdc.active=0 $(mdsdevname 2)" ||
+               error "tunefs MDT2 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 $DIR/$tdir || error "mkdir $DIR/$tdir failed"
+
+       $LCTL conf_param ${FSNAME}-MDT0000.mdc.active=0 &&
+               error "deactive MDC0 succeeds"
+       # activate MDC for MDT2
+       local TEST="$LCTL get_param -n mdc.${FSNAME}-MDT0001-mdc-[!M]*.active"
+       set_conf_param_and_check client                                 \
+               "$TEST" "${FSNAME}-MDT0001.mdc.active" 1 ||
+               error "Unable to activate MDT2"
+
+       $LFS mkdir -i1 $DIR/$tdir/2 || error "mkdir $DIR/$tdir/2 failed"
+       # create some file
+       createmany -o $DIR/$tdir/2/$tfile-%d 1 || error "create files failed"
+
+       rm -rf $DIR/$tdir/2 || error "unlink dir failed"
+
+       # deactivate MDC for MDT2
+       local TEST="$LCTL get_param -n mdc.${FSNAME}-MDT0001-mdc-[!M]*.active"
+       set_conf_param_and_check client                                 \
+               "$TEST" "${FSNAME}-MDT0001.mdc.active" 0 ||
+               error "Unable to deactivate MDT2"
+
+       $LFS mkdir -i1 $DIR/$tdir/2 &&
+               error "mkdir $DIR/$tdir/2 succeeds after deactive MDT"
+
+       # cleanup
+       umount_client $MOUNT || error "Unable to umount client"
+       stop_mds
+       stop_ost
+       stop_ost 2
+}
+run_test 50i "activate deactivated MDT"
+
 test_51() {
        local LOCAL_TIMEOUT=20
 
@@ -3442,9 +3567,12 @@ test_52() {
        [ $? -eq 0 ] || { error "Unable to move objects"; return 14; }
 
        # recover objects dry-run
-       echo "ll_recover_lost_found_objs dry_run"
-       do_node $ost1node "ll_recover_lost_found_objs -n -d $ost1mnt/O" ||
-               error "ll_recover_lost_found_objs failed"
+       if [ $(lustre_version_code ost1) -ge $(version_code 2.5.56) ]; then
+               echo "ll_recover_lost_found_objs dry_run"
+               do_node $ost1node \
+                       "ll_recover_lost_found_objs -n -d $ost1mnt/O" ||
+                       error "ll_recover_lost_found_objs failed"
+       fi
 
        # recover objects
        echo "ll_recover_lost_found_objs fix run"
@@ -3672,6 +3800,7 @@ test_55() {
 run_test 55 "check lov_objid size"
 
 test_56() {
+       local server_version=$(lustre_version_code $SINGLEMDS)
        local mds_journal_size_orig=$MDSJOURNALSIZE
        local n
 
@@ -3692,13 +3821,19 @@ test_56() {
        mount_client $MOUNT || error "Unable to mount client"
        echo ok
        $LFS osts
-       wait_osc_import_state mds ost1 FULL
-       wait_osc_import_state mds ost2 FULL
-       $SETSTRIPE --stripe-count=-1 $DIR/$tfile ||
-               error "Unable to setstripe $DIR/$tfile"
-       n=$($LFS getstripe --stripe-count $DIR/$tfile)
-       [ "$n" -eq 2 ] || error "Stripe count not two: $n"
-       rm $DIR/$tfile
+
+       if [[ $server_version -ge $(version_code 2.6.54) ]] ||
+          [[ $server_version -ge $(version_code 2.5.4) &&
+             $server_version -lt $(version_code 2.5.11) ]]; then
+               wait_osc_import_state mds ost1 FULL
+               wait_osc_import_state mds ost2 FULL
+               $SETSTRIPE --stripe-count=-1 $DIR/$tfile ||
+                       error "Unable to setstripe $DIR/$tfile"
+               n=$($LFS getstripe --stripe-count $DIR/$tfile)
+               [ "$n" -eq 2 ] || error "Stripe count not two: $n"
+               rm $DIR/$tfile
+       fi
+
        stopall
        MDSJOURNALSIZE=$mds_journal_size_orig
        reformat
@@ -3825,20 +3960,19 @@ test_60() { # LU-471
 run_test 60 "check mkfs.lustre --mkfsoptions -E -O options setting"
 
 test_61() { # LU-80
-       local reformat=false
+       local lxattr=false
 
        [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.1.53) ] ||
                { skip "Need MDS version at least 2.1.53"; return 0; }
 
        if [ $(facet_fstype $SINGLEMDS) == ldiskfs ] &&
-          ! large_xattr_enabled; then
-               reformat=true
-               LDISKFS_MKFS_OPTS+=" -O large_xattr"
+            ! large_xattr_enabled; then
+               lxattr=true
 
                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"
+                       do_facet mds${num} $TUNE2FS -O large_xattr \
+                               $(mdsdevname $num) ||
+                               error "tune2fs on mds $num failed"
                done
        fi
 
@@ -3887,9 +4021,12 @@ test_61() { # LU-80
 
     rm -f $file
     stopall
-       if $reformat; then
-               LDISKFS_MKFS_OPTS=${LDISKFS_MKFS_OPTS% -O large_xattr}
-               reformat
+       if $lxattr; then
+               for num in $(seq $MDSCOUNT); do
+                       do_facet mds${num} $TUNE2FS -O ^large_xattr \
+                               $(mdsdevname $num) ||
+                               error "tune2fs on mds $num failed"
+               done
        fi
 }
 run_test 61 "large xattr"
@@ -3908,10 +4045,10 @@ test_62() {
                { skip "Need MDS version at least 2.2.51"; return 0; }
 
        echo "disable journal for mds"
-       do_facet mds tune2fs -O ^has_journal $mdsdev || error "tune2fs failed"
+       do_facet mds $TUNE2FS -O ^has_journal $mdsdev || error "tune2fs failed"
        start_mds && error "MDT start should fail"
        echo "disable journal for ost"
-       do_facet ost1 tune2fs -O ^has_journal $ostdev || error "tune2fs failed"
+       do_facet ost1 $TUNE2FS -O ^has_journal $ostdev || error "tune2fs failed"
        start_ost && error "OST start should fail"
        cleanup || error "cleanup failed with rc $?"
        reformat_and_config
@@ -4181,15 +4318,13 @@ test_69() {
        # use OST0000 since it probably has the most creations
        local OSTNAME=$(ostname_from_index 0)
        local mdtosc_proc1=$(get_mdtosc_proc_path mds1 $OSTNAME)
-       local last_id=$(do_facet mds1 $LCTL get_param -n \
-                       osc.$mdtosc_proc1.prealloc_last_id)
 
        # Want to have OST LAST_ID over 1.5 * OST_MAX_PRECREATE to
        # verify that the LAST_ID recovery is working properly.  If
        # not, then the OST will refuse to allow the MDS connect
        # because the LAST_ID value is too different from the MDS
        #define OST_MAX_PRECREATE=20000
-       local num_create=$((20000 * 5))
+       local num_create=$((20000 * 3))
 
        mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
        $SETSTRIPE -i 0 $DIR/$tdir || error "$SETSTRIPE -i 0 $DIR/$tdir failed"
@@ -4199,6 +4334,7 @@ test_69() {
        # filesystem is not inconsistent later on
        $LFS find $MOUNT --ost 0 | xargs rm
 
+       umount_client $MOUNT || error "umount client failed"
        stop_ost || error "OST0 stop failure"
        add ost1 $(mkfs_opts ost1 $(ostdevname 1)) --reformat --replace \
                $(ostdevname 1) $(ostvdevname 1) ||
@@ -4206,6 +4342,7 @@ test_69() {
        start_ost || error "OST0 restart failure"
        wait_osc_import_state mds ost FULL
 
+       mount_client $MOUNT || error "mount client failed"
        touch $DIR/$tdir/$tfile-last || error "create file after reformat"
        local idx=$($GETSTRIPE -i $DIR/$tdir/$tfile-last)
        [ $idx -ne 0 ] && error "$DIR/$tdir/$tfile-last on $idx not 0" || true
@@ -4223,8 +4360,9 @@ test_70a() {
        start_mdt 1 || error "MDT0 start fail"
 
        start_ost || error "OST0 start fail"
-
-       start_mdt 2 || error "MDT1 start fail"
+       for num in $(seq 2 $MDSCOUNT); do
+               start_mdt $num || return
+       done
 
        mount_client $MOUNT || error "mount client fails"
 
@@ -4244,8 +4382,7 @@ test_70b() {
 
        start_ost || error "OST0 start fail"
 
-       start_mdt 1 || error "MDT0 start fail"
-       start_mdt 2 || error "MDT1 start fail"
+       start_mds || error "MDS start fail"
 
        mount_client $MOUNT || error "mount client fails"
 
@@ -4264,8 +4401,7 @@ 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_mds || error "MDS start fail"
        start_ost || error "OST0 start fail"
 
        mount_client $MOUNT || error "mount client fails"
@@ -4289,8 +4425,7 @@ 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_mds || error "MDS start fail"
        start_ost || error "OST0 start fail"
 
        mount_client $MOUNT || error "mount client fails"
@@ -4322,7 +4457,10 @@ test_71a() {
 
        start_mdt 1 || error "MDT0 start fail"
        start_ost || error "OST0 start fail"
-       start_mdt 2 || error "MDT1 start fail"
+       for num in $(seq 2 $MDSCOUNT); do
+               start_mdt $num || return
+       done
+
        start_ost2 || error "OST1 start fail"
 
        mount_client $MOUNT || error "mount client fails"
@@ -4335,8 +4473,7 @@ test_71a() {
        rm -rf $DIR/$tdir || error "delete dir fail"
 
        umount_client $MOUNT || error "umount_client failed"
-       stop_mdt 1 || error "MDT0 stop fail"
-       stop_mdt 2 || error "MDT1 stop fail"
+       stop_mds || error "MDS stop fail"
        stop_ost || error "OST0 stop fail"
        stop_ost2 || error "OST1 stop fail"
 }
@@ -4349,7 +4486,9 @@ test_71b() {
        fi
        local MDTIDX=1
 
-       start_mdt 2 || error "MDT1 start fail"
+       for num in $(seq 2 $MDSCOUNT); do
+               start_mdt $num || return
+       done
        start_ost || error "OST0 start fail"
        start_mdt 1 || error "MDT0 start fail"
        start_ost2 || error "OST1 start fail"
@@ -4364,8 +4503,7 @@ test_71b() {
        rm -rf $DIR/$tdir || error "delete dir fail"
 
        umount_client $MOUNT || error "umount_client failed"
-       stop_mdt 1 || error "MDT0 stop fail"
-       stop_mdt 2 || error "MDT1 stop fail"
+       stop_mds || error "MDT0 stop fail"
        stop_ost || error "OST0 stop fail"
        stop_ost2 || error "OST1 stop fail"
 }
@@ -4380,7 +4518,9 @@ test_71c() {
 
        start_ost || error "OST0 start fail"
        start_ost2 || error "OST1 start fail"
-       start_mdt 2 || error "MDT1 start fail"
+       for num in $(seq 2 $MDSCOUNT); do
+               start_mdt $num || return
+       done
        start_mdt 1 || error "MDT0 start fail"
 
        mount_client $MOUNT || error "mount client fails"
@@ -4393,8 +4533,7 @@ test_71c() {
        rm -rf $DIR/$tdir || error "delete dir fail"
 
        umount_client $MOUNT || error "umount_client failed"
-       stop_mdt 1 || error "MDT0 stop fail"
-       stop_mdt 2 || error "MDT1 stop fail"
+       stop_mds || error "MDS stop fail"
        stop_ost || error "OST0 stop fail"
        stop_ost2 || error "OST1 stop fail"
 
@@ -4409,7 +4548,9 @@ test_71d() {
        local MDTIDX=1
 
        start_ost || error "OST0 start fail"
-       start_mdt 2 || error "MDT0 start fail"
+       for num in $(seq 2 $MDSCOUNT); do
+               start_mdt $num || return
+       done
        start_mdt 1 || error "MDT0 start fail"
        start_ost2 || error "OST1 start fail"
 
@@ -4423,8 +4564,7 @@ test_71d() {
        rm -rf $DIR/$tdir || error "delete dir fail"
 
        umount_client $MOUNT || error "umount_client failed"
-       stop_mdt 1 || error "MDT0 stop fail"
-       stop_mdt 2 || error "MDT1 stop fail"
+       stop_mds || error "MDS stop fail"
        stop_ost || error "OST0 stop fail"
        stop_ost2 || error "OST1 stop fail"
 
@@ -4439,7 +4579,9 @@ test_71e() {
        local MDTIDX=1
 
        start_ost || error "OST0 start fail"
-       start_mdt 2 || error "MDT1 start fail"
+       for num in $(seq 2 $MDSCOUNT); do
+               start_mdt $num || return
+       done
        start_ost2 || error "OST1 start fail"
        start_mdt 1 || error "MDT0 start fail"
 
@@ -4453,8 +4595,7 @@ test_71e() {
        rm -rf $DIR/$tdir || error "delete dir fail"
 
        umount_client $MOUNT || error "umount_client failed"
-       stop_mdt 1 || error "MDT0 stop fail"
-       stop_mdt 2 || error "MDT1 stop fail"
+       stop_mds || error "MDS stop fail"
        stop_ost || error "OST0 stop fail"
        stop_ost2 || error "OST1 stop fail"
 
@@ -4476,7 +4617,8 @@ test_72() { #LU-2634
                add mds${num} $(mkfs_opts mds$num $(mdsdevname $num)) \
                --reformat $(mdsdevname $num) $(mdsvdevname $num) ||
                error "add mds $num failed"
-               $TUNE2FS -O extents $(mdsdevname $num)
+               do_facet mds${num} "$TUNE2FS -O extents $(mdsdevname $num)" ||
+                       error "$TUNE2FS failed on mds${num}"
        done
 
        add ost1 $(mkfs_opts ost1 $ostdev) --reformat $ostdev ||
@@ -4862,7 +5004,7 @@ test_80() {
 }
 run_test 80 "mgc import reconnect race"
 
-# Save the original values of $OSTCOUNT and $OSTINDEX$i.
+#Save the original values of $OSTCOUNT and $OSTINDEX$i.
 save_ostindex() {
        local new_ostcount=$1
        saved_ostcount=$OSTCOUNT
@@ -5166,16 +5308,18 @@ test_82b() { # LU-4665
 run_test 82b "specify OSTs for file with --pool and --ost-list options"
 
 test_83() {
-       local dev
-       local ostmnt
-       local fstype
-       local mnt_opts
-
+       [[ $(lustre_version_code ost1) -ge $(version_code 2.6.91) ]] ||
+               { skip "Need OST version at least 2.6.91" && return 0; }
        if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
                skip "Only applicable to ldiskfs-based MDTs"
                return
        fi
 
+       local dev
+       local ostmnt
+       local fstype
+       local mnt_opts
+
        dev=$(ostdevname 1)
        ostmnt=$(facet_mntpt ost1)
        fstype=$(facet_fstype ost1)
@@ -5301,6 +5445,422 @@ test_84() {
 }
 run_test 84 "check recovery_hard_time"
 
+test_85() {
+       [[ $(lustre_version_code ost1) -ge $(version_code 2.7.55) ]] ||
+               { skip "Need OST version at least 2.7.55" && return 0; }
+##define OBD_FAIL_OSD_OST_EA_FID_SET 0x197
+       do_facet ost1 "lctl set_param fail_loc=0x197"
+       start_ost
+       stop_ost
+}
+run_test 85 "osd_ost init: fail ea_fid_set"
+
+test_86() {
+       [ "$(facet_fstype ost1)" = "zfs" ] &&
+               skip "LU-6442: no such mkfs params for ZFS OSTs" && return
+
+       local OST_OPTS="$(mkfs_opts ost1 $(ostdevname 1)) \
+               --reformat $(ostdevname 1) $(ostvdevname 1)"
+
+       local NEWSIZE=1024
+       local OLDSIZE=$(do_facet ost1 "$DEBUGFS -c -R stats $(ostdevname 1)" |
+               awk '/Flex block group size: / { print $NF; exit; }')
+
+       local opts=OST_OPTS
+       if [[ ${!opts} != *mkfsoptions* ]]; then
+               eval opts=\"${!opts} \
+                       --mkfsoptions='\\\"-O flex_bg -G $NEWSIZE\\\"'\"
+       else
+               val=${!opts//--mkfsoptions=\\\"/ \
+                       --mkfsoptions=\\\"-O flex_bg -G $NEWSIZE }
+               eval opts='${val}'
+       fi
+
+       echo "params: $opts"
+
+       add ost1 $opts || error "add ost1 failed with new params"
+
+       local FOUNDSIZE=$(do_facet ost1 "$DEBUGFS -c -R stats $(ostdevname 1)" |
+               awk '/Flex block group size: / { print $NF; exit; }')
+
+       [[ $FOUNDSIZE == $NEWSIZE ]] ||
+               error "Flex block group size: $FOUNDSIZE, expected: $NEWSIZE"
+       return 0
+}
+run_test 86 "Replacing mkfs.lustre -G option"
+
+test_87() { #LU-6544
+       [[ $(lustre_version_code $SINGLEMDS1) -ge $(version_code 2.7.56) ]] ||
+               { skip "Need MDS version at least 2.7.56" && return; }
+       [[ $(facet_fstype $SINGLEMDS) != ldiskfs ]] &&
+               { skip "Only applicable to ldiskfs-based MDTs" && return; }
+       [[ $OSTCOUNT -gt 69 ]] &&
+               { skip "Ignore wide striping situation" && return; }
+
+       local mdsdev=$(mdsdevname 1)
+       local mdsvdev=$(mdsvdevname 1)
+       local file=$DIR/$tfile
+       local mntpt=$(facet_mntpt $SINGLEMDS)
+       local used_xattr_blk=0
+       local inode_size=${1:-512}
+       local left_size=0
+       local xtest="trusted.test"
+       local value
+       local orig
+       local i
+
+       #Please see LU-6544 for MDT inode size calculation
+       if [ $OSTCOUNT -gt 26 ]; then
+               inode_size=2048
+       elif [ $OSTCOUNT -gt 5 ]; then
+               inode_size=1024
+       fi
+       left_size=$(expr $inode_size - \
+                       156 - \
+                       32 - \
+                       32 - $OSTCOUNT \* 24 - 16 - 3 -  \
+                       24 - 16 - 3 - \
+                       24 - 18 - $(expr length $tfile) - 16 - 4)
+       if [ $left_size -le 0 ]; then
+               echo "No space($left_size) is expected in inode."
+               echo "Try 1-byte xattr instead to verify this."
+               left_size=1
+       else
+               echo "Estimate: at most $left_size-byte space left in inode."
+       fi
+
+       unload_modules
+       reformat
+
+       add mds1 $(mkfs_opts mds1 ${mdsdev}) --stripe-count-hint=$OSTCOUNT \
+               --reformat $mdsdev $mdsvdev || error "add mds1 failed"
+       start_mdt 1 > /dev/null || error "start mdt1 failed"
+       for i in $(seq $OSTCOUNT); do
+               start ost$i $(ostdevname $i) $OST_MOUNT_OPTS > /dev/null ||
+                       error "start ost$i failed"
+       done
+       mount_client $MOUNT > /dev/null || error "mount client $MOUNT failed"
+       check_mount || error "check client $MOUNT failed"
+
+       #set xattr
+       $SETSTRIPE -c -1 $file || error "$SETSTRIPE -c -1 $file failed"
+       $GETSTRIPE $file || error "$GETSTRIPE $file failed"
+       i=$($GETSTRIPE -c $file)
+       if [ $i -ne $OSTCOUNT ]; then
+               left_size=$(expr $left_size + $(expr $OSTCOUNT - $i) \* 24)
+               echo -n "Since only $i out $OSTCOUNT OSTs are used, "
+               echo -n "the expected left space is changed to "
+               echo "$left_size bytes at most."
+       fi
+       value=$(generate_string $left_size)
+       setfattr -n $xtest -v $value $file
+       orig=$(get_xattr_value $xtest $file)
+       [[ "$orig" != "$value" ]] && error "$xtest changed"
+
+       #Verify if inode has some expected space left
+       umount $MOUNT > /dev/null || error "umount $MOUNT failed"
+       stop_mdt 1 > /dev/null || error "stop mdt1 failed"
+       mount_ldiskfs $SINGLEMDS || error "mount -t ldiskfs $SINGLEMDS failed"
+
+       do_facet $SINGLEMDS ls -sal $mntpt/ROOT/$tfile
+       used_xattr_blk=$(do_facet $SINGLEMDS ls -s $mntpt/ROOT/$tfile |
+                       awk '{ print $1 }')
+       [[ $used_xattr_blk -eq 0 ]] &&
+               error "Please check MDS inode size calculation: \
+                      more than $left_size-byte space left in inode."
+       echo "Verified: at most $left_size-byte space left in inode."
+
+       stopall
+}
+run_test 87 "check if MDT inode can hold EAs with N stripes properly"
+
+# $1 test directory
+# $2 (optional) value of max_mod_rpcs_in_flight to set
+check_max_mod_rpcs_in_flight() {
+       local dir="$1"
+       local mmr="$2"
+       local idx
+       local facet
+       local tmp
+       local i
+
+       idx=$(printf "%04x" $($LFS getdirstripe -i $dir))
+       facet="mds$((0x$idx + 1))"
+
+       if [ -z "$mmr" ]; then
+               # get value of max_mod_rcps_in_flight
+               mmr=$($LCTL get_param -n \
+                       mdc.$FSNAME-MDT$idx-mdc-*.max_mod_rpcs_in_flight) ||
+                       error "Unable to get max_mod_rpcs_in_flight"
+               echo "max_mod_rcps_in_flight is $mmr"
+       else
+               # set value of max_mod_rpcs_in_flight
+               $LCTL set_param \
+                   mdc.$FSNAME-MDT$idx-mdc-*.max_mod_rpcs_in_flight=$mmr ||
+                       error "Unable to set max_mod_rpcs_in_flight to $mmr"
+               echo "max_mod_rpcs_in_flight set to $mmr"
+       fi
+
+       # create mmr+1 files
+       echo "creating $((mmr + 1)) files ..."
+       umask 0022
+       for i in $(seq $((mmr + 1))); do
+               touch $dir/file-$i
+       done
+
+       ### part 1 ###
+
+       # consumes mmr-1 modify RPC slots
+       #define OBD_FAIL_MDS_REINT_MULTI_NET     0x159
+       # drop requests on MDT so that RPC slots are consumed
+       # during all the request resend interval
+       do_facet $facet "$LCTL set_param fail_loc=0x159"
+       echo "launch $((mmr - 1)) chmod in parallel ..."
+       for i in $(seq $((mmr - 1))); do
+               chmod 0600 $dir/file-$i &
+       done
+
+       # send one additional modify RPC
+       do_facet $facet "$LCTL set_param fail_loc=0"
+       echo "launch 1 additional chmod in parallel ..."
+       chmod 0600 $dir/file-$mmr &
+       sleep 1
+
+       # check this additional modify RPC get a modify RPC slot
+       # and succeed its operation
+       checkstat -vp 0600 $dir/file-$mmr ||
+               error "Unable to send $mmr modify RPCs in parallel"
+       wait
+
+       ### part 2 ###
+
+       # consumes mmr modify RPC slots
+       #define OBD_FAIL_MDS_REINT_MULTI_NET     0x159
+       # drop requests on MDT so that RPC slots are consumed
+       # during all the request resend interval
+       do_facet $facet "$LCTL set_param fail_loc=0x159"
+       echo "launch $mmr chmod in parallel ..."
+       for i in $(seq $mmr); do
+               chmod 0666 $dir/file-$i &
+       done
+
+       # send one additional modify RPC
+       do_facet $facet "$LCTL set_param fail_loc=0"
+       echo "launch 1 additional chmod in parallel ..."
+       chmod 0666 $dir/file-$((mmr + 1)) &
+       sleep 1
+
+       # check this additional modify RPC blocked getting a modify RPC slot
+       checkstat -vp 0644 $dir/file-$((mmr + 1)) ||
+               error "Unexpectedly send $mmr modify RPCs in parallel"
+       wait
+}
+
+test_90a() {
+       reformat
+       if ! combined_mgs_mds ; then
+               start_mgs
+       fi
+       setup
+
+       [[ $($LCTL get_param mdc.*.import |
+            grep "connect_flags:.*multi_mod_rpc") ]] ||
+               { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; }
+
+       # check default value
+       $LFS mkdir -c1 $DIR/$tdir || error "mkdir $DIR/$tdir failed"
+       check_max_mod_rpcs_in_flight $DIR/$tdir
+
+       cleanup
+}
+run_test 90a "check max_mod_rpcs_in_flight is enforced"
+
+test_90b() {
+       local idx
+       local facet
+       local tmp
+       local mmrpc
+
+       setup
+
+       [[ $($LCTL get_param mdc.*.import |
+            grep "connect_flags:.*multi_mod_rpc") ]] ||
+               { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; }
+
+       ### test 1.
+       # update max_mod_rpcs_in_flight
+       $LFS mkdir -c1 $DIR/${tdir}1 || error "mkdir $DIR/${tdir}1 failed"
+       check_max_mod_rpcs_in_flight $DIR/${tdir}1 1
+
+       ### test 2.
+       # check client is able to send multiple modify RPCs in paralell
+       tmp=$($LCTL get_param -n mdc.$FSNAME-MDT*-mdc-*.import |
+               grep -c "multi_mod_rpcs")
+       if [ "$tmp" -ne $MDSCOUNT ]; then
+               echo "Client not able to send multiple modify RPCs in parallel"
+               cleanup
+               return
+       fi
+
+       # update max_mod_rpcs_in_flight
+       $LFS mkdir -c1 $DIR/${tdir}2 || error "mkdir $DIR/${tdir}2 failed"
+       check_max_mod_rpcs_in_flight $DIR/${tdir}2 5
+
+       ### test 3.
+       $LFS mkdir -c1 $DIR/${tdir}3 || error "mkdir $DIR/${tdir}3 failed"
+       idx=$(printf "%04x" $($LFS getdirstripe -i $DIR/${tdir}3))
+       facet="mds$((0x$idx + 1))"
+
+       # save MDT max_mod_rpcs_per_client
+       mmrpc=$(do_facet $facet \
+                   cat /sys/module/mdt/parameters/max_mod_rpcs_per_client)
+
+       # update max_mod_rpcs_in_flight
+       umount_client $MOUNT
+       do_facet $facet \
+               "echo 16 > /sys/module/mdt/parameters/max_mod_rpcs_per_client"
+       mount_client $MOUNT
+       $LCTL set_param mdc.$FSNAME-MDT$idx-mdc-*.max_rpcs_in_flight=17
+       check_max_mod_rpcs_in_flight $DIR/${tdir}3 16
+
+       # restore MDT max_mod_rpcs_per_client initial value
+       do_facet $facet \
+               "echo $mmrpc > /sys/module/mdt/parameters/max_mod_rpcs_per_client"
+
+       rm -rf $DIR/${tdir}?
+       cleanup
+}
+run_test 90b "check max_mod_rpcs_in_flight is enforced after update"
+
+test_90c() {
+       local tmp
+       local mrif
+       local mmrpc
+
+       setup
+
+       [[ $($LCTL get_param mdc.*.import |
+            grep "connect_flags:.*multi_mod_rpc") ]] ||
+               { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; }
+
+       # check client is able to send multiple modify RPCs in paralell
+       tmp=$($LCTL get_param -n mdc.$FSNAME-MDT*-mdc-*.import |
+               grep -c "multi_mod_rpcs")
+       if [ "$tmp" -ne $MDSCOUNT ]; then
+               skip "Client not able to send multiple modify RPCs in parallel"
+               cleanup
+               return
+       fi
+
+       # get max_rpcs_in_flight value
+       mrif=$($LCTL get_param -n mdc.$FSNAME-MDT0000-mdc-*.max_rpcs_in_flight)
+       echo "max_rpcs_in_flight is $mrif"
+
+       # get MDT max_mod_rpcs_per_client
+       mmrpc=$(do_facet mds1 \
+                   cat /sys/module/mdt/parameters/max_mod_rpcs_per_client)
+       echo "max_mod_rpcs_per_client is $mmrpc"
+
+       # testcase 1
+       # attempt to set max_mod_rpcs_in_flight to max_rpcs_in_flight value
+       # prerequisite: set max_mod_rpcs_per_client to max_rpcs_in_flight value
+       umount_client $MOUNT
+       do_facet mds1 \
+               "echo $mrif > /sys/module/mdt/parameters/max_mod_rpcs_per_client"
+       mount_client $MOUNT
+
+       $LCTL set_param \
+           mdc.$FSNAME-MDT0000-mdc-*.max_mod_rpcs_in_flight=$mrif &&
+           error "set max_mod_rpcs_in_flight to $mrif should fail"
+
+       umount_client $MOUNT
+       do_facet mds1 \
+               "echo $mmrpc > /sys/module/mdt/parameters/max_mod_rpcs_per_client"
+       mount_client $MOUNT
+
+       # testcase 2
+       # attempt to set max_mod_rpcs_in_flight to max_mod_rpcs_per_client+1
+       # prerequisite: set max_rpcs_in_flight to max_mod_rpcs_per_client+2
+       $LCTL set_param \
+           mdc.$FSNAME-MDT0000-mdc-*.max_rpcs_in_flight=$((mmrpc + 2))
+
+       $LCTL set_param \
+           mdc.$FSNAME-MDT0000-mdc-*.max_mod_rpcs_in_flight=$((mmrpc + 1)) &&
+           error "set max_mod_rpcs_in_flight to $((mmrpc + 1)) should fail"
+
+       cleanup
+}
+run_test 90c "check max_mod_rpcs_in_flight update limits"
+
+test_90d() {
+       local idx
+       local facet
+       local mmr
+       local i
+       local pid
+
+       setup
+
+       [[ $($LCTL get_param mdc.*.import |
+            grep "connect_flags:.*multi_mod_rpc") ]] ||
+               { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; }
+
+       $LFS mkdir -c1 $DIR/$tdir || error "mkdir $DIR/$tdir failed"
+       idx=$(printf "%04x" $($LFS getdirstripe -i $DIR/$tdir))
+       facet="mds$((0x$idx + 1))"
+
+       # check client version supports multislots
+       tmp=$($LCTL get_param -N \
+               mdc.$FSNAME-MDT$idx-mdc-*.max_mod_rpcs_in_flight)
+       if [ -z "$tmp" ]; then
+               skip "Client does not support multiple modify RPCs in flight"
+               cleanup
+               return
+       fi
+
+       # get current value of max_mod_rcps_in_flight
+       mmr=$($LCTL get_param -n \
+               mdc.$FSNAME-MDT$idx-mdc-*.max_mod_rpcs_in_flight)
+       echo "max_mod_rcps_in_flight is $mmr"
+
+       # create mmr files
+       echo "creating $mmr files ..."
+       umask 0022
+       for i in $(seq $mmr); do
+               touch $DIR/$tdir/file-$i
+       done
+
+       # prepare for close RPC
+       multiop_bg_pause $DIR/$tdir/file-close O_c
+       pid=$!
+
+       # consumes mmr modify RPC slots
+       #define OBD_FAIL_MDS_REINT_MULTI_NET     0x159
+       # drop requests on MDT so that RPC slots are consumed
+       # during all the request resend interval
+       do_facet $facet "$LCTL set_param fail_loc=0x159"
+       echo "launch $mmr chmod in parallel ..."
+       for i in $(seq $mmr); do
+               chmod 0600 $DIR/$tdir/file-$i &
+       done
+
+       # send one additional close RPC
+       do_facet $facet "$LCTL set_param fail_loc=0"
+       echo "launch 1 additional close in parallel ..."
+       kill -USR1 $pid
+       cancel_lru_locks mdc
+       sleep 1
+
+       # check this additional close RPC get a modify RPC slot
+       # and multiop process completed
+       [ -d /proc/$pid ] &&
+               error "Unable to send the additional close RPC in parallel"
+       wait
+       rm -rf $DIR/$tdir
+       cleanup
+}
+run_test 90d "check one close RPC is allowed above max_mod_rpcs_in_flight"
+
 if ! combined_mgs_mds ; then
        stop mgs
 fi