Whamcloud - gitweb
LU-839 tests: test_52 fails with loop devices MRP-233
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
index 544779d..fc6ec98 100644 (file)
@@ -16,6 +16,12 @@ ONLY=${ONLY:-"$*"}
 ALWAYS_EXCEPT="$CONF_SANITY_EXCEPT"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
+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
+
 SRCDIR=`dirname $0`
 PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
 
@@ -33,11 +39,26 @@ MDSSIZE=200000
 OSTSIZE=200000
 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
 
+if ! combined_mgs_mds; then
+    # bug number for skipped test:    23954
+    ALWAYS_EXCEPT="$ALWAYS_EXCEPT       24b"
+fi
+
 # STORED_MDSSIZE is used in test_18
 if [ -n "$MDSSIZE" ]; then
     STORED_MDSSIZE=$MDSSIZE
 fi
 
+# pass "-E lazy_itable_init" to mke2fs to speed up the formatting time
+for facet in MGS MDS OST; do
+    opts=${facet}_MKFS_OPTS
+    if [[ ${!opts} != *lazy_itable_init* ]]; then
+        eval SAVED_${facet}_MKFS_OPTS=\"${!opts}\"
+        eval ${facet}_MKFS_OPTS=\"${!opts} \
+--mkfsoptions='\\\"-E lazy_itable_init\\\"'\"
+    fi
+done
+
 init_logging
 
 #
@@ -60,22 +81,19 @@ writeconf1() {
        stop ${facet} -f
        rm -f ${facet}active
        # who knows if/where $TUNEFS is installed?  Better reformat if it fails...
-       do_facet ${facet} "$TUNEFS --writeconf $dev" ||
+       do_facet ${facet} "$TUNEFS --quiet --writeconf $dev" ||
                { echo "tunefs failed, reformatting instead" && reformat_and_config && return 1; }
        return 0
 }
 
-writeclean() {
-       [ -e ${WCDIR}/$@ ] && rm ${WCDIR}/$@
-       true
-}
-
-writeclean_all() {
-       writeclean wc.m
-       writeclean wc.o1
-       writeclean wc.o2
+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
 }
