fstests: remove old electric fence support
[xfstests-dev.git] / check
diff --git a/check b/check
index 3d42a8ba37cc5c44bdabd2012a239b719ac68423..96198ac4714ea574330ce08c7464e6e32ef13b23 100755 (executable)
--- a/check
+++ b/check
@@ -28,6 +28,7 @@ try=""
 n_bad=0
 sum_bad=0
 bad=""
+n_notrun=0
 notrun=""
 interrupt=true
 diff="diff -u"
@@ -36,6 +37,10 @@ have_test_arg=false
 randomize=false
 export here=`pwd`
 xfile=""
+brief_test_summary=false
+_err_msg=""
+do_report=false
+DUMP_OUTPUT=false
 
 # start the initialisation work now
 iam=check
@@ -49,16 +54,8 @@ export DIFF_LENGTH=${DIFF_LENGTH:=10}
 # by default don't output timestamps
 timestamp=${TIMESTAMP:=false}
 
-rm -f $tmp.list $tmp.tmp $tmp.grep $here/$iam.out $tmp.xlist
+rm -f $tmp.list $tmp.tmp $tmp.grep $here/$iam.out $tmp.xlist $tmp.report.*
 
-# we need common/config
-if ! . ./common/config
-then
-    echo "$iam: failed to source common/config"
-    exit 1
-fi
-
-SUPPORTED_TESTS="[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]"
 SRC_GROUPS="generic shared"
 export SRC_DIR="tests"
 
@@ -68,49 +65,112 @@ usage()
 
 check options
     -nfs                test NFS
+    -glusterfs                test GlusterFS
     -cifs               test CIFS
+    -9p                        test 9p
+    -overlay           test overlay
+    -pvfs2          test PVFS2
     -tmpfs              test TMPFS
+    -ubifs              test ubifs
     -l                 line mode diff
     -udiff             show unified diff (default)
     -n                 show me, do not run tests
     -T                 output timestamps
     -r                 randomize test order
+    -d                 dump test output to stdout
+    -b                 brief test summary
+    -R fmt[,fmt]       generate report in formats specified. Supported format: [xunit]
     --large-fs         optimise scratch device for large filesystems
     -s section         run only specified section from config file
+    -S section         exclude the specified section from the config file
 
 testlist options
     -g group[,group...]        include tests from these groups
     -x group[,group...]        exclude tests from these groups
-    -X file            exclude individual tests
+    -X exclude_file    exclude individual tests
     -E external_file   exclude individual tests
     [testlist]         include tests matching names in testlist
+
+testlist argument is a list of tests in the form of <test dir>/<test name>.
+
+<test dir> is a directory under tests that contains a group file,
+with a list of the names of the tests in that directory.
+
+<test name> may be either a specific test file name (e.g. xfs/001) or
+a test file name match pattern (e.g. xfs/*).
+
+group argument is either a name of a tests group to collect from all
+the test dirs (e.g. quick) or a name of a tests group to collect from
+a specific tests dir in the form of <test dir>/<group name> (e.g. xfs/quick).
+If you want to run all the tests in the test suite, use "-g all" to specify all
+groups.
+
+exclude_file argument refers to a name of a file inside each test directory.
+for every test dir where this file is found, the listed test names are
+excluded from the list of tests to run from that test dir.
+
+external_file argument is a path to a single file containing a list of tests
+to exclude in the form of <test dir>/<test name>.
+
+examples:
+ check xfs/001
+ check -g quick
+ check -g xfs/quick
+ check -x stress xfs/*
+ check -X .exclude -g auto
+ check -E ~/.xfstests.exclude
 '
            exit 0
 }
 
+get_sub_group_list()
+{
+       local d=$1
+       local grp=$2
+
+       test -s "$SRC_DIR/$d/group" || return 1
+
+       local grpl=$(sed -n < $SRC_DIR/$d/group \
+               -e 's/#.*//' \
+               -e 's/$/ /' \
+               -e "s;^\($VALID_TEST_NAME\).* $grp .*;$SRC_DIR/$d/\1;p")
+       echo $grpl
+}
+
 get_group_list()
 {
-       grp=$1
+       local grp=$1
+       local grpl=""
+       local sub=$(dirname $grp)
+
+       if [ -n "$sub" -a "$sub" != "." -a -d "$SRC_DIR/$sub" ]; then
+               # group is given as <subdir>/<group> (e.g. xfs/quick)
+               grp=$(basename $grp)
+               get_sub_group_list $sub $grp
+               return
+       fi
 
        for d in $SRC_GROUPS $FSTYP; do
-               l=$(sed -n < $SRC_DIR/$d/group \
-                       -e 's/#.*//' \
-                       -e 's/$/ /' \
-                       -e "s;\(^[0-9][0-9][0-9]\).* $grp .*;$SRC_DIR/$d/\1;p")
-               grpl="$grpl $l"
+               if ! test -d "$SRC_DIR/$d" ; then
+                       continue
+               fi
+               grpl="$grpl $(get_sub_group_list $d $grp)"
        done
        echo $grpl
 }
 
