Whamcloud - gitweb
b=17931
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
index b7bc13d..9a9b8fa 100644 (file)
@@ -11,13 +11,11 @@ set -e
 
 ONLY=${ONLY:-"$*"}
 
-# These tests don't apply to mountconf
-MOUNTCONFSKIP="10 11 12 13 13b 14 15"
-# bug number for skipped test: 13739 
-HEAD_EXCEPT="                  32a 32b "
+# bug number for skipped test: 13739
+HEAD_EXCEPT="                  32a"
 
 # bug number for skipped test:                                 
-ALWAYS_EXCEPT=" $CONF_SANITY_EXCEPT $MOUNTCONFSKIP $HEAD_EXCEPT"
+ALWAYS_EXCEPT=" $CONF_SANITY_EXCEPT $HEAD_EXCEPT"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
 SRCDIR=`dirname $0`
@@ -27,19 +25,23 @@ PTLDEBUG=${PTLDEBUG:--1}
 SAVE_PWD=$PWD
 LUSTRE=${LUSTRE:-`dirname $0`/..}
 RLUSTRE=${RLUSTRE:-$LUSTRE}
-MOUNTLUSTRE=${MOUNTLUSTRE:-/sbin/mount.lustre}
-MKFSLUSTRE=${MKFSLUSTRE:-/usr/sbin/mkfs.lustre}
-HOSTNAME=`hostname`
 
 . $LUSTRE/tests/test-framework.sh
 init_test_env $@
+# STORED_MDSSIZE is used in test_18
+if [ -n "$MDSSIZE" ]; then
+    STORED_MDSSIZE=$MDSSIZE
+fi
 # use small MDS + OST size to speed formatting time
 MDSSIZE=40000
 OSTSIZE=40000
-. ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
+. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
+
+remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
+remote_ost_nodsh && skip "remote OST with nodsh" && exit 0
 
 #
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="0 1 2 3 6 7 15 18 24b 25 30 31 32 33 34a "
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="0 1 2 3 6 7 15 18 24b 25 30 31 32 33 34a 45"
 
 assert_DIR
 