-writeclean_all
 
 gen_config() {
        # The MGS must be started before the OSTs for a new fs, so start
@@ -97,7 +115,7 @@ reformat_and_config() {
 
 start_mgs () {
        echo "start mgs"
-       start mgs $MGSDEV $mgs_MOUNT_OPTS
+       start mgs $MGSDEV $MGS_MOUNT_OPTS
 }
 
 start_mds() {
@@ -122,6 +140,12 @@ stop_mds() {
        stop $SINGLEMDS -f  || return 97
 }
 
+stop_mgs() {
+       echo "stop mgs service on `facet_active_host mgs`"
+       # These tests all use non-failover stop
+       stop mgs -f  || return 97
+}
+
 start_ost() {
        echo "start ost1 service on `facet_active_host ost1`"
        start ost1 `ostdevname 1` $OST_MOUNT_OPTS $@ || return 95
@@ -151,12 +175,10 @@ mount_client() {
 }
 
 remount_client() {
-       local SAVEMOUNTOPT=$MOUNTOPT
-       MOUNTOPT="remount,$1"
+       local mountopt="-o remount,$1"
        local MOUNTPATH=$2
        echo "remount '$1' lustre on ${MOUNTPATH}....."
-       zconf_mount `hostname`  $MOUNTPATH  || return 96
-       MOUNTOPT=$SAVEMOUNTOPT
+       zconf_mount `hostname`  $MOUNTPATH "$mountopt"  || return 96
 }
 
 umount_client() {
@@ -178,6 +200,7 @@ setup() {
        start_mds || error "MDT start failed"
        start_ost || error "OST start failed"
        mount_client $MOUNT || error "client start failed"
+       client_up || error "client_up failed"
 }
 
 setup_noconfig() {
@@ -190,14 +213,20 @@ setup_noconfig() {
        mount_client $MOUNT
 }
 
+unload_modules_conf () {
+       if combined_mgs_mds || ! local_mode; then
+               unload_modules || return 1
+       fi
+}
+
 cleanup_nocli() {
        stop_ost || return 202
        stop_mds || return 201
-       unload_modules || return 203
+       unload_modules_conf || return 203
 }
 
 cleanup() {
-       umount_client $MOUNT || return 200
+       umount_client $MOUNT || return 200
        cleanup_nocli || return $?
 }
 
@@ -298,7 +327,7 @@ test_5a() { # was test_5
        # cleanup may return an error from the failed
        # disconnects; for now I'll consider this successful
        # if all the modules have unloaded.
-       umount -d $MOUNT &
+       umount -d $MOUNT &
        UMOUNT_PID=$!
        sleep 6
        echo "killing umount"
@@ -329,7 +358,7 @@ test_5a() { # was test_5
        while [ "$WAIT" -ne "$MAX_WAIT" ]; do
                sleep $sleep
                grep -q $MOUNT" " /etc/mtab || break
-               echo "Waiting /etc/mtab updated ... "
+               echo "Waiting /etc/mtab updated ... "
                WAIT=$(( WAIT + sleep))
        done
        [ "$WAIT" -eq "$MAX_WAIT" ] && error "/etc/mtab is not updated in $WAIT secs"
@@ -337,60 +366,132 @@ test_5a() {      # was test_5
 }
 run_test 5a "force cleanup mds, then cleanup"
 
+cleanup_5b () {
+       trap 0
+       start_mgs
+}
+
 test_5b() {
+       grep " $MOUNT " /etc/mtab && \
+               error false "unexpected entry in mtab before mount" && return 10
+
+       local rc=0
        start_ost
+       if ! combined_mgs_mds ; then
+               trap cleanup_5b EXIT ERR
+               start_mds
+               stop mgs
+       fi
+
        [ -d $MOUNT ] || mkdir -p $MOUNT
-       grep " $MOUNT " /etc/mtab && echo "test 5b: mtab before mount" && return 10
-       mount_client $MOUNT && return 1
-       grep " $MOUNT " /etc/mtab && echo "test 5b: mtab after failed mount" && return 11
+       mount_client $MOUNT && rc=1
+       grep " $MOUNT " /etc/mtab && \
+               error "$MOUNT entry in mtab after failed mount" && rc=11
        umount_client $MOUNT
        # stop_mds is a no-op here, and should not fail
-       cleanup_nocli || return $?
-       return 0
+       cleanup_nocli || rc=$?
+       if ! combined_mgs_mds ; then
+               cleanup_5b
+       fi
+       return $rc
 }
-run_test 5b "mds down, cleanup after failed mount (bug 2712) (should return errs)"
+run_test 5b "Try to start a client with no MGS (should return errs)"
 
 test_5c() {
+       grep " $MOUNT " /etc/mtab && \
+               error false "unexpected entry in mtab before mount" && return 10
+
+       local rc=0
        start_mds
        start_ost
        [ -d $MOUNT ] || mkdir -p $MOUNT
-       grep " $MOUNT " /etc/mtab && echo "test 5c: mtab before mount" && return 10
        local oldfs="${FSNAME}"
        FSNAME="wrong.${FSNAME}"
        mount_client $MOUNT || :
        FSNAME=${oldfs}
-       grep " $MOUNT " /etc/mtab && echo "test 5c: mtab after failed mount" && return 11
+       grep " $MOUNT " /etc/mtab && \
+               error "$MOUNT entry in mtab after failed mount" && rc=11
        umount_client $MOUNT
-       cleanup_nocli  || return $?
+       cleanup_nocli  || rc=$?
+       return $rc
 }
 run_test 5c "cleanup after failed mount (bug 2712) (should return errs)"
 
 test_5d() {
+       grep " $MOUNT " /etc/mtab && \
+               error false "unexpected entry in mtab before mount" && return 10
+
+       local rc=0
        start_ost
        start_mds
        stop_ost -f
-       grep " $MOUNT " /etc/mtab && echo "test 5d: mtab before mount" && return 10
-       mount_client $MOUNT || return 1
-       cleanup  || return $?
-       grep " $MOUNT " /etc/mtab && echo "test 5d: mtab after unmount" && return 11
-       return 0
+       mount_client $MOUNT || rc=1
+       cleanup  || rc=$?
+       grep " $MOUNT " /etc/mtab && \
+               error "$MOUNT entry in mtab after unmount" && rc=11
+       return $rc
 }
 run_test 5d "mount with ost down"
 
 test_5e() {
+       grep " $MOUNT " /etc/mtab && \
+               error false "unexpected entry in mtab before mount" && return 10
+
+       local rc=0
        start_mds
        start_ost
 
 #define OBD_FAIL_PTLRPC_DELAY_SEND       0x506
        do_facet client "lctl set_param fail_loc=0x80000506"
-       grep " $MOUNT " /etc/mtab && echo "test 5e: mtab before mount" && return 10
        mount_client $MOUNT || echo "mount failed (not fatal)"
-       cleanup  || return $?
-       grep " $MOUNT " /etc/mtab && echo "test 5e: mtab after unmount" && return 11
-       return 0
+       cleanup  || rc=$?
+       grep " $MOUNT " /etc/mtab && \
+               error "$MOUNT entry in mtab after unmount" && rc=11
+       return $rc
 }
 run_test 5e "delayed connect, don't crash (bug 10268)"
 
+test_5f() {
+       if combined_mgs_mds ; then
+               skip "combined mgs and mds"
+               return 0
+       fi
+
+       grep " $MOUNT " /etc/mtab && \
+               error false "unexpected entry in mtab before mount" && return 10
+
+       local rc=0
+       start_ost
+       [ -d $MOUNT ] || mkdir -p $MOUNT
+       mount_client $MOUNT &
+       local pid=$!
+       echo client_mount pid is $pid
+
+       sleep 5
+
+       if ! ps -f -p $pid >/dev/null; then
+               wait $pid
+               rc=$?
+               grep " $MOUNT " /etc/mtab && echo "test 5f: mtab after mount"
+               error "mount returns $rc, expected to hang"
+               rc=11
+               cleanup || rc=$?
+               return $rc
+       fi
+
+       # start mds
+       start_mds
+
+       # mount should succeed after start mds
+       wait $pid
+       rc=$?
+       [ $rc -eq 0 ] || error "mount returned $rc"
+       grep " $MOUNT " /etc/mtab && echo "test 5f: mtab after mount"
+       cleanup || return $?
+       return $rc
+}
+run_test 5f "mds down, cleanup after failed mount (bug 2712)"
+
 test_6() {
        setup
        manual_umount_client
@@ -442,6 +543,21 @@ test_9() {
 }
 run_test 9 "test ptldebug and subsystem for mkfs"
 
+is_blkdev () {
+        local facet=$1
+        local dev=$2
+        local size=${3:-""}
+
+        local rc=0
+        do_facet $facet "test -b $dev" || rc=1
+        if [[ "$size" ]]; then
+                local in=$(do_facet $facet "dd if=$dev of=/dev/null bs=1k count=1 skip=$size 2>&1" |\
+                        awk '($3 == "in") { print $1 }')
+                [[ $in  = "1+0" ]] || rc=1
+        fi
+        return $rc
+}
+
 #
 # Test 16 was to "verify that lustre will correct the mode of OBJECTS".
 # But with new MDS stack we don't care about the mode of local objects
@@ -449,21 +565,24 @@ run_test 9 "test ptldebug and subsystem for mkfs"
 #
 
 test_17() {
-        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
+        setup
+        check_mount || return 41
+        cleanup || return $?
 
-        if [ ! -e "$MDSDEV" ]; then
-            echo "no $MDSDEV existing, so mount Lustre to create one"
-           setup
-            check_mount || return 41
-            cleanup || return $?
+        echo "Remove mds config log"
+        if ! combined_mgs_mds ; then
+                stop mgs
         fi
 
-        echo "Remove mds config log"
-        do_facet $SINGLEMDS "$DEBUGFS -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MDSDEV || return \$?" || return $?
+        do_facet mgs "$DEBUGFS -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MGSDEV || return \$?" || return $?
+
+        if ! combined_mgs_mds ; then
+                start_mgs
+        fi
 
         start_ost
-       start_mds && return 42
-       reformat_and_config
+        start_mds && return 42
+        reformat_and_config
 }
 run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)"
 
@@ -485,17 +604,18 @@ test_18() {
                 log "use STORED_MDSSIZE=$STORED_MDSSIZE"
 
         # check if the block device is large enough
-        [ -z "$OK" -a -b $MDSDEV ] && \
-                [ "$(dd if=$MDSDEV of=/dev/null bs=1k count=1 skip=$MIN 2>&1 |
-                     awk '($3 == "in") { print $1 }')" = "1+0" ] && OK=1 && \
+        [ -z "$OK" ] && $(is_blkdev $SINGLEMDS $MDSDEV $MIN) && OK=1 &&
                 myMDSSIZE=$MIN && log "use device $MDSDEV with MIN=$MIN"
 
         # check if a loopback device has enough space for fs metadata (5%)
-        [ -z "$OK" ] && [ -f $MDSDEV -o ! -e $MDSDEV ] &&
-                SPACE=$(df -P $(dirname $MDSDEV) |
-                        awk '($1 != "Filesystem") {print $4}') &&
-                [ $SPACE -gt $((MIN / 20)) ] && OK=1 && myMDSSIZE=$MIN && \
+
+        if [ -z "$OK" ]; then
+                local SPACE=$(do_facet $SINGLEMDS "[ -f $MDSDEV -o ! -e $MDSDEV ] && df -P \\\$(dirname $MDSDEV)" |
+                        awk '($1 != "Filesystem") {print $4}')
+                ! [ -z "$SPACE" ]  &&  [ $SPACE -gt $((MIN / 20)) ] && \
+                        OK=1 && myMDSSIZE=$MIN && \
                         log "use file $MDSDEV with MIN=$MIN"
+        fi
 
         [ -z "$OK" ] && skip_env "$MDSDEV too small for ${MIN}kB MDS" && return
 
@@ -503,15 +623,21 @@ test_18() {
         echo "mount mds with large journal..."
         local OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS
 
-        MDS_MKFS_OPTS="--mgs --mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT"
+        local opts="--mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT"
+
+        if combined_mgs_mds ; then
+            MDS_MKFS_OPTS="--mgs $opts"
+        else
+            MDS_MKFS_OPTS="--mgsnode=$MGSNID $opts"
+        fi
 
         reformat_and_config
         echo "mount lustre system..."
-       setup
+        setup
         check_mount || return 41
 
         echo "check journal size..."
-        local FOUNDSIZE=`do_facet mds "$DEBUGFS -c -R 'stat <8>' $MDSDEV" | awk '/Size: / { print $NF; exit;}'`
+        local FOUNDSIZE=$(do_facet $SINGLEMDS "$DEBUGFS -c -R 'stat <8>' $MDSDEV" | awk '/Size: / { print $NF; exit;}')
         if [ $FOUNDSIZE -gt $((32 * 1024 * 1024)) ]; then
                 log "Success: mkfs creates large journals. Size: $((FOUNDSIZE >> 20))M"
         else
@@ -589,6 +715,30 @@ test_21c() {
 }
 run_test 21c "start mds between two osts, stop mds last"
 
+test_21d() {
+        if combined_mgs_mds ; then
+                skip "need separate mgs device" && return 0
+        fi
+        stopall
+
+        reformat
+
+        start_mgs
+        start_ost
+        start_ost2
+        start_mds
+        wait_osc_import_state mds ost2 FULL
+
+        stop_ost
+        stop_ost2
+        stop_mds
+        stop_mgs
+        #writeconf to remove all ost2 traces for subsequent tests
+        writeconf
+        start_mgs
+}
+run_test 21d "start mgs then ost and then mds"
+
 test_22() {
        start_mds
 
@@ -615,6 +765,8 @@ test_22() {
                sleep $((TIMEOUT + TIMEOUT + TIMEOUT))
        fi
        mount_client $MOUNT
+        wait_osc_import_state mds ost FULL
+        wait_osc_import_state client ost FULL
        check_mount || return 41
        pass
 
@@ -628,10 +780,10 @@ test_23a() {      # was test_23
        stop $SINGLEMDS
        # force down client so that recovering mds waits for reconnect
        local running=$(grep -c $MOUNT /proc/mounts) || true
-       if [ $running -ne 0 ]; then
-               echo "Stopping client $MOUNT (opts: -f)"
-               umount -f $MOUNT
-       fi
+       if [ $running -ne 0 ]; then
+               echo "Stopping client $MOUNT (opts: -f)"
+               umount -f $MOUNT
+       fi
 
        # enter recovery on mds
        start_mds
@@ -643,10 +795,12 @@ test_23a() {      # was test_23
        echo mount pid is ${MOUNT_PID}, mount.lustre pid is ${MOUNT_LUSTRE_PID}
        ps --ppid $MOUNT_PID
        ps --ppid $MOUNT_LUSTRE_PID
-       # FIXME why o why can't I kill these? Manual "ctrl-c" works...
-       kill -TERM $MOUNT_LUSTRE_PID
        echo "waiting for mount to finish"
        ps -ef | grep mount
+       # "ctrl-c" sends SIGINT but it usually (in script) does not work on child process
+       # SIGTERM works but it does not spread to offspring processses
+       kill -s TERM $MOUNT_PID
+       kill -s TERM $MOUNT_LUSTRE_PID
        # we can not wait $MOUNT_PID because it is not a child of this shell
        local PID1
        local PID2
@@ -700,18 +854,15 @@ cleanup_24a() {
 }
 
 test_24a() {
-       #set up fs1
-       gen_config
-
-       #set up fs2
        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
-       [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
        if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
-               do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
+               is_blkdev $SINGLEMDS $MDSDEV && \
                skip_env "mixed loopback and real device not working" && return
        fi
 
+       [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
+
        local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
        local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
 
@@ -742,7 +893,7 @@ test_24a() {
        facet_failover fs2mds
        facet_failover fs2ost
        df
-       umount_client $MOUNT
+       umount_client $MOUNT
        # the MDS must remain up until last MDT
        stop_mds
        MDS=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
@@ -756,7 +907,9 @@ test_24b() {
        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
        if [ -z "$fs2mds_DEV" ]; then
-               do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
+               local dev=${SINGLEMDS}_dev
+               local MDSDEV=${!dev}
+               is_blkdev $SINGLEMDS $MDSDEV && \
                skip_env "mixed loopback and real device not working" && return
        fi
 
@@ -786,9 +939,9 @@ test_26() {
     do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000135"
     start_mds && echo MDS started && return 1
     lctl get_param -n devices
-    DEVS=$(lctl get_param -n devices | wc -l)
+    DEVS=$(lctl get_param -n devices | egrep -v MG | wc -l)
     [ $DEVS -gt 0 ] && return 2
-    unload_modules || return 203
+    unload_modules_conf || return $?
 }
 run_test 26 "MDT startup failure cleans LOV (should return errs)"
 
@@ -841,7 +994,7 @@ test_28() {
        set_and_check client "$TEST" "$PARAM" $FINAL || return 3
        FINAL=$(($FINAL + 1))
        set_and_check client "$TEST" "$PARAM" $FINAL || return 4
-       umount_client $MOUNT || return 200
+       umount_client $MOUNT || return 200
        mount_client $MOUNT
        RESULT=$($TEST)
        if [ $RESULT -ne $FINAL ]; then
@@ -878,7 +1031,9 @@ test_29() {
        fi
 
        # check MDT too
-       local MPROC="osc.$FSNAME-OST0001-osc-[M]*.active"
+       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
@@ -897,8 +1052,11 @@ test_29() {
            echo "Waiting $(($MAX - $WAIT)) secs for MDT deactivated"
        done
 
+        # quotacheck should not fail immediately after deactivate
+       [ -n "$ENABLE_QUOTA" ] && { $LFS quotacheck -ug $MOUNT || error "quotacheck has failed" ; }
+
         # test new client starts deactivated
-       umount_client $MOUNT || return 200
+       umount_client $MOUNT || return 200
        mount_client $MOUNT
        RESULT=$(lctl get_param -n $PROC_UUID | grep DEACTIV | grep NEW)
        if [ -z "$RESULT" ]; then
@@ -908,10 +1066,13 @@ test_29() {
            echo "New client success: got $RESULT"
        fi
 
+        # quotacheck should not fail after umount/mount operation
+       [ -n "$ENABLE_QUOTA" ] && { $LFS quotacheck -ug $MOUNT || error "quotacheck has failed" ; }
+
        # make sure it reactivates
        set_and_check client "lctl get_param -n $PROC_ACT" "$PARAM" $ACTV || return 6
 
-       umount_client $MOUNT
+       umount_client $MOUNT
        stop_ost2
        cleanup_nocli
        #writeconf to remove all ost2 traces for subsequent tests
@@ -930,7 +1091,7 @@ test_30a() {
            set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" $i || return 3
        done
        # make sure client restart still works
-       umount_client $MOUNT
+       umount_client $MOUNT
        mount_client $MOUNT || return 4
        [ "$($TEST)" -ne "$i" ] && error "Param didn't stick across restart $($TEST) != $i"
        pass
@@ -1028,7 +1189,8 @@ cleanup_32() {
        umount -f $MOUNT || true
        echo "Cleanup local mds ost1 ..."
        cleanup_nocli32
-       unload_modules
+       combined_mgs_mds || start_mgs
+       unload_modules_conf
 }
 
 test_32a() {
@@ -1048,6 +1210,8 @@ test_32a() {
 
        $TUNEFS $tmpdir/mds || error "tunefs failed"
 
+       combined_mgs_mds || stop mgs
+
        # nids are wrong, so client wont work, but server should start
        start32 mds1 $tmpdir/mds "-o loop,exclude=lustre-OST0000" && \
                trap cleanup_32 EXIT INT || return 3
@@ -1084,6 +1248,9 @@ test_32a() {
        # mount a second time to make sure we didnt leave upgrade flag on
        load_modules
        $TUNEFS --dryrun $tmpdir/mds || error "tunefs failed"
+
+       combined_mgs_mds || stop mgs
+
        start32 mds1 $tmpdir/mds "-o loop,exclude=lustre-OST0000" && \
                trap cleanup_32 EXIT INT || return 12
 
@@ -1111,6 +1278,8 @@ test_32b() {
 
        # writeconf will cause servers to register with their current nids
        $TUNEFS --writeconf --fsname=$NEWNAME $tmpdir/mds || error "tunefs failed"
+       combined_mgs_mds || stop mgs
+
        start32 mds1 $tmpdir/mds "-o loop" && \
                trap cleanup_32 EXIT INT || return 3
 
@@ -1172,10 +1341,14 @@ test_33a() { # bug 12333, was test_33
         [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
 
         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
-                do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
+                local dev=${SINGLEMDS}_dev
+                local MDSDEV=${!dev}
+                is_blkdev $SINGLEMDS $MDSDEV && \
                 skip_env "mixed loopback and real device not working" && return
         fi
 
+        combined_mgs_mds || mkfs_opts="$mkfs_opts --nomgs"
+
         local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
         local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
         add fs2mds $MDS_MKFS_OPTS --mkfsoptions='\"-J size=8\"' --fsname=${FSNAME2} --reformat $fs2mdsdev || exit 10
@@ -1233,7 +1406,7 @@ test_34b() {
        touch $DIR/$tfile || return 1
        stop_mds --force || return 2
 
-       manual_umount_client --force
+       manual_umount_client --force
        rc=$?
        if [ $rc -ne 0 ]; then
                error "mtab after failed umount - rc $rc"
@@ -1249,7 +1422,7 @@ test_34c() {
        touch $DIR/$tfile || return 1
        stop_ost --force || return 2
 
-       manual_umount_client --force
+       manual_umount_client --force
        rc=$?
        if [ $rc -ne 0 ]; then
                error "mtab after failed umount - rc $rc"
@@ -1321,31 +1494,33 @@ test_35b() { # bug 18674
 
        log "Set up a fake failnode for the MDS"
        FAKENID="127.0.0.2"
-       local device=$(do_facet mds "$LCTL get_param -n devices" | \
+       local device=$(do_facet $SINGLEMDS "$LCTL get_param -n devices" | \
                        awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
-       do_facet mds "$LCTL conf_param ${device}.failover.node=$FAKENID" || \
+       do_facet $SINGLEMDS "$LCTL conf_param ${device}.failover.node=$FAKENID" || \
                return 1
 
        local at_max_saved=0
-       # adaptive timeouts may prevent seeing the issue 
+       # adaptive timeouts may prevent seeing the issue
        if at_is_enabled; then
                at_max_saved=$(at_max_get mds)
                at_max_set 0 mds client
        fi
 
-       mkdir -p $MOUNT/testdir
-       touch $MOUNT/testdir/test
+       mkdir -p $MOUNT/$tdir
 
        log "Injecting EBUSY on MDS"
        # Setting OBD_FAIL_MDS_RESEND=0x136
-       do_facet mds "$LCTL set_param fail_loc=0x80000136" || return 2
+       do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x80000136" || return 2
+
+       $LCTL set_param mdc.${FSNAME}*.stats=clear
 
-       log "Stat on a test file"
-       stat $MOUNT/testdir/test
+       log "Creating a test file and stat it"
+       touch $MOUNT/$tdir/$tfile
+       stat $MOUNT/$tdir/$tfile
 
        log "Stop injecting EBUSY on MDS"
-       do_facet mds "$LCTL set_param fail_loc=0" || return 3
-       rm -f $MOUNT/testdir/test
+       do_facet $SINGLEMDS "$LCTL set_param fail_loc=0" || return 3
+       rm -f $MOUNT/$tdir/$tfile
 
        log "done"
        # restore adaptive timeout
@@ -1353,6 +1528,8 @@ test_35b() { # bug 18674
 
        $LCTL dk $TMP/lustre-log-$TESTNAME.log
 
+       CONNCNT=`$LCTL get_param mdc.${FSNAME}*.stats | awk '/mds_connect/{print $2}'`
+
        # retrieve from the log if the client has ever tried to
        # contact the fake server after the loss of connection
        FAILCONN=`awk "BEGIN {ret = 0;}
@@ -1372,29 +1549,36 @@ test_35b() { # bug 18674
                log "ERROR: The client tried to reconnect to the failover server while the primary was busy" && \
                return 5
 
-        cleanup
+       # LU-290
+       # When OBD_FAIL_MDS_RESEND is hit, we sleep for 2 * obd_timeout
+       # Reconnects are supposed to be rate limited to one every 5s
+       [ $CONNCNT -gt $((2 * $TIMEOUT / 5 + 1)) ] && \
+               log "ERROR: Too many reconnects $CONNCNT" && \
+               return 6
+
+       cleanup
        # remove nid settings
        writeconf
 }
 run_test 35b "Continue reconnection retries, if the active server is busy"
 
 test_36() { # 12743
-        local rc
+        [ $OSTCOUNT -lt 2 ] && skip_env "skipping test for single OST" && return
+
+        [ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] || \
+               { skip "remote OST" && return 0; }
+
+        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
-        rc=0
 
         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" -o -z "$fs3ost_DEV" ]; then
-               do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
+               is_blkdev $SINGLEMDS $MDSDEV && \
                skip_env "mixed loopback and real device not working" && return
         fi
-        [ $OSTCOUNT -lt 2 ] && skip_env "skipping test for single OST" && return
-
-       [ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] || \
-               { skip "remote OST" && return 0; }
 
         local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
         local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
@@ -1447,34 +1631,38 @@ test_36() { # 12743
         stop fs2ost -f || return 201
         stop fs2mds -f || return 202
         rm -rf $MOUNT2 $fs2mdsdev $fs2ostdev $fs3ostdev
-        unload_modules || return 203
+        unload_modules_conf || return 203
         return $rc
 }
 run_test 36 "df report consistency on OSTs with different block size"
 
 test_37() {
-       client_only && skip "client only testing" && return 0
-       LOCAL_MDSDEV="$TMP/mdt.img"
-       SYM_MDSDEV="$TMP/sym_mdt.img"
+       local mntpt=$(facet_mntpt $SINGLEMDS)
+       local mdsdev=$(mdsdevname ${SINGLEMDS//mds/})
+       local mdsdev_sym="$TMP/sym_mdt.img"
+
+       echo "MDS :     $mdsdev"
+       echo "SYMLINK : $mdsdev_sym"
+       do_facet $SINGLEMDS rm -f $mdsdev_sym
 
-       echo "MDS :     $LOCAL_MDSDEV"
-       echo "SYMLINK : $SYM_MDSDEV"
-       rm -f $LOCAL_MDSDEV
+       do_facet $SINGLEMDS ln -s $mdsdev $mdsdev_sym
 
-       touch $LOCAL_MDSDEV
-       mkfs.lustre --reformat --fsname=lustre --mdt --mgs --device-size=9000 $LOCAL_MDSDEV ||
-               error "mkfs.lustre $LOCAL_MDSDEV failed"
-       ln -s $LOCAL_MDSDEV $SYM_MDSDEV
+       echo "mount symlink device - $mdsdev_sym"
+
+       local rc=0
+       mount_op=$(do_facet $SINGLEMDS mount -v -t lustre $MDS_MOUNT_OPTS  $mdsdev_sym $mntpt 2>&1 )
+       rc=${PIPESTATUS[0]}
 
-       echo "mount symlink device - $SYM_MDSDEV"
+       echo mount_op=$mount_op
 
-       mount_op=`mount -v -t lustre -o loop $SYM_MDSDEV ${MOUNT%/*}/mds 2>&1 | grep "unable to set tunable"`
-       umount -d ${MOUNT%/*}/mds
-       rm -f $LOCAL_MDSDEV $SYM_MDSDEV
+       do_facet $SINGLEMDS "umount -d $mntpt && rm -f $mdsdev_sym"
 
-       if [ -n "$mount_op" ]; then
-               error "**** FAIL: set tunables failed for symlink device"
+       if $(echo $mount_op | grep -q "unable to set tunable"); then
+               error "set tunables failed for symlink device"
        fi
+
+       [ $rc -eq 0 ] || error "mount symlink $mdsdev_sym failed! rc=$rc"
+
        return 0
 }
 run_test 37 "verify set tunables works for symlink device"
@@ -1548,13 +1736,15 @@ run_test 39 "leak_finder recognizes both LUSTRE and LNET malloc messages"
 test_40() { # bug 15759
        start_ost
        #define OBD_FAIL_TGT_TOOMANY_THREADS     0x706
-       do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000706"
+       do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x80000706"
        start_mds
        cleanup
 }
 run_test 40 "race during service thread startup"
 
-test_41() { #bug 14134
+test_41a() { #bug 14134
+        echo $MDS_MOUNT_OPTS | grep "loop" && skip " loop devices does not work with nosvc option" && return
+
         local rc
         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
@@ -1572,10 +1762,37 @@ test_41() { #bug 14134
         stop ost1 -f || return 201
         stop_mds -f || return 202
         stop_mds -f || return 203
-        unload_modules || return 204
+        unload_modules_conf || return 204
         return $rc
 }
-run_test 41 "mount mds with --nosvc and --nomgs"
+run_test 41a "mount mds with --nosvc and --nomgs"
+
+test_41b() {
+        echo $MDS_MOUNT_OPTS | grep "loop" && skip " loop devices does not work with nosvc option" && return
+
+        ! combined_mgs_mds && skip "needs combined mgs device" && return 0
+
+        stopall
+        reformat
+        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
+
+        start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nosvc -n
+        start_ost
+        start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nomgs,force
+        mkdir -p $MOUNT
+        mount_client $MOUNT || return 1
+        sleep 5
+
+        echo "blah blah" > $MOUNT/$tfile
+        cat $MOUNT/$tfile || return 200
+
+        umount_client $MOUNT
+        stop_ost || return 201
+        stop_mds -f || return 202
+        stop_mds -f || return 203
+
+}
+run_test 41b "mount mds with --nosvc and --nomgs on first mount"
 
 test_42() { #bug 14693
         setup
@@ -1697,7 +1914,7 @@ test_44() { # 16317
         check_mount || return 2
         UUID=$($LCTL get_param llite.${FSNAME}*.uuid | cut -d= -f2)
         STATS_FOUND=no
-        UUIDS=$(do_facet mds "$LCTL get_param mdt.${FSNAME}*.exports.*.uuid")
+        UUIDS=$(do_facet $SINGLEMDS "$LCTL get_param mdt.${FSNAME}*.exports.*.uuid")
         for VAL in $UUIDS; do
                 NID=$(echo $VAL | cut -d= -f1)
                 CLUUID=$(echo $VAL | cut -d= -f2)
@@ -1740,7 +1957,7 @@ cleanup_46a() {
                stop ost${count} -f || rc=$?
                let count=count-1
        done    
-       stop_mds || rc=$? 
+       stop_mds || rc=$?
        cleanup_nocli || rc=$?
        #writeconf to remove all ost2 traces for subsequent tests
        writeconf
@@ -1758,7 +1975,7 @@ test_46a() {
        mount_client $MOUNT || return 3
        trap "cleanup_46a $OSTCOUNT" EXIT ERR
 
-       local i 
+       local i
        for (( i=2; i<=$OSTCOUNT; i++ )); do
            start ost$i `ostdevname $i` $OST_MOUNT_OPTS || return $((i+2))
        done
@@ -1766,9 +1983,9 @@ test_46a() {
        # wait until osts in sync
        for (( i=2; i<=$OSTCOUNT; i++ )); do
            wait_osc_import_state mds ost$i FULL
+           wait_osc_import_state client ost$i FULL
        done
 
-
        #second client see all ost's
 
        mount_client $MOUNT2 || return 8
@@ -1876,7 +2093,7 @@ test_49() { # bug 17710
        check_mount || return 1
 
        echo "check ldlm_timout..."
-       LDLM_MDS="`do_facet mds lctl get_param -n ldlm_timeout`"
+       LDLM_MDS="`do_facet $SINGLEMDS lctl get_param -n ldlm_timeout`"
        LDLM_OST1="`do_facet ost1 lctl get_param -n ldlm_timeout`"
        LDLM_CLIENT="`do_facet client lctl get_param -n ldlm_timeout`"
 
@@ -1898,7 +2115,7 @@ test_49() { # bug 17710
        setup_noconfig
        check_mount || return 7
 
-       LDLM_MDS="`do_facet mds lctl get_param -n ldlm_timeout`"
+       LDLM_MDS="`do_facet $SINGLEMDS lctl get_param -n ldlm_timeout`"
        LDLM_OST1="`do_facet ost1 lctl get_param -n ldlm_timeout`"
        LDLM_CLIENT="`do_facet client lctl get_param -n ldlm_timeout`"
 
@@ -1981,9 +2198,11 @@ test_50c() {
         wait_osc_import_state mds ost DISCONN
        lazystatfs $MOUNT || error "lazystatfs failed with one down server"
 
-       umount_client $MOUNT || error "Unable to unmount client"
+       umount_client $MOUNT || error "Unable to unmount client"
        stop_ost2 || error "Unable to stop OST2"
        stop_mds || error "Unable to stop MDS"
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 50c "lazystatfs one server down =========================="
 
@@ -2001,9 +2220,11 @@ test_50d() {
        stop_ost || error "Unable to stop OST1"
        lazystatfs $MOUNT || error "lazystatfs failed with one down server"
 
-       umount_client $MOUNT || error "Unable to unmount client"
+       umount_client $MOUNT || error "Unable to unmount client"
        stop_ost2 || error "Unable to stop OST2"
        stop_mds || error "Unable to stop MDS"
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 50d "lazystatfs client/server conn race =========================="
 
@@ -2093,6 +2314,8 @@ test_50g() {
        [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2, skipping" && return
        setup
        start_ost2 || error "Unable to start OST2"
+        wait_osc_import_state mds ost2 FULL
+        wait_osc_import_state client ost2 FULL
 
        local PARAM="${FSNAME}-OST0001.osc.active"
 
@@ -2133,6 +2356,8 @@ test_51() {
        wait $pid
        stop_ost2 || return 3
        cleanup
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 51 "Verify that mdt_reint handles RMF_MDT_MD correctly when an OST is added"
 
@@ -2201,7 +2426,9 @@ test_52() {
        [ $? -eq 0 ] || { error "Unable to create tdir"; return 4; }
        touch $TMP/modified_first
        [ $? -eq 0 ] || { error "Unable to create temporary file"; return 5; }
-       do_node $ost1node "mkdir -p $ost1tmp && touch $ost1tmp/modified_first"
+       local mtime=$(stat -c %Y $TMP/modified_first)
+       do_node $ost1node "mkdir -p $ost1tmp && touch -m -d @$mtime $ost1tmp/modified_first"
+
        [ $? -eq 0 ] || { error "Unable to create temporary file"; return 6; }
        sleep 1
 
@@ -2227,6 +2454,8 @@ test_52() {
        [ $? -eq 0 ] || { error "Unable to stop ost1"; return 11; }
 
        echo mount ost1 as ldiskfs
+       do_node $ost1node mkdir -p $ost1mnt
+       [ $? -eq 0 ] || { error "Unable to create $ost1mnt"; return 23; }
        do_node $ost1node mount -t $FSTYPE $ost1_dev $ost1mnt $OST_MOUNT_OPTS
        [ $? -eq 0 ] || { error "Unable to mount ost1 as ldiskfs"; return 12; }
 
@@ -2249,7 +2478,7 @@ test_52() {
        diff_files_xattrs $ost1node $ost1tmp/objects $ost1tmp/object_xattrs $objects
        [ $? -eq 0 ] || { error "Unable to diff objects"; return 16; }
 
-       do_node $ost1node "umount $ost1_dev"
+       do_node $ost1node "umount $ost1mnt"
        [ $? -eq 0 ] || { error "Unable to umount ost1 as ldiskfs"; return 17; }
 
        start_ost
@@ -2305,17 +2534,17 @@ thread_sanity() {
         tmax=$(do_facet $facet "lctl get_param -n ${paramp}.threads_max" || echo 0)
         tstarted=$(do_facet $facet "lctl get_param -n ${paramp}.threads_started" || echo 0)
         lassert 23 "$msg (PDSH problems?)" '(($tstarted && $tmin && $tmax))' || return $?
-        lassert 24 "$msg" '(($tstarted >= $tmin && $tstarted <= tmax ))' || return $?
+        lassert 24 "$msg" '(($tstarted >= $tmin && $tstarted <= $tmax ))' || return $?
 
-        # Check that we can lower min/max
-        do_facet $facet "lctl set_param ${paramp}.threads_min=$((tmin - 1))"
-        do_facet $facet "lctl set_param ${paramp}.threads_max=$((tmax - 10))"
+        # Check that we can change min/max
+        do_facet $facet "lctl set_param ${paramp}.threads_min=$((tmin + 1))"
+        do_facet $facet "lctl set_param ${paramp}.threads_max=$((tmax - 1))"
         tmin2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_min" || echo 0)
         tmax2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_max" || echo 0)
-        lassert 25 "$msg" '(($tmin2 == ($tmin - 1) && $tmax2 == ($tmax -10)))' || return $?
+        lassert 25 "$msg" '(($tmin2 == ($tmin + 1) && $tmax2 == ($tmax -1)))' || return $?
 
         # Check that we can set min/max to the same value
-        do_facet $facet "lctl set_param ${paramp}.threads_min=$tmin"
+        tmin=$(do_facet $facet "lctl get_param -n ${paramp}.threads_min" || echo 0)
         do_facet $facet "lctl set_param ${paramp}.threads_max=$tmin"
         tmin2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_min" || echo 0)
         tmax2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_max" || echo 0)
@@ -2325,7 +2554,7 @@ thread_sanity() {
         do_facet $facet "lctl set_param ${paramp}.threads_max=$((tmin - 1))"
         tmin2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_min" || echo 0)
         tmax2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_max" || echo 0)
-        lassert 27 "$msg" '(($tmin <= $tmax2))' || return $?
+        lassert 27 "$msg" '(($tmin2 <= $tmax2))' || return $?
 
         # We need to ensure that we get the module options desired; to do this
         # we set LOAD_MODULES_REMOTE=true and we call setmodopts below.
@@ -2366,37 +2595,20 @@ test_53b() {
 }
 run_test 53b "check MDT thread count params"
 
-if ! combined_mgs_mds ; then
-       stop mgs
-fi
-
-run_llverfs()
-{
-        local dir=$1
-        local partial_arg=""
-        local size=$(df -B G $dir | tail -1 | awk '{print $2}' | sed 's/G//') # Gb
-
-        # Run in partial (fast) mode if the size
-        # of a partition > 10 GB
-        [ $size -gt 10 ] && partial_arg="-p"
-
-        llverfs $partial_arg $dir
-}
-
 test_54a() {
-    do_rpc_nodes $(facet_host ost1) run_llverdev $(ostdevname 1)
+    do_rpc_nodes $(facet_host ost1) run_llverdev $(ostdevname 1) -p
     [ $? -eq 0 ] || error "llverdev failed!"
     reformat_and_config
 }
-run_test 54a "llverdev"
+run_test 54a "test llverdev and partial verify of device"
 
 test_54b() {
     setup
-    run_llverfs $MOUNT
+    run_llverfs $MOUNT -p
     [ $? -eq 0 ] || error "llverfs failed!"
     cleanup
 }
-run_test 54b "llverfs"
+run_test 54b "test llverfs and partial verify of filesystem"
 
 lov_objid_size()
 {
@@ -2409,7 +2621,7 @@ test_55() {
        local ostdev=$(ostdevname 1)
        local saved_opts=$OST_MKFS_OPTS
 
-       for i in 1023 2048
+       for i in 1023 2048
        do
                OST_MKFS_OPTS="$saved_opts --index $i"
                reformat
@@ -2445,15 +2657,58 @@ test_56() {
        mount_client $MOUNT || error "Unable to mount client"
        echo ok
        $LFS osts
+       [ -n "$ENABLE_QUOTA" ] && { $LFS quotacheck -ug $MOUNT || error "quotacheck has failed" ; }
        stopall
        reformat
 }
 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
+       do_facet ost1 "$TUNEFS --failnode=$NID `ostdevname 1`" || error "tunefs failed"
+       start_mgsmds
+       start_ost && error "OST registration from failnode should fail"
+       reformat
+}
+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
+       do_facet ost1 "$TUNEFS --servicenode=$NID `ostdevname 1`" || error "tunefs failed"
+       start_mgsmds
+       start_ost || error "OST registration from servicenode should not fail"
+       reformat
+}
+run_test 57b "initial registration from servicenode should not fail"
+
 count_osts() {
         do_facet mgs $LCTL get_param mgs.MGS.live.$FSNAME | grep OST | wc -l
 }
 
+test_58() { # bug 22658
+        [ "$FSTYPE" != "ldiskfs" ] && skip "not supported for $FSTYPE" && return
+       setup
+       mkdir -p $DIR/$tdir
+       createmany -o $DIR/$tdir/$tfile-%d 100
+       # make sure that OSTs do not cancel llog cookies before we unmount the MDS
+#define OBD_FAIL_OBD_LOG_CANCEL_NET      0x601
+       do_facet mds "lctl set_param fail_loc=0x601"
+       unlinkmany $DIR/$tdir/$tfile-%d 100
+       stop mds
+       local MNTDIR=$(facet_mntpt mds)
+       # remove all files from the OBJECTS dir
+       do_facet mds "mount -t ldiskfs $MDSDEV $MNTDIR"
+       do_facet mds "find $MNTDIR/OBJECTS -type f -delete"
+       do_facet mds "umount $MNTDIR"
+       # restart MDS with missing llog files
+       start_mds
+       do_facet mds "lctl set_param fail_loc=0"
+       reformat
+}
+run_test 58 "missing llog files must not prevent MDT from mounting"
+
 test_59() {
        start_mgsmds >> /dev/null
        local C1=$(count_osts)
@@ -2481,9 +2736,41 @@ test_59() {
        [ $C4 -eq 2 ] || error "OST2 writeconf should add log"
        stop_ost2 >> /dev/null
        cleanup_nocli >> /dev/null
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 59 "writeconf mount option"
 
+test_60() { # LU-471
+       add mds1 $MDS_MKFS_OPTS --mkfsoptions='\" -E stride=64 -O ^uninit_bg\"' --reformat $(mdsdevname 1)
+
+       dump=$(do_facet $SINGLEMDS dumpe2fs $(mdsdevname 1))
+       rc=${PIPESTATUS[0]}
+       [ $rc -eq 0 ] || error "dumpe2fs $(mdsdevname 1) failed"
+
+       # MDT default has dirdata feature
+       echo $dump | grep dirdata > /dev/null || error "dirdata is not set"
+       # we disable uninit_bg feature
+       echo $dump | grep uninit_bg > /dev/null && error "uninit_bg is set"
+       # we set stride extended options
+       echo $dump | grep stride > /dev/null || error "stride is not set"
+       reformat
+}
+run_test 60 "check mkfs.lustre --mkfsoptions -E -O options setting"
+
+if ! combined_mgs_mds ; then
+       stop mgs
+fi
+
 cleanup_gss
-equals_msg `basename $0`: test complete
-[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true
+
+# restore the ${facet}_MKFS_OPTS variables
+for facet in MGS MDS OST; do
+    opts=SAVED_${facet}_MKFS_OPTS
+    if [[ -n ${!opts} ]]; then
+        eval ${facet}_MKFS_OPTS=\"${!opts}\"
+    fi
+done
+
+complete $(basename $0) $SECONDS
+exit_status