-# find all tests, excluding files that are test metadata such as group files.
-# This assumes that tests are defined purely by alphanumeric filenames with no
-# ".xyz" extensions in the name.
+# Find all tests, excluding files that are test metadata such as group files.
+# It matches test names against $VALID_TEST_NAME defined in common/rc
 get_all_tests()
 {
        touch $tmp.list
        for d in $SRC_GROUPS $FSTYP; do
+               if ! test -d "$SRC_DIR/$d" ; then
+                       continue
+               fi
                ls $SRC_DIR/$d/* | \
                        grep -v "\..*" | \
+                       grep "^$SRC_DIR/$d/$VALID_TEST_NAME"| \
                        grep -v "group\|Makefile" >> $tmp.list 2>/dev/null
        done
 }
@@ -136,6 +196,7 @@ trim_test_list()
        done
        grep -v -f $tmp.grep <$tmp.list >$tmp.tmp
        mv $tmp.tmp $tmp.list
+       rm -f $tmp.grep
 }
 
 
@@ -161,22 +222,24 @@ _prepare_test_list()
        fi
 
        # Specified groups to include
-       for group in $GROUP_LIST; do
-               list=$(get_group_list $group)
-               if [ -z "$list" ]; then
-                       echo "Group \"$group\" is empty or not defined?"
-                       exit 1
-               fi
+       # Note that the CLI processing adds a leading space to the first group
+       # parameter, so we have to catch that here checking for "all"
+       if ! $have_test_arg && [ "$GROUP_LIST" == " all" ]; then
+               # no test numbers, do everything
+               get_all_tests
+       else
+               for group in $GROUP_LIST; do
+                       list=$(get_group_list $group)
+                       if [ -z "$list" ]; then
+                               echo "Group \"$group\" is empty or not defined?"
+                               exit 1
+                       fi
 
-               for t in $list; do
-                       grep -s "^$t\$" $tmp.list >/dev/null || \
+                       for t in $list; do
+                               grep -s "^$t\$" $tmp.list >/dev/null || \
                                                        echo "$t" >>$tmp.list
+                       done
                done
-       done
-
-       if ! $have_test_arg && [ -z "$GROUP_LIST" ]; then
-               # no test numbers, do everything
-               get_all_tests
        fi
 
        # Specified groups to exclude
@@ -192,7 +255,7 @@ _prepare_test_list()
 
        # sort the list of tests into numeric order
        list=`sort -n $tmp.list | uniq`
-       rm -f $tmp.list $tmp.tmp $tmp.grep
+       rm -f $tmp.list
 
        if $randomize
        then
@@ -205,32 +268,38 @@ while [ $# -gt 0 ]; do
        case "$1" in
        -\? | -h | --help) usage ;;
 
-       -nfs)   FSTYP=nfs ;;
-       -cifs)  FSTYP=cifs ;;
-       -tmpfs) FSTYP=tmpfs ;;
+       -nfs)           FSTYP=nfs ;;
+       -glusterfs)     FSTYP=glusterfs ;;
+       -cifs)          FSTYP=cifs ;;
+       -9p)            FSTYP=9p ;;
+       -overlay)       FSTYP=overlay; export OVERLAY=true ;;
+       -pvfs2)         FSTYP=pvfs2 ;;
+       -tmpfs)         FSTYP=tmpfs ;;
+       -ubifs)         FSTYP=ubifs ;;
 
        -g)     group=$2 ; shift ;
-               GROUP_LIST="$GROUP_LIST $group"
+               GROUP_LIST="$GROUP_LIST ${group//,/ }"
                ;;
 
        -x)     xgroup=$2 ; shift ;
-               XGROUP_LIST="$XGROUP_LIST $xgroup"
+               XGROUP_LIST="$XGROUP_LIST ${xgroup//,/ }"
                ;;
 
        -X)     xfile=$2; shift ;
                for d in $SRC_GROUPS $FSTYP; do
                        [ -f $SRC_DIR/$d/$xfile ] || continue
-                       for f in `cat $SRC_DIR/$d/$xfile`; do
+                       for f in `sed "s/#.*$//" $SRC_DIR/$d/$xfile`; do
                                echo $d/$f >> $tmp.xlist
                        done
                done
                ;;
        -E)     xfile=$2; shift ;
                if [ -f $xfile ]; then
-                       cat "$xfile" >> $tmp.xlist
+                       sed "s/#.*$//" "$xfile" >> $tmp.xlist
                fi
                ;;
        -s)     RUN_SECTION="$RUN_SECTION $2"; shift ;;
+       -S)     EXCLUDE_SECTION="$EXCLUDE_SECTION $2"; shift ;;
        -l)     diff="diff" ;;
        -udiff) diff="$diff -u" ;;
 
@@ -238,7 +307,12 @@ while [ $# -gt 0 ]; do
         -r)    randomize=true ;;
 
        -T)     timestamp=true ;;
-
+       -d)     DUMP_OUTPUT=true ;;
+       -b)     brief_test_summary=true;;
+       -R)     report_fmt=$2 ; shift ;
+               REPORT_LIST="$REPORT_LIST ${report_fmt//,/ }"
+               do_report=true
+               ;;
        --large-fs) export LARGE_SCRATCH_DEV=yes ;;
        --extra-space=*) export SCRATCH_DEV_EMPTY_SPACE=${r#*=} ;;
 
@@ -257,31 +331,47 @@ while [ $# -gt 0 ]; do
        shift
 done
 
+# we need common/config, source it after processing args, overlay needs FSTYP
+# set before sourcing common/config
+if ! . ./common/config; then
+       echo "$iam: failed to source common/config"
+       exit 1
+fi
+
 # Process tests from command line now.
 if $have_test_arg; then
        while [ $# -gt 0 ]; do
                case "$1" in
-               -*)     echo "Argments before tests, please!"
+               -*)     echo "Arguments before tests, please!"
                        status=1
                        exit $status
                        ;;
-               *)      test_dir=`dirname $1`
-                       test_dir=${test_dir#$SRC_DIR/*}
-                       test_name=`basename $1`
-                       group_file=$SRC_DIR/$test_dir/group
-
-                       if egrep "^$test_name" $group_file >/dev/null ; then
-                               # in group file ... OK
-                               echo $SRC_DIR/$test_dir/$test_name >>$tmp.arglist
-                       else
-                               # oops
-                               echo "$1 - unknown test, ignored"
-                       fi
+               *)      # Expand test pattern (e.g. xfs/???, *fs/001)
+                       list=$(cd $SRC_DIR; echo $1)
+                       for t in $list; do
+                               test_dir=`dirname $t`
+                               test_dir=${test_dir#$SRC_DIR/*}
+                               test_name=`basename $t`
+                               group_file=$SRC_DIR/$test_dir/group
+
+                               if egrep -q "^$test_name" $group_file; then
+                                       # in group file ... OK
+                                       echo $SRC_DIR/$test_dir/$test_name \
+                                               >>$tmp.arglist
+                               else
+                                       # oops
+                                       echo "$t - unknown test, ignored"
+                               fi
+                       done
                        ;;
                esac
 
                shift
        done
+elif [ -z "$GROUP_LIST" ]; then
+       # default group list is the auto group. If any other group or test is
+       # specified, we use that instead.
+       GROUP_LIST="auto"
 fi
 
 # we need common/rc
@@ -301,75 +391,84 @@ _wipe_counters()
 {
        n_try="0"
        n_bad="0"
+       n_notrun="0"
        unset try notrun bad
 }
 
 _wrapup()
 {
-    seq="check"
-    check="$RESULT_BASE/check"
-
-    if $showme
-    then
-       :
-    elif $needwrap
-    then
-       if [ -f $check.time -a -f $tmp.time ]
-       then
-           cat $check.time $tmp.time \
-           | $AWK_PROG '
-       { t[$1] = $2 }
-END    { if (NR > 0) {
-           for (i in t) print i " " t[i]
-         }
-       }' \
-           | sort -n >$tmp.out
-           mv $tmp.out $check.time
-       fi
+       seq="check"
+       check="$RESULT_BASE/check"
+
+       if $showme; then
+               if $needwrap; then
+                       if $do_report; then
+                               _make_section_report
+                       fi
+                       needwrap=false
+               fi
+       elif $needwrap; then
+               if [ -f $check.time -a -f $tmp.time ]; then
+                       cat $check.time $tmp.time  \
+                               | $AWK_PROG '
+                               { t[$1] = $2 }
+                               END {
+                                       if (NR > 0) {
+                                               for (i in t) print i " " t[i]
+                                       }
+                               }' \
+                               | sort -n >$tmp.out
+                       mv $tmp.out $check.time
+               fi
 
-       echo "" >>$check.log
-       date >>$check.log
-       echo $list | fmt | sed -e 's/^/    /' -e "s;$SRC_DIR/;;g" >>$check.log
-       $interrupt && echo "Interrupted!" >>$check.log
+               echo "" >>$check.log
+               date >>$check.log
 
-       echo "SECTION       -- $section" >>$tmp.summary
-       echo "=========================" >>$tmp.summary
-        if [ ! -z "$n_try" -a $n_try != 0 ]
-       then
-           echo "Ran:$try"
-           echo "Ran:$try" >>$tmp.summary
-       fi
+               echo "SECTION       -- $section" >>$tmp.summary
+               echo "=========================" >>$tmp.summary
+               if [ ! -z "$n_try" -a $n_try != 0 ]; then
+                       if [ $brief_test_summary == "false" ]; then
+                               echo "Ran:$try"
+                               echo "Ran:$try" >>$tmp.summary
+                       fi
+                       echo "Ran:$try" >>$check.log
+               fi
 
-       if [ ! -z "$notrun" ]
-       then
-           echo "Not run:$notrun"
-           echo "Not run:$notrun" >>$check.log
-           echo "Not run:$notrun" >>$tmp.summary
+               $interrupt && echo "Interrupted!" | tee -a $check.log
+
+               if [ ! -z "$notrun" ]; then
+                       if [ $brief_test_summary == "false" ]; then
+                               echo "Not run:$notrun"
+                               echo "Not run:$notrun" >>$tmp.summary
+                       fi
+                       echo "Not run:$notrun" >>$check.log
+               fi
+
+               if [ ! -z "$n_bad" -a $n_bad != 0 ]; then
+                       echo "Failures:$bad"
+                       echo "Failed $n_bad of $n_try tests"
+                       echo "Failures:$bad" >>$check.log
+                       echo "Failed $n_bad of $n_try tests" >>$check.log
+                       echo "Failures:$bad" >>$tmp.summary
+                       echo "Failed $n_bad of $n_try tests" >>$tmp.summary
+               else
+                       echo "Passed all $n_try tests"
+                       echo "Passed all $n_try tests" >>$check.log
+                       echo "Passed all $n_try tests" >>$tmp.summary
+               fi
+               echo "" >>$tmp.summary
+               if $do_report; then
+                       _make_section_report
+               fi
+               needwrap=false
        fi
 
-        if [ ! -z "$n_bad" -a $n_bad != 0 ]
-       then
-           echo "Failures:$bad"
-           echo "Failed $n_bad of $n_try tests"
-           echo "Failures:$bad" | fmt >>$check.log
-           echo "Failed $n_bad of $n_try tests" >>$check.log
-           echo "Failures:$bad" >>$tmp.summary
-           echo "Failed $n_bad of $n_try tests" >>$tmp.summary
-       else
-           echo "Passed all $n_try tests"
-           echo "Passed all $n_try tests" >>$check.log
-           echo "Passed all $n_try tests" >>$tmp.summary
+       sum_bad=`expr $sum_bad + $n_bad`
+       _wipe_counters
+       rm -f /tmp/*.rawout /tmp/*.out /tmp/*.err /tmp/*.time
+       if ! $OPTIONS_HAVE_SECTIONS; then
+               rm -f $tmp.*
        fi
-       echo "" >>$tmp.summary
-       needwrap=false
-    fi
-
-    sum_bad=`expr $sum_bad + $n_bad`
-    _wipe_counters
-    rm -f /tmp/*.rawout /tmp/*.out /tmp/*.err /tmp/*.time
-    if ! $OPTIONS_HAVE_SECTIONS; then
-        rm -f $tmp.*
-    fi
 }
 
 _summary()
@@ -389,14 +488,27 @@ _check_filesystems()
 {
        if [ -f ${RESULT_DIR}/require_test ]; then
                _check_test_fs || err=true
-               rm -f ${RESULT_DIR}/require_test
+               rm -f ${RESULT_DIR}/require_test*
        fi
        if [ -f ${RESULT_DIR}/require_scratch ]; then
                _check_scratch_fs || err=true
-               rm -f ${RESULT_DIR}/require_scratch
+               rm -f ${RESULT_DIR}/require_scratch*
+       fi
+}
+
+_expunge_test()
+{
+       local TEST_ID="$1"
+       if [ -s $tmp.xlist ]; then
+               if grep -q $TEST_ID $tmp.xlist; then
+                       echo "       [expunged]"
+                       return 1
+               fi
        fi
+       return 0
 }
 
+_init_kmemleak
 _prepare_test_list
 
 if $OPTIONS_HAVE_SECTIONS; then
@@ -407,7 +519,7 @@ fi
 
 for section in $HOST_OPTIONS_SECTIONS; do
        OLD_FSTYP=$FSTYP
-       OLD_MOUNT_OPTIONS=$MOUNT_OPTIONS
+       OLD_TEST_FS_MOUNT_OPTS=$TEST_FS_MOUNT_OPTS
        get_next_config $section
 
        # Do we need to run only some sections ?
@@ -416,6 +528,21 @@ for section in $HOST_OPTIONS_SECTIONS; do
                for s in $RUN_SECTION; do
                        if [ $section == $s ]; then
                                skip=false
+                               break;
+                       fi
+               done
+               if $skip; then
+                       continue
+               fi
+       fi
+
+       # Did this section get excluded?
+       if [ ! -z "$EXCLUDE_SECTION" ]; then
+               skip=false
+               for s in $EXCLUDE_SECTION; do
+                       if [ $section == $s ]; then
+                               skip=true
+                               break;
                        fi
                done
                if $skip; then
@@ -426,35 +553,40 @@ for section in $HOST_OPTIONS_SECTIONS; do
        mkdir -p $RESULT_BASE
        if [ ! -d $RESULT_BASE ]; then
                echo "failed to create results directory $RESULT_BASE"
-               exit 1;
+               status=1
+               exit
        fi
 
        if $OPTIONS_HAVE_SECTIONS; then
                echo "SECTION       -- $section"
        fi
 
+       sect_start=`_wallclock`
        if $RECREATE_TEST_DEV || [ "$OLD_FSTYP" != "$FSTYP" ]; then
                echo "RECREATING    -- $FSTYP on $TEST_DEV"
-               umount $TEST_DEV 2> /dev/null
+               _test_unmount 2> /dev/null
                if ! _test_mkfs >$tmp.err 2>&1
                then
                        echo "our local _test_mkfs routine ..."
                        cat $tmp.err
                        echo "check: failed to mkfs \$TEST_DEV using specified options"
-                       exit 1
+                       status=1
+                       exit
                fi
-               out=`_mount_or_remount_rw "$MOUNT_OPTIONS" $TEST_DEV $TEST_DIR`
-               if [ $? -ne 1 ]; then
-                       echo $out
-                       exit 1
+               if ! _test_mount
+               then
+                       echo "check: failed to mount $TEST_DEV on $TEST_DIR"
+                       status=1
+                       exit
                fi
                _prepare_test_list
-       elif [ "$OLD_MOUNT_OPTIONS" != "$MOUNT_OPTIONS" ]; then
-               umount $TEST_DEV 2> /dev/null
-               out=`_mount_or_remount_rw "$MOUNT_OPTIONS" $TEST_DEV $TEST_DIR`
-               if [ $? -ne 1 ]; then
-                       echo $out
-                       exit 1
+       elif [ "$OLD_TEST_FS_MOUNT_OPTS" != "$TEST_FS_MOUNT_OPTS" ]; then
+               _test_unmount 2> /dev/null
+               if ! _test_mount
+               then
+                       echo "check: failed to mount $TEST_DEV on $TEST_DIR"
+                       status=1
+                       exit
                fi
        fi
 
@@ -479,16 +611,17 @@ for section in $HOST_OPTIONS_SECTIONS; do
        needwrap=true
 
        if [ ! -z "$SCRATCH_DEV" ]; then
-         umount $SCRATCH_DEV 2>/dev/null
+         _scratch_unmount 2> /dev/null
          # call the overridden mkfs - make sure the FS is built
          # the same as we'll create it later.
 
-         if ! _scratch_mkfs $flag >$tmp.err 2>&1
+         if ! _scratch_mkfs >$tmp.err 2>&1
          then
              echo "our local _scratch_mkfs routine ..."
              cat $tmp.err
              echo "check: failed to mkfs \$SCRATCH_DEV using specified options"
-             exit 1
+             status=1
+             exit
          fi
 
          # call the overridden mount - make sure the FS mounts with
@@ -498,7 +631,8 @@ for section in $HOST_OPTIONS_SECTIONS; do
              echo "our local mount routine ..."
              cat $tmp.err
              echo "check: failed to mount \$SCRATCH_DEV using specified options"
-             exit 1
+             status=1
+             exit
          fi
        fi
 
@@ -508,32 +642,57 @@ for section in $HOST_OPTIONS_SECTIONS; do
        for seq in $list
        do
            err=false
+           _err_msg=""
+           if [ ! -f $seq ]; then
+               # Try to get full name in case the user supplied only seq id
+               # and the test has a name. A bit of hassle to find really
+               # the test and not its sample output or helping files.
+               bname=$(basename $seq)
+               full_seq=$(find $(dirname $seq) -name $bname* -executable |
+                   awk '(NR == 1 || length < length(shortest)) { shortest = $0 }\
+                       END { print shortest }')
+               if [ -f $full_seq ] \
+                   && [ x$(echo $bname | grep -o "^$VALID_TEST_ID") != x ]; then
+                   seq=$full_seq
+               fi
+           fi
 
            # the filename for the test and the name output are different.
            # we don't include the tests/ directory in the name output.
-           seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"`
+           export seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"`
 
            # Similarly, the result directory needs to replace the tests/
            # part of the test location.
            group=`dirname $seq`
            if $OPTIONS_HAVE_SECTIONS; then
                export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;${RESULT_BASE}/$section;"`
-               seqres="$RESULT_BASE/$section/$seqnum"
+               REPORT_DIR="$RESULT_BASE/$section"
            else
                export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"`
-               seqres="$RESULT_BASE/$seqnum"
+               REPORT_DIR="$RESULT_BASE"
            fi
+           seqres="$REPORT_DIR/$seqnum"
 
            mkdir -p $RESULT_DIR
 
            echo -n "$seqnum"
 
-           if $showme
-           then
+           if $showme; then
+               _expunge_test $seqnum
+               if [ $? -eq 1 ]; then
+                       continue
+               fi
                echo
+               start=0
+               stop=0
+               n_notrun=`expr $n_notrun + 1`
+               if $do_report; then
+                       _make_testcase_report "list"
+               fi
                continue
-           elif [ ! -f $seq ]
-           then
+           fi
+           tc_status="pass"
+           if [ ! -f $seq ]; then
                echo " - no such test?"
            else
                # really going to try and run this one
@@ -541,11 +700,9 @@ for section in $HOST_OPTIONS_SECTIONS; do
                rm -f $seqres.out.bad
 
                # check if we really should run it
-               if [ -s $tmp.xlist ]; then
-                       if grep $seqnum $tmp.xlist > /dev/null 2>&1 ; then
-                               echo "       [expunged]"
-                               continue
-                       fi
+               _expunge_test $seqnum
+               if [ $? -eq 1 ]; then
+                       continue
                fi
 
                # slashes now in names, sed barfs on them so use grep
@@ -562,20 +719,26 @@ for section in $HOST_OPTIONS_SECTIONS; do
                [ ! -x $seq ] && chmod u+x $seq # ensure we can run it
                $LOGGER_PROG "run xfstest $seqnum"
                if [ -w /dev/kmsg ]; then
-                       date_time=`date +"%F %T"`
+                       export date_time=`date +"%F %T"`
                        echo "run fstests $seqnum at $date_time" > /dev/kmsg
+                       # _check_dmesg depends on this log in dmesg
+                       touch ${RESULT_DIR}/check_dmesg
+               fi
+               if [ "$DUMP_OUTPUT" = true ]; then
+                       ./$seq 2>&1 | tee $tmp.out
+                       # Because $? would get tee's return code
+                       sts=${PIPESTATUS[0]}
+               else
+                       ./$seq >$tmp.out 2>&1
+                       sts=$?
                fi
-               ./$seq >$tmp.rawout 2>&1
-               sts=$?
                $timestamp && _timestamp
                stop=`_wallclock`
 
-               _fix_malloc <$tmp.rawout >$tmp.out
-               rm -f $tmp.rawout
-
                if [ -f core ]
                then
-                   echo -n " [dumped core]"
+                   _err_msg="[dumped core]"
+                   echo -n " $_err_msg"
                    mv core $RESULT_BASE/$seqnum.core
                    err=true
                fi
@@ -586,15 +749,18 @@ for section in $HOST_OPTIONS_SECTIONS; do
                    $timestamp && echo " [not run]" && echo -n "        $seqnum -- "
                    cat $seqres.notrun
                    notrun="$notrun $seqnum"
+                   n_notrun=`expr $n_notrun + 1`
+                   tc_status="notrun"
                else
                    if [ $sts -ne 0 ]
                    then
-                       echo -n " [failed, exit status $sts]"
+                       _err_msg="[failed, exit status $sts]"
+                       echo -n " $_err_msg"
                        err=true
                    fi
                    if [ ! -f $seq.out ]
                    then
-                       echo " - no qualified output"
+                       _dump_err "no qualified output"
                        err=true
                    else
 
@@ -624,12 +790,15 @@ for section in $HOST_OPTIONS_SECTIONS; do
                                                " to see the entire diff)"
                                fi; } | \
                                sed -e 's/^\(.\)/    \1/'
+                           _err_msg="output mismatch (see $diff $seq.out $seqres.out.bad)"
                            err=true
                        fi
                    fi
                    try="$try $seqnum"
                    n_try=`expr $n_try + 1`
                    _check_filesystems
+                   _check_dmesg || err=true
+                   _check_kmemleak || err=true
                fi
 
            fi
@@ -640,18 +809,23 @@ for section in $HOST_OPTIONS_SECTIONS; do
            then
                bad="$bad $seqnum"
                n_bad=`expr $n_bad + 1`
-               quick=false
+               tc_status="fail"
+           fi
+           if $do_report; then
+               _make_testcase_report "$tc_status"
            fi
-
            seq="after_$seqnum"
        done
+       sect_stop=`_wallclock`
+       interrupt=false
        _wrapup
+       interrupt=true
        echo
 
-       umount $TEST_DEV 2> /dev/null
-       umount $SCRATCH_DEV 2> /dev/null
+       _test_unmount 2> /dev/null
+       _scratch_unmount 2> /dev/null
 done
 
 interrupt=false
-status=`expr $sum_bad`
+status=`expr $sum_bad != 0`
 exit