@@ -48,18 +50,20 @@ reformat() {
 }
 
 writeconf() {
-    local facet=mds
-    shift
-    stop ${facet} -f
-    rm -f ${facet}active
-    # who knows if/where $TUNEFS is installed?  Better reformat if it fails...
-    do_facet ${facet} "$TUNEFS --writeconf $MDSDEV" || echo "tunefs failed, reformatting instead" && reformat
+       local facet=$SINGLEMDS
+       local dev=${facet}_dev
+       shift
+       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}" || echo "tunefs failed, reformatting instead" && reformat
+
+       gen_config
 }
 
 gen_config() {
-        reformat
-        # The MGS must be started before the OSTs for a new fs, so start
-        # and stop to generate the startup logs. 
+       # The MGS must be started before the OSTs for a new fs, so start
+       # and stop to generate the startup logs. 
        start_mds
        start_ost
        sleep 5
@@ -67,15 +71,24 @@ gen_config() {
        stop_mds
 }
 
+reformat_and_config() {
+       reformat
+       gen_config
+}
+
 start_mds() {
-       echo "start mds service on `facet_active_host mds`"
-       start mds $MDSDEV $MDS_MOUNT_OPTS || return 94
+       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")
+       local dev=$(mdsdevname $num)
+       echo "start mds service on `facet_active_host $facet`"
+       start $facet ${dev} $MDS_MOUNT_OPTS || return 94
 }
 
 stop_mds() {
-       echo "stop mds service on `facet_active_host mds`"
+       echo "stop mds service on `facet_active_host $SINGLEMDS`"
        # These tests all use non-failover stop
-       stop mds -f  || return 97
+       stop $SINGLEMDS -f  || return 97
 }
 
 start_ost() {
@@ -122,8 +135,12 @@ umount_client() {
 }
 
 manual_umount_client(){
+       local rc
+       local FORCE=$1
        echo "manual umount lustre on ${MOUNT}...."
-       do_facet client "umount -d $MOUNT"
+       do_facet client "umount -d ${FORCE} $MOUNT"
+       rc=$?
+       return $rc
 }
 
 setup() {
@@ -132,6 +149,12 @@ setup() {
        mount_client $MOUNT
 }
 
+setup_noconfig() {
+       start_mds
+       start_ost
+       mount_client $MOUNT
+}
+
 cleanup_nocli() {
        stop_mds || return 201
        stop_ost || return 202
@@ -172,11 +195,11 @@ if [ "$ONLY" == "cleanup" ]; then
        exit
 fi
 
-#create single point mountpoint
+init_gss
 
-gen_config
+#create single point mountpoint
 
-init_gss
+reformat_and_config
 
 test_0() {
         setup
@@ -196,7 +219,7 @@ run_test 1 "start up ost twice (should return errors)"
 
 test_2() {
        start_ost
-       start_mds       
+       start_mds
        echo "start mds second time.."
        start_mds
        mount_client $MOUNT
@@ -283,7 +306,7 @@ test_5b() {
        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
-       umount_client $MOUNT    
+       umount_client $MOUNT
        # stop_mds is a no-op here, and should not fail
        cleanup_nocli || return $?
        return 0
@@ -363,7 +386,9 @@ test_9() {
        do_facet ost1 lctl set_param subsystem_debug=\'mds ost\' || return 1
 
         CHECK_PTLDEBUG="`do_facet ost1 lctl get_param -n debug`"
-        if [ "$CHECK_PTLDEBUG" ] && [ "$CHECK_PTLDEBUG" = "trace inode" ];then
+        if [ "$CHECK_PTLDEBUG" ] && { \
+          [ "$CHECK_PTLDEBUG" = "trace inode warning error emerg console" ] ||
+          [ "$CHECK_PTLDEBUG" = "trace inode" ]; }; then   
            echo "lnet.debug success"
         else
            echo "lnet.debug: want 'trace inode', have '$CHECK_PTLDEBUG'"
@@ -381,263 +406,11 @@ test_9() {
 
 run_test 9 "test ptldebug and subsystem for mkfs"
 
-test_10() {
-        echo "generate configuration with the same name for node and mds"
-        OLDXMLCONFIG=$XMLCONFIG
-        XMLCONFIG="broken.xml"
-        [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
-        facet="mds"
-        rm -f ${facet}active
-        add_facet $facet
-        echo "the name for node and mds is the same"
-        do_lmc --add mds --node ${facet}_facet --mds ${facet}_facet \
-            --dev $MDSDEV --size $MDSSIZE || return $?
-        do_lmc --add lov --mds ${facet}_facet --lov lov1 --stripe_sz \
-            $STRIPE_BYTES --stripe_cnt $STRIPES_PER_OBJ \
-            --stripe_pattern 0 || return $?
-        add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
-        facet="client"
-        add_facet $facet --lustre_upcall $UPCALL
-        do_lmc --add mtpt --node ${facet}_facet --mds mds_facet \
-            --lov lov1 --path $MOUNT
-
-        echo "mount lustre"
-        start_ost
-        start_mds
-        mount_client $MOUNT
-        check_mount || return 41
-        cleanup || return $?
-
-        echo "Success!"
-        XMLCONFIG=$OLDXMLCONFIG
-}
-run_test 10 "mount lustre with the same name for node and mds"
-
-test_11() {
-        OLDXMLCONFIG=$XMLCONFIG
-        XMLCONFIG="conf11.xml"
-
-        [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
-        add_mds mds --dev $MDSDEV --size $MDSSIZE
-        add_ost ost --dev $OSTDEV --size $OSTSIZE
-        add_client client mds --path $MOUNT --ost ost_svc || return $?
-        echo "Default lov config success!"
-
-        [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
-        add_mds mds --dev $MDSDEV --size $MDSSIZE
-        add_ost ost --dev $OSTDEV --size $OSTSIZE
-        add_client client mds --path $MOUNT && return $?
-        echo "--add mtpt with neither --lov nor --ost will return error"
-
-        echo ""
-        echo "Success!"
-        XMLCONFIG=$OLDXMLCONFIG
-}
-run_test 11 "use default lov configuration (should return error)"
-
-test_12() {
-        OLDXMLCONFIG=$XMLCONFIG
-        XMLCONFIG="batch.xml"
-        BATCHFILE="batchfile"
-
-        # test double quote
-        [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
-        [ -f "$BATCHFILE" ] && rm -f $BATCHFILE
-        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
-        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \"-I 128\"" >> $BATCHFILE
-        # --mkfsoptions "-I 128"
-        do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
-        if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
-                echo "matched double quote success"
-        else
-                echo "matched double quote fail"
-                return 1
-        fi
-        rm -f $XMLCONFIG
-        rm -f $BATCHFILE
-        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
-        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \"-I 128" >> $BATCHFILE
-        # --mkfsoptions "-I 128
-        do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
-        echo "unmatched double quote should return error"
-
-        # test single quote
-        rm -f $BATCHFILE
-        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
-        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions '-I 128'" >> $BATCHFILE
-        # --mkfsoptions '-I 128'
-        do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
-        if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
-                echo "matched single quote success"
-        else
-                echo "matched single quote fail"
-                return 1
-        fi
-        rm -f $XMLCONFIG
-        rm -f $BATCHFILE
-        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
-        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions '-I 128" >> $BATCHFILE
-        # --mkfsoptions '-I 128
-        do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
-        echo "unmatched single quote should return error"
-
-        # test backslash
-        rm -f $BATCHFILE
-        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
-        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \-\I\ \128" >> $BATCHFILE
-        # --mkfsoptions \-\I\ \128
-        do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
-        if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
-                echo "backslash followed by a whitespace/letter success"
-        else
-                echo "backslash followed by a whitespace/letter fail"
-                return 1
-        fi
-        rm -f $XMLCONFIG
-        rm -f $BATCHFILE
-        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
-        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions -I\ 128\\" >> $BATCHFILE
-        # --mkfsoptions -I\ 128\
-        do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
-        echo "backslash followed by nothing should return error"
-
-        rm -f $BATCHFILE
-        XMLCONFIG=$OLDXMLCONFIG
-}
-run_test 12 "lmc --batch, with single/double quote, backslash in batchfile"
-
-test_13a() {   # was test_13
-        OLDXMLCONFIG=$XMLCONFIG
-        XMLCONFIG="conf13-1.xml"
-
-        # check long uuid will be truncated properly and uniquely
-        echo "To generate XML configuration file(with long ost name): $XMLCONFIG"
-        [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
-        do_lmc --add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp
-        do_lmc --add mds --node $HOSTNAME --mds mds1_name_longer_than_31characters
-        do_lmc --add mds --node $HOSTNAME --mds mds2_name_longer_than_31characters
-        if [ ! -f "$XMLCONFIG" ]; then
-                echo "Error:no file $XMLCONFIG created!"
-                return 1
-        fi
-        EXPECTEDMDS1UUID="e_longer_than_31characters_UUID"
-        EXPECTEDMDS2UUID="longer_than_31characters_UUID_2"
-        FOUNDMDS1UUID=`awk -F"'" '/<mds .*uuid=/' $XMLCONFIG | sed -n '1p' \
-                       | sed "s/ /\n\r/g" | awk -F"'" '/uuid=/{print $2}'`
-        FOUNDMDS2UUID=`awk -F"'" '/<mds .*uuid=/' $XMLCONFIG | sed -n '2p' \
-                       | sed "s/ /\n\r/g" | awk -F"'" '/uuid=/{print $2}'`
-       [ -z "$FOUNDMDS1UUID" ] && echo "MDS1 UUID empty" && return 1
-       [ -z "$FOUNDMDS2UUID" ] && echo "MDS2 UUID empty" && return 1
-        if ([ $EXPECTEDMDS1UUID = $FOUNDMDS1UUID ] && [ $EXPECTEDMDS2UUID = $FOUNDMDS2UUID ]) || \
-           ([ $EXPECTEDMDS1UUID = $FOUNDMDS2UUID ] && [ $EXPECTEDMDS2UUID = $FOUNDMDS1UUID ]); then
-                echo "Success:long uuid truncated successfully and being unique."
-        else
-                echo "Error:expected uuid for mds1 and mds2: $EXPECTEDMDS1UUID; $EXPECTEDMDS2UUID"
-                echo "but:     found uuid for mds1 and mds2: $FOUNDMDS1UUID; $FOUNDMDS2UUID"
-                return 1
-        fi
-        rm -f $XMLCONFIG
-        XMLCONFIG=$OLDXMLCONFIG
-}
-run_test 13a "check new_uuid of lmc operating correctly"
-
-test_13b() {
-        OLDXMLCONFIG=$XMLCONFIG
-        XMLCONFIG="conf13-1.xml"
-        SECONDXMLCONFIG="conf13-2.xml"
-        # check multiple invocations for lmc generate same XML configuration file
-        rm -f $XMLCONFIG
-        echo "Generate the first XML configuration file"
-        gen_config
-        echo "mv $XMLCONFIG to $SECONDXMLCONFIG"
-        sed -e "s/mtime[^ ]*//" $XMLCONFIG > $SECONDXMLCONFIG || return $?
-        echo "Generate the second XML configuration file"
-        gen_config
-       # don't compare .xml mtime, it will always be different
-        if [ `sed -e "s/mtime[^ ]*//" $XMLCONFIG | diff - $SECONDXMLCONFIG | wc -l` -eq 0 ]; then
-                echo "Success:multiple invocations for lmc generate same XML file"
-        else
-                echo "Error: multiple invocations for lmc generate different XML file"
-                return 1
-        fi
-
-        rm -f $XMLCONFIG $SECONDXMLCONFIG
-        XMLCONFIG=$OLDXMLCONFIG
-}
-run_test 13b "check lmc generates consistent .xml file"
-
-test_14() {
-        rm -f $XMLCONFIG
-
-        # create xml file with --mkfsoptions for ost
-        echo "create xml file with --mkfsoptions for ost"
-        add_mds mds --dev $MDSDEV --size $MDSSIZE
-        add_lov lov1 mds --stripe_sz $STRIPE_BYTES\
-            --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
-        add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE \
-            --mkfsoptions "-Llabel_conf_14"
-        add_client client mds --lov lov1 --path $MOUNT
-
-        FOUNDSTRING=`awk -F"<" '/<mkfsoptions>/{print $2}' $XMLCONFIG`
-        EXPECTEDSTRING="mkfsoptions>-Llabel_conf_14"
-        if [ "$EXPECTEDSTRING" != "$FOUNDSTRING" ]; then
-                echo "Error: expected: $EXPECTEDSTRING; found: $FOUNDSTRING"
-                return 1
-        fi
-        echo "Success:mkfsoptions for ost written to xml file correctly."
-
-        # mount lustre to test lconf mkfsoptions-parsing
-        echo "mount lustre"
-        start_ost
-        start_mds
-        mount_client $MOUNT || return $?
-        if [ -z "`do_facet ost1 dumpe2fs -h $OSTDEV | grep label_conf_14`" ]; then
-                echo "Error: the mkoptions not applied to mke2fs of ost."
-                return 1
-        fi
-        cleanup
-        echo "lconf mkfsoptions for ost success"
-
-        gen_config
-}
-run_test 14 "test mkfsoptions of ost for lmc and lconf"
-
-cleanup_15() {
-       trap 0
-       [ -f $MOUNTLUSTRE ] && echo "remove $MOUNTLUSTRE" && rm -f $MOUNTLUSTRE
-       if [ -f $MOUNTLUSTRE.sav ]; then
-               echo "return original $MOUNTLUSTRE.sav to $MOUNTLUSTRE"
-               mv $MOUNTLUSTRE.sav $MOUNTLUSTRE
-       fi
-}
-
-# this only tests the kernel mount command, not anything about lustre.
-test_15() {
-        MOUNTLUSTRE=${MOUNTLUSTRE:-/sbin/mount.lustre}
-       start_ost
-       start_mds
-
-       echo "mount lustre on ${MOUNT} without $MOUNTLUSTRE....."
-       if [ -f "$MOUNTLUSTRE" ]; then
-               echo "save $MOUNTLUSTRE to $MOUNTLUSTRE.sav"
-               mv $MOUNTLUSTRE $MOUNTLUSTRE.sav && trap cleanup_15 EXIT INT
-               if [ -f $MOUNTLUSTRE ]; then
-                       skip "$MOUNTLUSTRE cannot be moved, skipping test"
-                       return 0
-               fi
-       fi
-
-       mount_client $MOUNT && error "mount succeeded" && return 1
-       echo "mount lustre on $MOUNT without $MOUNTLUSTRE failed as expected"
-       cleanup_15
-       cleanup || return $?
-}
-run_test 15 "zconf-mount without /sbin/mount.lustre (should return error)"
-
 # LOGS/PENDING do not exist anymore since CMD3
 test_16() {
-        TMPMTPT="${TMP}/conf16"
-
+        local TMPMTPT="${TMP}/conf16"
+        local dev=${SINGLEMDS}_dev
+        local MDSDEV=${!dev}
         if [ ! -e "$MDSDEV" ]; then
             log "no $MDSDEV existing, so mount Lustre to create one"
            setup
@@ -648,7 +421,7 @@ test_16() {
         [ -f "$MDSDEV" ] && LOOPOPT="-o loop"
 
         log "change the mode of $MDSDEV/OBJECTS to 555"
-        do_facet mds "mkdir -p $TMPMTPT &&
+        do_facet $SINGLEMDS "mkdir -p $TMPMTPT &&
                       mount $LOOPOPT -t $FSTYPE $MDSDEV $TMPMTPT &&
                       chmod 555 $TMPMTPT/OBJECTS &&
                       umount $TMPMTPT" || return $?
@@ -659,7 +432,7 @@ test_16() {
         cleanup || return $?
 
         log "read the mode of OBJECTS and check if they has been changed properly"
-        EXPECTEDOBJECTSMODE=`do_facet mds "debugfs -R 'stat OBJECTS' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
+        EXPECTEDOBJECTSMODE=`do_facet $SINGLEMDS "$DEBUGFS -R 'stat OBJECTS' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
 
         if [ "$EXPECTEDOBJECTSMODE" = "0777" ]; then
                 log "Success:Lustre change the mode of OBJECTS correctly"
@@ -670,6 +443,9 @@ test_16() {
 run_test 16 "verify that lustre will correct the mode of OBJECTS"
 
 test_17() {
+        local dev=${SINGLEMDS}_dev
+        local MDSDEV=${!dev}
+
         if [ ! -e "$MDSDEV" ]; then
             echo "no $MDSDEV existing, so mount Lustre to create one"
            setup
@@ -678,29 +454,60 @@ test_17() {
         fi
 
         echo "Remove mds config log"
-        do_facet mds "debugfs -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MDSDEV || return \$?" || return $?
+        do_facet $SINGLEMDS "$DEBUGFS -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MDSDEV || return \$?" || return $?
 
         start_ost
        start_mds && return 42
-       gen_config
+       reformat_and_config
 }
 run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)"
 
 test_18() {
-        [ -f $MDSDEV ] && echo "remove $MDSDEV" && rm -f $MDSDEV
+        [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return
+
+        local dev=${SINGLEMDS}_dev
+        local MDSDEV=${!dev}
+
+        local MIN=2000000
+
+        local OK=
+        # check if current MDSSIZE is large enough
+        [ $MDSSIZE -ge $MIN ] && OK=1 && myMDSSIZE=$MDSSIZE && \
+                log "use MDSSIZE=$MDSSIZE"
+
+        # check if the global config has a large enough MDSSIZE
+        [ -z "$OK" -a ! -z "$STORED_MDSSIZE" ] && [ $STORED_MDSSIZE -ge $MIN ] && \
+                OK=1 && myMDSSIZE=$STORED_MDSSIZE && \
+                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 && \
+                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 && \
+                        log "use file $MDSDEV with MIN=$MIN"
+
+        [ -z "$OK" ] && skip "$MDSDEV too small for ${MIN}kB MDS" && return
+
+
         echo "mount mds with large journal..."
-        local myMDSSIZE=2000000
-        OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS
+        local OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS
 
         MDS_MKFS_OPTS="--mgs --mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT"
 
-        gen_config
+        reformat_and_config
         echo "mount lustre system..."
        setup
         check_mount || return 41
 
         echo "check journal size..."
-        FOUNDSIZE=`do_facet mds "debugfs -c -R 'stat <8>' $MDSDEV" | awk '/Size: / { print $NF; exit;}'`
+        local FOUNDSIZE=`do_facet mds "$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
@@ -710,7 +517,7 @@ test_18() {
         cleanup || return $?
 
         MDS_MKFS_OPTS=$OLD_MDS_MKFS_OPTS
-        gen_config
+        reformat_and_config
 }
 run_test 18 "check mkfs creates large journals"
 
@@ -770,20 +577,19 @@ test_21c() {
        stop_ost
        stop_ost2
        stop_mds
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 21c "start mds between two osts, stop mds last"
 
 test_22() {
-       #reformat to remove all logs
-       reformat
        start_mds
-       echo Client mount before any osts are in the logs
-       mount_client $MOUNT
-       check_mount && return 41
-       pass
 
        echo Client mount with ost in logs, but none running
        start_ost
+       # wait until mds connected to ost and open client connection
+       # ping_interval + 1
+       sleep $((TIMEOUT / 4 + 1))
        stop_ost
        mount_client $MOUNT
        # check_mount will block trying to contact ost
@@ -811,7 +617,7 @@ run_test 22 "start a client before osts (should return errs)"
 test_23a() {   # was test_23
         setup
         # fail mds
-       stop mds   
+       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
@@ -926,7 +732,7 @@ test_24a() {
        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 }')
+       MDS=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
        [ -z "$MDS" ] && error "No MDT" && return 8
        cleanup_24a
        cleanup_nocli || return 6
@@ -960,9 +766,9 @@ run_test 25 "Verify modules are referenced"
 test_26() {
     load_modules
     # we need modules before mount for sysctl, so make sure...
-    do_facet mds "lsmod | grep -q lustre || modprobe lustre"
+    do_facet $SINGLEMDS "lsmod | grep -q lustre || modprobe lustre"
 #define OBD_FAIL_MDS_FS_SETUP            0x135
-    do_facet mds "lctl set_param fail_loc=0x80000135"
+    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)
@@ -983,24 +789,9 @@ set_and_check() {
            FINAL=$(($ORIG + 5))
        fi
        echo "Setting $PARAM from $ORIG to $FINAL"
-       do_facet mds "$LCTL conf_param $PARAM=$FINAL" || error conf_param failed
-       local RESULT
-       local MAX=90
-       local WAIT=0
-       while [ 1 ]; do
-           sleep 5
-           RESULT=$(do_facet $myfacet "$TEST") 
-           if [ $RESULT -eq $FINAL ]; then
-               echo "Updated config after $WAIT sec (got $RESULT)"
-               break
-           fi
-           WAIT=$((WAIT + 5))
-           if [ $WAIT -eq $MAX ]; then
-               echo "Config update not seen: wanted $FINAL got $RESULT"
-               return 3
-           fi
-           echo "Waiting $(($MAX - $WAIT)) secs for config update" 
-       done
+       do_facet $SINGLEMDS "$LCTL conf_param $PARAM='$FINAL'" || error conf_param failed
+
+       wait_update $(facet_host $myfacet) "$TEST" "$FINAL" || error check failed!
 }
 
 test_27a() {
@@ -1014,10 +805,14 @@ test_27a() {
 run_test 27a "Reacquire MGS lock if OST started first"
 
 test_27b() {
+       # FIXME. ~grev
         setup
-       facet_failover mds
-       set_and_check mds "lctl get_param -n mdt.$FSNAME-MDT0000.identity_acquire_expire" "$FSNAME-MDT0000.mdt.identity_acquire_expire" || return 3
-       set_and_check client "lctl get_param -n mdc.$FSNAME-MDT0000-mdc-*.max_rpcs_in_flight" "$FSNAME-MDT0000.mdc.max_rpcs_in_flight" || return 4
+        local device=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }')
+
+       facet_failover $SINGLEMDS
+       set_and_check $SINGLEMDS "lctl get_param -n mdt.$device.identity_acquire_expire" "$device.mdt.identity_acquire_expire" || return 3
+       set_and_check client "lctl get_param -n mdc.$device-mdc-*.max_rpcs_in_flight" "$device.mdc.max_rpcs_in_flight" || return 4
+       check_mount
        cleanup
 }
 run_test 27b "Reacquire MGS lock after failover"
@@ -1025,11 +820,12 @@ run_test 27b "Reacquire MGS lock after failover"
 test_28() {
         setup
        TEST="lctl get_param -n llite.$FSNAME-*.max_read_ahead_whole_mb"
-       ORIG=$($TEST) 
-       declare -i FINAL
-       FINAL=$(($ORIG + 10))
-       set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" || return 3
-       set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" || return 3
+       PARAM="$FSNAME.llite.max_read_ahead_whole_mb"
+       ORIG=$($TEST)
+       FINAL=$(($ORIG + 1))
+       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
        mount_client $MOUNT
        RESULT=$($TEST)
@@ -1039,6 +835,7 @@ test_28() {
        else
            echo "New config success: got $RESULT"
        fi
+       set_and_check client "$TEST" "$PARAM" $ORIG || return 5
        cleanup
 }
 run_test 28 "permanent parameter setting"
@@ -1071,7 +868,7 @@ test_29() {
        local WAIT=0
        while [ 1 ]; do
            sleep 5
-           RESULT=`do_facet mds " lctl get_param -n $MPROC"`
+           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)"
@@ -1104,9 +901,6 @@ test_29() {
        cleanup_nocli
        #writeconf to remove all ost2 traces for subsequent tests
        writeconf
-       start_mds
-       start_ost
-       cleanup
 }
 run_test 29 "permanently remove an OST"
 
@@ -1114,8 +908,9 @@ test_30() {
        setup
 
        TEST="lctl get_param -n llite.$FSNAME-*.max_read_ahead_whole_mb"
-       ORIG=$($TEST) 
-       for i in $(seq 1 20); do 
+       ORIG=$($TEST)
+       LIST=(1 2 3 4 5 4 3 2 1 2 3 4 5 4 3 2 1 2 3 4 5)
+       for i in ${LIST[@]}; do
            set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" $i || return 3
        done
        # make sure client restart still works 
@@ -1134,35 +929,76 @@ test_31() { # bug 10734
 }
 run_test 31 "Connect to non-existent node (shouldn't crash)"
 
+# Use these start32/stop32 fn instead of t-f start/stop fn,
+# for local devices, to skip global facet vars init 
+stop32 () {
+       local facet=$1
+       shift
+       echo "Stopping local ${MOUNT%/*}/${facet} (opts:$@)"
+       umount -d $@ ${MOUNT%/*}/${facet}
+       losetup -a
+}
+
+start32 () {
+       local facet=$1
+       shift
+       local device=$1
+       shift
+       mkdir -p ${MOUNT%/*}/${facet}
+
+       echo "Starting local ${facet}: $@ $device ${MOUNT%/*}/${facet}"
+       mount -t lustre $@ ${device} ${MOUNT%/*}/${facet}
+       RC=$?
+       if [ $RC -ne 0 ]; then
+               echo "mount -t lustre $@ ${device} ${MOUNT%/*}/${facet}"
+               echo "Start of ${device} of local ${facet} failed ${RC}"
+       fi 
+       losetup -a
+       return $RC
+}
+
+cleanup_nocli32 () {
+       stop32 mds1 -f
+       stop32 ost1 -f
+       wait_exit_ST client
+}
+
+cleanup_32() {
+       trap 0
+       echo "Cleanup test_32 umount $MOUNT ..."
+       umount -f $MOUNT || true
+       echo "Cleanup local mds ost1 ..."
+       cleanup_nocli32
+       unload_modules
+}
+
 test_32a() {
-        # XXX - make this run on client-only systems with real hardware on
-        #       the OST and MDT
-        #       there appears to be a lot of assumption here about loopback
-        #       devices
-        # or maybe this test is just totally useless on a client-only system
+       # this test is totally useless on a client-only system
+       [ -n "$CLIENTONLY" -o -n "$CLIENTMODSONLY" ] && skip "client only testing" && return 0
        [ "$NETTYPE" = "tcp" ] || { skip "NETTYPE != tcp" && return 0; }
-       [ "$mds_HOST" = "`hostname`" ] || { skip "remote MDS" && return 0; }
-       [ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] || \
-               { skip "remote OST" && return 0; }
+       [ -z "$TUNEFS" ] && skip "No tunefs" && return 0
+       local DISK1_8=$LUSTRE/tests/disk1_8.tgz
+       [ ! -r $DISK1_8 ] && skip "Cannot find $DISK1_8" && return 0
 
-        [ -z "$TUNEFS" ] && skip "No tunefs" && return
-       local DISK1_4=$LUSTRE/tests/disk1_4.zip
-       [ ! -r $DISK1_4 ] && skip "Cant find $DISK1_4, skipping" && return
+       mkdir -p $TMP/$tdir
+       tar xjvf $DISK1_8 -C $TMP/$tdir || \
+               { skip "Cannot untar $DISK1_8" && return 0; }
 
-       local tmpdir=$TMP/conf32a
-       unzip -o -j -d $tmpdir $DISK1_4 || { skip "Cant unzip $DISK1_4, skipping" && return ; }
        load_modules
        lctl set_param debug=$PTLDEBUG
 
        $TUNEFS $tmpdir/mds || error "tunefs failed"
+
        # nids are wrong, so client wont work, but server should start
-       start mds $tmpdir/mds "-o loop,exclude=lustre-OST0000" || return 3
-        local UUID=$(lctl get_param -n mdt.lustre-MDT0000.uuid)
+       start32 mds $tmpdir/mds "-o loop,exclude=lustre-OST0000" && \
+               trap cleanup_32 EXIT INT || return 3
+       
+       local UUID=$(lctl get_param -n mds.lustre-MDT0000.uuid)
        echo MDS uuid $UUID
        [ "$UUID" == "mdsA_UUID" ] || error "UUID is wrong: $UUID" 
 
        $TUNEFS --mgsnode=`hostname` $tmpdir/ost1 || error "tunefs failed"
-       start ost1 $tmpdir/ost1 "-o loop" || return 5
+       start32 ost1 $tmpdir/ost1 "-o loop" || return 5
        UUID=$(lctl get_param -n obdfilter.lustre-OST0000.uuid)
        echo OST uuid $UUID
        [ "$UUID" == "ost1_UUID" ] || error "UUID is wrong: $UUID" 
@@ -1180,61 +1016,62 @@ test_32a() {
 
        # With a new good MDT failover nid, we should be able to mount a client
        # (but it cant talk to OST)
-        local OLDMOUNTOPT=$MOUNTOPT
-        MOUNTOPT="exclude=lustre-OST0000"
-       mount_client $MOUNT
-        MOUNTOPT=$OLDMOUNTOPT
-       set_and_check client "lctl get_param -n mdc.*.max_rpcs_in_flight" "lustre-MDT0000.mdc.max_rpcs_in_flight" ||
-               return 11
+       local mountopt="-o exclude=lustre-OST0000"
 
-       zconf_umount `hostname` $MOUNT -f
-       cleanup_nocli
-       load_modules
+       local device=`h2$NETTYPE $HOSTNAME`:/lustre
+       echo "Starting local client: $HOSTNAME: $mountopt $device $MOUNT"
+       mount -t lustre $mountopt $device $MOUNT || return 1
+
+       local old=$(lctl get_param -n mdc.*.max_rpcs_in_flight)
+       local new=$((old + 5))
+       lctl conf_param lustre-MDT0000.mdc.max_rpcs_in_flight=$new
+       wait_update $HOSTNAME "lctl get_param -n mdc.*.max_rpcs_in_flight" $new || return 11
 
-        # mount a second time to make sure we didnt leave upgrade flag on
+       cleanup_32
+
+       # mount a second time to make sure we didnt leave upgrade flag on
        load_modules
        $TUNEFS --dryrun $tmpdir/mds || error "tunefs failed"
-       load_modules
-       start mds $tmpdir/mds "-o loop,exclude=lustre-OST0000" || return 12
-       cleanup_nocli
+       start32 mds $tmpdir/mds "-o loop,exclude=lustre-OST0000" && \
+               trap cleanup_32 EXIT INT || return 12
 
-       [ -d $tmpdir ] && rm -rf $tmpdir
+       cleanup_32
+
+       rm -rf $tmpdir || true  # true is only for TMP on NFS
 }
-run_test 32a "Upgrade from 1.4 (not live)"
+run_test 32a "Upgrade from 1.8 (not live)"
 
 test_32b() {
-        # XXX - make this run on client-only systems with real hardware on
-        #       the OST and MDT
-        #       there appears to be a lot of assumption here about loopback
-        #       devices
-        # or maybe this test is just totally useless on a client-only system
-        [ "$NETTYPE" = "tcp" ] || { skip "NETTYPE != tcp" && return 0; }
-        [ "$mds_HOST" = "`hostname`" ] || { skip "remote MDS" && return 0; }
-        [ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] || \
-               { skip "remote OST" && return 0; }
+       # this test is totally useless on a client-only system
+       [ -n "$CLIENTONLY" -o -n "$CLIENTMODSONLY" ] && skip "client only testing" && return 0
+       [ "$NETTYPE" = "tcp" ] || { skip "NETTYPE != tcp" && return 0; }
+       [ -z "$TUNEFS" ] && skip "No tunefs" && return
 
-        [ -z "$TUNEFS" ] && skip "No tunefs" && return
-       local DISK1_4=$LUSTRE/tests/disk1_4.zip
-       [ ! -r $DISK1_4 ] && skip "Cant find $DISK1_4, skipping" && return
+       local DISK1_8=$LUSTRE/tests/disk1_8.tar.bz2
+       [ ! -r $DISK1_8 ] && skip "Cannot find $DISK1_8" && return 0
+       local tmpdir=$TMP/$tdir
+       mkdir -p $tmpdir
+       tar xjvf $DISK1_8 -C $tmpdir || \
+               { skip "Cannot untar $DISK1_8" && return ; }
 
-       local tmpdir=$TMP/conf32b
-       unzip -o -j -d $tmpdir $DISK1_4 || { skip "Cant unzip $DISK1_4, skipping" && return ; }
        load_modules
        lctl set_param debug=$PTLDEBUG
-       NEWNAME=sofia
+       local NEWNAME=lustre
 
        # writeconf will cause servers to register with their current nids
        $TUNEFS --writeconf --fsname=$NEWNAME $tmpdir/mds || error "tunefs failed"
-       start mds $tmpdir/mds "-o loop" || return 3
+       start32 mds1 $tmpdir/mds "-o loop" && \
+               trap cleanup_32 EXIT INT || return 3
+
        local UUID=$(lctl get_param -n mdt.${NEWNAME}-MDT0000.uuid)
        echo MDS uuid $UUID
-       [ "$UUID" == "mdsA_UUID" ] || error "UUID is wrong: $UUID" 
+       [ "$UUID" == "${NEWNAME}-MDT0000_UUID" ] || error "UUID is wrong: $UUID" 
 
-       $TUNEFS --mgsnode=`hostname` --fsname=$NEWNAME --writeconf $tmpdir/ost1 || error "tunefs failed"
-       start ost1 $tmpdir/ost1 "-o loop" || return 5
+       $TUNEFS --mgsnode=`hostname` --writeconf --fsname=$NEWNAME $tmpdir/ost1 || error "tunefs failed"
+       start32 ost1 $tmpdir/ost1 "-o loop" || return 5
        UUID=$(lctl get_param -n obdfilter.${NEWNAME}-OST0000.uuid)
        echo OST uuid $UUID
-       [ "$UUID" == "ost1_UUID" ] || error "UUID is wrong: $UUID"
+       [ "$UUID" == "${NEWNAME}-OST0000_UUID" ] || error "UUID is wrong: $UUID"
 
        echo "OSC changes should succeed:" 
        $LCTL conf_param ${NEWNAME}-OST0000.osc.max_dirty_mb=15 || return 7
@@ -1247,18 +1084,24 @@ test_32b() {
        # MDT and OST should have registered with new nids, so we should have
        # a fully-functioning client
        echo "Check client and old fs contents"
-       OLDFS=$FSNAME
-       FSNAME=$NEWNAME
-       mount_client $MOUNT
-       FSNAME=$OLDFS
-       set_and_check client "lctl get_param -n mdc.*.max_rpcs_in_flight" "${NEWNAME}-MDT0000.mdc.max_rpcs_in_flight" || return 11
-       [ "$(cksum $MOUNT/passwd | cut -d' ' -f 1,2)" == "2479747619 779" ] || return 12  
+
+       local device=`h2$NETTYPE $HOSTNAME`:/$NEWNAME
+       echo "Starting local client: $HOSTNAME: $device $MOUNT"
+       mount -t lustre $device $MOUNT || return 1
+
+       local old=$(lctl get_param -n mdc.*.max_rpcs_in_flight)
+       local new=$((old + 5))
+       lctl conf_param ${NEWNAME}-MDT0000.mdc.max_rpcs_in_flight=$new
+       wait_update $HOSTNAME "lctl get_param -n mdc.*.max_rpcs_in_flight" $new || return 11
+
+       [ "$(cksum $MOUNT/passwd | cut -d' ' -f 1,2)" == "94306271 1478" ] || return 12
        echo "ok."
 
-       cleanup
-       [ -d $tmpdir ] && rm -rf $tmpdir
+       cleanup_32
+
+       rm -rf $tmpdir || true  # true is only for TMP on NFS
 }
-run_test 32b "Upgrade from 1.4 with writeconf"
+run_test 32b "Upgrade from 1.8 with writeconf"
 
 test_33a() { # bug 12333, was test_33
         local rc=0
@@ -1272,16 +1115,19 @@ test_33a() { # bug 12333, was test_33
 
         local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
         local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
-        add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME2} --reformat $fs2mdsdev || exit 10
+        add fs2mds $MDS_MKFS_OPTS --mkfsoptions='\"-J size=8\"' --fsname=${FSNAME2} --reformat $fs2mdsdev || exit 10
         add fs2ost $OST_MKFS_OPTS --fsname=${FSNAME2} --index=8191 --mgsnode=$MGSNID --reformat $fs2ostdev || exit 10
 
         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_24a EXIT INT
         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
-        do_facet mds "$LCTL conf_param $FSNAME2.sys.timeout=200" || rc=1
+        do_facet $SINGLEMDS "$LCTL conf_param $FSNAME2.sys.timeout=200" || rc=1
         mkdir -p $MOUNT2
         mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || rc=2
         echo "ok."
 
+        cp /etc/hosts $MOUNT2/ || rc=3 
+        $LFS getstripe $MOUNT2/hosts
+
         umount -d $MOUNT2
         stop fs2ost -f
         stop fs2mds -f
@@ -1331,7 +1177,7 @@ test_34b() {
        fi
 
        cleanup
-       return 0        
+       return 0
 }
 run_test 34b "force umount with failed mds should be normal"
 
@@ -1347,7 +1193,7 @@ test_34c() {
        fi
 
        cleanup
-       return 0        
+       return 0
 }
 run_test 34c "force umount with failed ost should be normal"
 
@@ -1359,7 +1205,8 @@ test_35() { # bug 12459
 
        log "Set up a fake failnode for the MDS"
        FAKENID="127.0.0.2"
-       do_facet mds $LCTL conf_param ${FSNAME}-MDT0000.failover.node=$FAKENID || return 4
+       local device=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
+       do_facet $SINGLEMDS $LCTL conf_param ${device}.failover.node=$FAKENID || return 4
 
        log "Wait for RECONNECT_INTERVAL seconds (10s)"
        sleep 10
@@ -1383,7 +1230,7 @@ test_35() { # bug 12459
        # contact after the connection loss
        $LCTL dk $TMP/lustre-log-$TESTNAME.log
        NEXTCONN=`awk "/${MSG}/ {start = 1;}
-                      /import_select_connection.*${FSNAME}-MDT0000-mdc.* using connection/ {
+                      /import_select_connection.*$device-mdc.* using connection/ {
                                if (start) {
                                        if (\\\$NF ~ /$FAKENID/)
                                                print \\\$NF;
@@ -1512,10 +1359,13 @@ test_38() { # bug 14222
        stop_mds
        log "rename lov_objid file on MDS"
        rm -f $TMP/lov_objid.orig
-       do_facet mds "debugfs -c -R \\\"dump lov_objid $TMP/lov_objid.orig\\\" $MDSDEV"
-       do_facet mds "debugfs -w -R \\\"rm lov_objid\\\" $MDSDEV"
 
-       do_facet mds "od -Ax -td8 $TMP/lov_objid.orig"
+       local dev=${SINGLEMDS}_dev
+       local MDSDEV=${!dev}
+       do_facet $SINGLEMDS "$DEBUGFS -c -R \\\"dump lov_objid $TMP/lov_objid.orig\\\" $MDSDEV"
+       do_facet $SINGLEMDS "$DEBUGFS -w -R \\\"rm lov_objid\\\" $MDSDEV"
+
+       do_facet $SINGLEMDS "od -Ax -td8 $TMP/lov_objid.orig"
        # check create in mds_lov_connect
        start_mds
        mount_client $MOUNT
@@ -1523,17 +1373,17 @@ test_38() { # bug 14222
                [ $V ] && log "verifying $DIR/$tdir/$f"
                diff -q $f $DIR/$tdir/$f || ERROR=y
        done
-       do_facet mds "debugfs -c -R \\\"dump lov_objid $TMP/lov_objid.new\\\"  $MDSDEV"
-       do_facet mds "od -Ax -td8 $TMP/lov_objid.new"
-       [ "$ERROR" = "y" ] && error "old and new files are different after connect" || true     
-       
+       do_facet $SINGLEMDS "$DEBUGFS -c -R \\\"dump lov_objid $TMP/lov_objid.new\\\"  $MDSDEV"
+       do_facet $SINGLEMDS "od -Ax -td8 $TMP/lov_objid.new"
+       [ "$ERROR" = "y" ] && error "old and new files are different after connect" || true
+
        # check it's updates in sync
        umount_client $MOUNT
        stop_mds
 
-       do_facet mds dd if=/dev/zero of=$TMP/lov_objid.clear bs=4096 count=1
-       do_facet mds "debugfs -w -R \\\"rm lov_objid\\\" $MDSDEV"
-       do_facet mds "debugfs -w -R \\\"write $TMP/lov_objid.clear lov_objid\\\" $MDSDEV "
+       do_facet $SINGLEMDS dd if=/dev/zero of=$TMP/lov_objid.clear bs=4096 count=1
+       do_facet $SINGLEMDS "$DEBUGFS -w -R \\\"rm lov_objid\\\" $MDSDEV"
+       do_facet $SINGLEMDS "$DEBUGFS -w -R \\\"write $TMP/lov_objid.clear lov_objid\\\" $MDSDEV "
 
        start_mds
        mount_client $MOUNT
@@ -1541,12 +1391,12 @@ test_38() { # bug 14222
                [ $V ] && log "verifying $DIR/$tdir/$f"
                diff -q $f $DIR/$tdir/$f || ERROR=y
        done
-       do_facet mds "debugfs -c -R \\\"dump lov_objid $TMP/lov_objid.new1\\\" $MDSDEV"
-       do_facet mds "od -Ax -td8 $TMP/lov_objid.new1"
+       do_facet $SINGLEMDS "$DEBUGFS -c -R \\\"dump lov_objid $TMP/lov_objid.new1\\\" $MDSDEV"
+       do_facet $SINGLEMDS "od -Ax -td8 $TMP/lov_objid.new1"
        umount_client $MOUNT
        stop_mds
        [ "$ERROR" = "y" ] && error "old and new files are different after sync" || true
-       
+
        log "files compared the same"
        cleanup
 }
@@ -1564,7 +1414,7 @@ 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 mds "sysctl -w lustre.fail_loc=0x80000706"
+       do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000706"
        start_mds
        cleanup
 }
@@ -1572,9 +1422,12 @@ run_test 40 "race during service thread startup"
 
 test_41() { #bug 14134
         local rc
-        start mds $MDSDEV $MDS_MOUNT_OPTS -o nosvc -n
-        start ost `ostdevname 1` $OST_MOUNT_OPTS
-        start mds $MDSDEV $MDS_MOUNT_OPTS -o nomgs
+        local dev=${SINGLEMDS}_dev
+        local MDSDEV=${!dev}
+
+        start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nosvc -n
+        start ost1 `ostdevname 1` $OST_MOUNT_OPTS
+        start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nomgs
         mkdir -p $MOUNT
         mount_client $MOUNT || return 1
         sleep 5
@@ -1583,17 +1436,323 @@ test_41() { #bug 14134
         cat $MOUNT/$tfile
 
         umount_client $MOUNT
-        stop ost -f || return 201
-        stop mds -f || return 202
-        stop mds -f || return 203
+        stop ost1 -f || return 201
+        stop_mds -f || return 202
+        stop_mds -f || return 203
         unload_modules || return 204
         return $rc
 }
 run_test 41 "mount mds with --nosvc and --nomgs"
 
+test_42() { #bug 14693
+        setup
+        check_mount || return 2
+        do_facet client lctl conf_param lustre.llite.some_wrong_param=10
+        umount_client $MOUNT
+        mount_client $MOUNT || return 1
+        cleanup
+        return 0
+}
+run_test 42 "invalid config param should not prevent client from mounting"
+
+test_43() {
+    [ $UID -ne 0 -o $RUNAS_ID -eq 0 ] && skip "run as root"
+    setup
+    chmod ugo+x $DIR || error "chmod 0 failed"
+    set_and_check mds                                        \
+        "lctl get_param -n mdt.$FSNAME-MDT0000.root_squash"  \
+        "$FSNAME.mdt.root_squash"                            \
+        "0:0"
+    set_and_check mds                                        \
+       "lctl get_param -n mdt.$FSNAME-MDT0000.nosquash_nids" \
+       "$FSNAME.mdt.nosquash_nids"                           \
+       "NONE"
+
+    #
+    # create set of test files
+    #
+    echo "111" > $DIR/$tfile-userfile || error "write 1 failed"
+    chmod go-rw $DIR/$tfile-userfile  || error "chmod 1 failed"
+    chown $RUNAS_ID.$RUNAS_ID $DIR/$tfile-userfile || error "chown failed"
+
+    echo "222" > $DIR/$tfile-rootfile || error "write 2 failed"
+    chmod go-rw $DIR/$tfile-rootfile  || error "chmod 2 faield"
+
+    mkdir $DIR/$tdir-rootdir -p       || error "mkdir failed"
+    chmod go-rwx $DIR/$tdir-rootdir   || error "chmod 3 failed"
+    touch $DIR/$tdir-rootdir/tfile-1  || error "touch failed"
+
+    #
+    # check root_squash:
+    #   set root squash UID:GID to RUNAS_ID
+    #   root should be able to access only files owned by RUNAS_ID
+    #
+    set_and_check mds                                        \
+       "lctl get_param -n mdt.$FSNAME-MDT0000.root_squash"   \
+       "$FSNAME.mdt.root_squash"                             \
+       "$RUNAS_ID:$RUNAS_ID"
+
+    ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-userfile)
+    dd if=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null || \
+        error "$ST: root read permission is denied"
+    echo "$ST: root read permission is granted - ok"
+
+    echo "444" | \
+    dd conv=notrunc if=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null || \
+        error "$ST: root write permission is denied"
+    echo "$ST: root write permission is granted - ok"
+
+    ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-rootfile)
+    dd if=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null && \
+        error "$ST: root read permission is granted"
+    echo "$ST: root read permission is denied - ok"
+
+    echo "555" | \
+    dd conv=notrunc of=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null && \
+        error "$ST: root write permission is granted"
+    echo "$ST: root write permission is denied - ok"
+
+    ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tdir-rootdir)
+    rm $DIR/$tdir-rootdir/tfile-1 1>/dev/null 2>/dev/null && \
+        error "$ST: root unlink permission is granted"
+    echo "$ST: root unlink permission is denied - ok"
+
+    touch $DIR/tdir-rootdir/tfile-2 1>/dev/null 2>/dev/null && \
+        error "$ST: root create permission is granted"
+    echo "$ST: root create permission is denied - ok"
+
+    #
+    # check nosquash_nids:
+    #   put client's NID into nosquash_nids list,
+    #   root should be able to access root file after that
+    #
+    local NIDLIST=$(lctl list_nids all | tr '\n' ' ')
+    NIDLIST="2@elan $NIDLIST 192.168.0.[2,10]@tcp"
+    NIDLIST=$(echo $NIDLIST | tr -s ' ' ' ')
+    set_and_check mds                                        \
+       "lctl get_param -n mdt.$FSNAME-MDT0000.nosquash_nids" \
+       "$FSNAME-MDTall.mdt.nosquash_nids"                    \
+       "$NIDLIST"
+
+    ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-rootfile)
+    dd if=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null || \
+        error "$ST: root read permission is denied"
+    echo "$ST: root read permission is granted - ok"
+
+    echo "666" | \
+    dd conv=notrunc of=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null || \
+        error "$ST: root write permission is denied"
+    echo "$ST: root write permission is granted - ok"
+
+    ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tdir-rootdir)
+    rm $DIR/$tdir-rootdir/tfile-1 || \
+        error "$ST: root unlink permission is denied"
+    echo "$ST: root unlink permission is granted - ok"
+    touch $DIR/$tdir-rootdir/tfile-2 || \
+        error "$ST: root create permission is denied"
+    echo "$ST: root create permission is granted - ok"
+
+    return 0
+}
+run_test 43 "check root_squash and nosquash_nids"
+
 umount_client $MOUNT
 cleanup_nocli
-cleanup_gss
 
+test_45() { #17310
+        setup
+        check_mount || return 2
+        stop_mds
+        df -h $MOUNT &
+        log "sleep 60 sec"
+        sleep 60
+#define OBD_FAIL_PTLRPC_LONG_UNLINK   0x50f
+        do_facet client "lctl set_param fail_loc=0x50f"
+        log "sleep 10 sec"
+        sleep 10
+        manual_umount_client --force || return 3
+        do_facet client "lctl set_param fail_loc=0x0"
+        start_mds
+        mount_client $MOUNT || return 4
+        cleanup
+        return 0
+}
+run_test 45 "long unlink handling in ptlrpcd"
+
+test_46a() {
+       OSTCOUNT=6
+       reformat
+       start_mds || return 1
+       #first client should see only one ost
+       start_ost || return 2
+       #start_client
+       mount_client $MOUNT || return 3
+       
+       start_ost2 || return 4
+       start ost3 `ostdevname 3` $OST_MOUNT_OPTS || return 5
+       start ost4 `ostdevname 4` $OST_MOUNT_OPTS || return 6
+       start ost5 `ostdevname 5` $OST_MOUNT_OPTS || return 7
+       # wait until ost2-5 is sync
+       # ping_interval + 1
+       sleep $((TIMEOUT / 4 + 1))
+       #second client see both ost's
+
+       mount_client $MOUNT2 || return 8
+       $LFS setstripe $MOUNT2 -c -1 || return 9
+       $LFS getstripe $MOUNT2 || return 10
+
+       echo "ok" > $MOUNT2/widestripe
+       $LFS getstripe $MOUNT2/widestripe || return 11
+       # fill acl buffer for avoid expand lsm to them
+       awk -F : '{if (FNR < 25) { print "u:"$1":rwx" }}' /etc/passwd | while read acl; do  
+           setfacl -m $acl $MOUNT2/widestripe
+       done
+
+       # will be deadlock
+       stat $MOUNT/widestripe || return 12
+
+       umount_client $MOUNT2 || return 13
+       umount_client $MOUNT || return 14
+       stop ost5 -f || return 20
+       stop ost4 -f || return 21
+       stop ost3 -f || return 22
+       stop_ost2 || return 23
+       stop_ost || return 24
+       stop_mds || return 25
+}
+run_test 46a "handle ost additional - wide striped file"
+
+test_47() { #17674
+       reformat
+       setup_noconfig
+        check_mount || return 2
+        $LCTL set_param ldlm.namespaces.$FSNAME-*-*-*.lru_size=100
+
+        local lru_size=[]
+        local count=0
+        for ns in $($LCTL get_param ldlm.namespaces.$FSNAME-*-*-*.lru_size); do
+            if echo $ns | grep "MDT[[:digit:]]*"; then
+                continue
+            fi
+            lrs=$(echo $ns | sed 's/.*lru_size=//')
+            lru_size[count]=$lrs
+            let count=count+1
+        done
+        facet_failover ost1
+        facet_failover $SINGLEMDS
+        df -h $MOUNT || return 3
+
+        count=0
+        for ns in $($LCTL get_param ldlm.namespaces.$FSNAME-*-*-*.lru_size); do
+            if echo $ns | grep "MDT[[:digit:]]*"; then
+                continue
+            fi
+            lrs=$(echo $ns | sed 's/.*lru_size=//')
+            if ! test "$lrs" -eq "${lru_size[count]}"; then
+                n=$(echo $ns | sed -e 's/ldlm.namespaces.//' -e 's/.lru_size=.*//')
+                error "$n has lost lru_size: $lrs vs. ${lru_size[count]}"
+            fi
+            let count=count+1
+        done
+
+        cleanup
+        return 0
+}
+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
+       # we will have unkillable file at FS
+       reformat_and_config
+}
+
+test_48() { # bug 17636
+       reformat
+       setup_noconfig
+        check_mount || return 2
+
+       $LFS setstripe $MOUNT -c -1 || return 9
+       $LFS getstripe $MOUNT || return 10
+
+       echo "ok" > $MOUNT/widestripe
+       $LFS getstripe $MOUNT/widestripe || return 11
+
+       trap cleanup_48 EXIT ERR
+
+       # fill acl buffer for avoid expand lsm to them
+       getent passwd | awk -F : '{ print "u:"$1":rwx" }' |  while read acl; do
+           setfacl -m $acl $MOUNT/widestripe
+       done
+
+       stat $MOUNT/widestripe || return 12
+
+       cleanup_48
+       return 0
+}
+run_test 48 "too many acls on file"
+
+# check PARAM_SYS_LDLM_TIMEOUT option of MKFS.LUSTRE
+test_49() { # bug 17710
+       local OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS
+       local OLD_OST_MKFS_OPTS=$OST_MKFS_OPTS
+       local LOCAL_TIMEOUT=20
+
+
+       OST_MKFS_OPTS="--ost --fsname=$FSNAME --device-size=$OSTSIZE --mgsnode=$MGSNID --param sys.timeout=$LOCAL_TIMEOUT --param sys.ldlm_timeout=$LOCAL_TIMEOUT $MKFSOPT $OSTOPT"
+
+       reformat
+       start_mds
+       start_ost
+       mount_client $MOUNT
+       check_mount || return 1
+
+       echo "check ldlm_timout..."
+       LDLM_MDS="`do_facet mds 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`"
+
+       if [ $LDLM_MDS -ne $LDLM_OST1 ] || [ $LDLM_MDS -ne $LDLM_CLIENT ]; then
+               error "Different LDLM_TIMEOUT:$LDLM_MDS $LDLM_OST1 $LDLM_CLIENT"
+       fi
+
+       if [ $LDLM_MDS -ne $((LOCAL_TIMEOUT / 3)) ]; then
+               error "LDLM_TIMEOUT($LDLM_MDS) is not correct"
+       fi
+
+       umount_client $MOUNT
+       stop_ost || return 2
+       stop_mds || return 3
+
+       OST_MKFS_OPTS="--ost --fsname=$FSNAME --device-size=$OSTSIZE --mgsnode=$MGSNID --param sys.timeout=$LOCAL_TIMEOUT --param sys.ldlm_timeout=$((LOCAL_TIMEOUT - 1)) $MKFSOPT $OSTOPT"
+       
+       reformat
+       start_mds || return 4
+       start_ost || return 5
+       mount_client $MOUNT || return 6
+       check_mount || return 7
+
+       LDLM_MDS="`do_facet mds 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`"
+
+       if [ $LDLM_MDS -ne $LDLM_OST1 ] || [ $LDLM_MDS -ne $LDLM_CLIENT ]; then
+               error "Different LDLM_TIMEOUT:$LDLM_MDS $LDLM_OST1 $LDLM_CLIENT"
+       fi
+       
+       if [ $LDLM_MDS -ne $((LOCAL_TIMEOUT - 1)) ]; then
+               error "LDLM_TIMEOUT($LDLM_MDS) is not correct"
+       fi
+               
+       cleanup || return $?
+
+       MDS_MKFS_OPTS=$OLD_MDS_MKFS_OPTS
+       OST_MKFS_OPTS=$OLD_OST_MKFS_OPTS
+}
+run_test 49 "check PARAM_SYS_LDLM_TIMEOUT option of MKFS.LUSTRE"
+
+cleanup_gss
 equals_msg `basename $0`: test complete
-[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true
+[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true