xref: /openbmc/qemu/tests/qemu-iotests/check (revision 96914159b7c4f9cd574301517c15b0743a050f95)
1908eaf68SStefan Hajnoczi#!/bin/bash
26bf19c94SChristoph Hellwig#
36bf19c94SChristoph Hellwig# Copyright (C) 2009 Red Hat, Inc.
46bf19c94SChristoph Hellwig# Copyright (c) 2000-2002,2006 Silicon Graphics, Inc.  All Rights Reserved.
56bf19c94SChristoph Hellwig#
66bf19c94SChristoph Hellwig# This program is free software; you can redistribute it and/or
76bf19c94SChristoph Hellwig# modify it under the terms of the GNU General Public License as
86bf19c94SChristoph Hellwig# published by the Free Software Foundation.
96bf19c94SChristoph Hellwig#
106bf19c94SChristoph Hellwig# This program is distributed in the hope that it would be useful,
116bf19c94SChristoph Hellwig# but WITHOUT ANY WARRANTY; without even the implied warranty of
126bf19c94SChristoph Hellwig# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
136bf19c94SChristoph Hellwig# GNU General Public License for more details.
146bf19c94SChristoph Hellwig#
156bf19c94SChristoph Hellwig# You should have received a copy of the GNU General Public License
16e8c212d6SChristoph Hellwig# along with this program.  If not, see <http://www.gnu.org/licenses/>.
176bf19c94SChristoph Hellwig#
186bf19c94SChristoph Hellwig#
196bf19c94SChristoph Hellwig# Control script for QA
206bf19c94SChristoph Hellwig#
216bf19c94SChristoph Hellwig
226bf19c94SChristoph Hellwigstatus=0
236bf19c94SChristoph Hellwigneedwrap=true
246bf19c94SChristoph Hellwigtry=0
256bf19c94SChristoph Hellwign_bad=0
266bf19c94SChristoph Hellwigbad=""
276bf19c94SChristoph Hellwignotrun=""
286bf19c94SChristoph Hellwiginterrupt=true
296bf19c94SChristoph Hellwig
306bf19c94SChristoph Hellwig# by default don't output timestamps
316bf19c94SChristoph Hellwigtimestamp=${TIMESTAMP:=false}
326bf19c94SChristoph Hellwig
33e8f8624dSMax Reitz_init_error()
34e8f8624dSMax Reitz{
354e670492SPaolo Bonzini    echo "check: $1" >&2
366bf19c94SChristoph Hellwig    exit 1
37e8f8624dSMax Reitz}
38e8f8624dSMax Reitz
39e8f8624dSMax Reitzif [ -L "$0" ]
40e8f8624dSMax Reitzthen
41e8f8624dSMax Reitz    # called from the build tree
42e8f8624dSMax Reitz    source_iotests=$(dirname "$(readlink "$0")")
43e8f8624dSMax Reitz    if [ -z "$source_iotests" ]
44e8f8624dSMax Reitz    then
45e8f8624dSMax Reitz        _init_error "failed to obtain source tree name from check symlink"
46e8f8624dSMax Reitz    fi
47e8f8624dSMax Reitz    source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree"
48e8f8624dSMax Reitz    build_iotests=$PWD
49e8f8624dSMax Reitzelse
50e8f8624dSMax Reitz    # called from the source tree
51e8f8624dSMax Reitz    source_iotests=$PWD
52e8f8624dSMax Reitz    # this may be an in-tree build (note that in the following code we may not
53e8f8624dSMax Reitz    # assume that it truly is and have to test whether the build results
54e8f8624dSMax Reitz    # actually exist)
55e8f8624dSMax Reitz    build_iotests=$PWD
56e8f8624dSMax Reitzfi
57e8f8624dSMax Reitz
58e8f8624dSMax Reitzbuild_root="$build_iotests/../.."
59e8f8624dSMax Reitz
607fed1a49SMax Reitz# we need common.env
617fed1a49SMax Reitzif ! . "$build_iotests/common.env"
627fed1a49SMax Reitzthen
637fed1a49SMax Reitz    _init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)"
647fed1a49SMax Reitzfi
657fed1a49SMax Reitz
66e8f8624dSMax Reitz# we need common.config
67e8f8624dSMax Reitzif ! . "$source_iotests/common.config"
68e8f8624dSMax Reitzthen
69e8f8624dSMax Reitz    _init_error "failed to source common.config"
706bf19c94SChristoph Hellwigfi
716bf19c94SChristoph Hellwig
7209d653e6SPaolo Bonzini_full_imgfmt_details()
7309d653e6SPaolo Bonzini{
7409d653e6SPaolo Bonzini    if [ -n "$IMGOPTS" ]; then
7509d653e6SPaolo Bonzini        echo "$IMGFMT ($IMGOPTS)"
7609d653e6SPaolo Bonzini    else
7709d653e6SPaolo Bonzini        echo "$IMGFMT"
7809d653e6SPaolo Bonzini    fi
7909d653e6SPaolo Bonzini}
8009d653e6SPaolo Bonzini
8109d653e6SPaolo Bonzini_full_platform_details()
8209d653e6SPaolo Bonzini{
8309d653e6SPaolo Bonzini    os=`uname -s`
8409d653e6SPaolo Bonzini    host=`hostname -s`
8509d653e6SPaolo Bonzini    kernel=`uname -r`
8609d653e6SPaolo Bonzini    platform=`uname -m`
8709d653e6SPaolo Bonzini    echo "$os/$platform $host $kernel"
8809d653e6SPaolo Bonzini}
8909d653e6SPaolo Bonzini
9009d653e6SPaolo Bonzini# $1 = prog to look for
9109d653e6SPaolo Bonziniset_prog_path()
9209d653e6SPaolo Bonzini{
9309d653e6SPaolo Bonzini    p=`command -v $1 2> /dev/null`
9409d653e6SPaolo Bonzini    if [ -n "$p" -a -x "$p" ]; then
9563ca8406SEric Blake        type -p "$p"
9609d653e6SPaolo Bonzini    else
9709d653e6SPaolo Bonzini        return 1
9809d653e6SPaolo Bonzini    fi
9909d653e6SPaolo Bonzini}
10009d653e6SPaolo Bonzini
10109d653e6SPaolo Bonziniif [ -z "$TEST_DIR" ]; then
10209d653e6SPaolo Bonzini        TEST_DIR=`pwd`/scratch
10309d653e6SPaolo Bonzinifi
10409d653e6SPaolo Bonzini
10509d653e6SPaolo Bonziniif [ ! -e "$TEST_DIR" ]; then
10609d653e6SPaolo Bonzini        mkdir "$TEST_DIR"
10709d653e6SPaolo Bonzinifi
10809d653e6SPaolo Bonzini
10909d653e6SPaolo Bonzinidiff="diff -u"
11009d653e6SPaolo Bonziniverbose=false
11109d653e6SPaolo Bonzinidebug=false
11209d653e6SPaolo Bonzinigroup=false
11309d653e6SPaolo Bonzinixgroup=false
11409d653e6SPaolo Bonziniimgopts=false
11509d653e6SPaolo Bonzinishowme=false
11609d653e6SPaolo Bonzinisortme=false
11709d653e6SPaolo Bonziniexpunge=true
11809d653e6SPaolo Bonzinihave_test_arg=false
11909d653e6SPaolo Bonzinicachemode=false
12009d653e6SPaolo Bonzini
12109d653e6SPaolo Bonzinitmp="${TEST_DIR}"/$$
12209d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
12309d653e6SPaolo Bonzini
12409d653e6SPaolo Bonziniexport IMGFMT=raw
12509d653e6SPaolo Bonziniexport IMGFMT_GENERIC=true
12609d653e6SPaolo Bonziniexport IMGPROTO=file
12709d653e6SPaolo Bonziniexport IMGOPTS=""
12809d653e6SPaolo Bonziniexport CACHEMODE="writeback"
12909d653e6SPaolo Bonziniexport QEMU_IO_OPTIONS=""
13009d653e6SPaolo Bonziniexport QEMU_IO_OPTIONS_NO_FMT=""
13109d653e6SPaolo Bonziniexport CACHEMODE_IS_DEFAULT=true
13209d653e6SPaolo Bonziniexport QEMU_OPTIONS="-nodefaults -machine accel=qtest"
13309d653e6SPaolo Bonziniexport VALGRIND_QEMU=
13409d653e6SPaolo Bonziniexport IMGKEYSECRET=
13509d653e6SPaolo Bonziniexport IMGOPTSSYNTAX=false
13609d653e6SPaolo Bonzini
1378803714bSEric Blake# Save current tty settings, since an aborting qemu call may leave things
1388803714bSEric Blake# screwed up
1398803714bSEric BlakeSTTY_RESTORE=
1408803714bSEric Blakeif test -t 0; then
1418803714bSEric Blake    STTY_RESTORE=$(stty -g)
1428803714bSEric Blakefi
1438803714bSEric Blake
14409d653e6SPaolo Bonzinifor r
14509d653e6SPaolo Bonzinido
14609d653e6SPaolo Bonzini
14709d653e6SPaolo Bonzini    if $group
14809d653e6SPaolo Bonzini    then
14909d653e6SPaolo Bonzini        # arg after -g
15009d653e6SPaolo Bonzini        group_list=`sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
15109d653e6SPaolo Bonzinis/ .*//p
15209d653e6SPaolo Bonzini}'`
15309d653e6SPaolo Bonzini        if [ -z "$group_list" ]
15409d653e6SPaolo Bonzini        then
15509d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
15609d653e6SPaolo Bonzini            exit 1
15709d653e6SPaolo Bonzini        fi
15809d653e6SPaolo Bonzini        [ ! -s $tmp.list ] && touch $tmp.list
15909d653e6SPaolo Bonzini        for t in $group_list
16009d653e6SPaolo Bonzini        do
16109d653e6SPaolo Bonzini            if grep -s "^$t\$" $tmp.list >/dev/null
16209d653e6SPaolo Bonzini            then
16309d653e6SPaolo Bonzini                :
16409d653e6SPaolo Bonzini            else
16509d653e6SPaolo Bonzini                echo "$t" >>$tmp.list
16609d653e6SPaolo Bonzini            fi
16709d653e6SPaolo Bonzini        done
16809d653e6SPaolo Bonzini        group=false
16909d653e6SPaolo Bonzini        continue
17009d653e6SPaolo Bonzini
17109d653e6SPaolo Bonzini    elif $xgroup
17209d653e6SPaolo Bonzini    then
17309d653e6SPaolo Bonzini        # arg after -x
17409d653e6SPaolo Bonzini        # Populate $tmp.list with all tests
17509d653e6SPaolo Bonzini        awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null
17609d653e6SPaolo Bonzini        group_list=`sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
17709d653e6SPaolo Bonzinis/ .*//p
17809d653e6SPaolo Bonzini}'`
17909d653e6SPaolo Bonzini        if [ -z "$group_list" ]
18009d653e6SPaolo Bonzini        then
18109d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
18209d653e6SPaolo Bonzini            exit 1
18309d653e6SPaolo Bonzini        fi
18409d653e6SPaolo Bonzini        numsed=0
18509d653e6SPaolo Bonzini        rm -f $tmp.sed
18609d653e6SPaolo Bonzini        for t in $group_list
18709d653e6SPaolo Bonzini        do
18809d653e6SPaolo Bonzini            if [ $numsed -gt 100 ]
18909d653e6SPaolo Bonzini            then
19009d653e6SPaolo Bonzini                sed -f $tmp.sed <$tmp.list >$tmp.tmp
19109d653e6SPaolo Bonzini                mv $tmp.tmp $tmp.list
19209d653e6SPaolo Bonzini                numsed=0
19309d653e6SPaolo Bonzini                rm -f $tmp.sed
19409d653e6SPaolo Bonzini            fi
19509d653e6SPaolo Bonzini            echo "/^$t\$/d" >>$tmp.sed
19609d653e6SPaolo Bonzini            numsed=`expr $numsed + 1`
19709d653e6SPaolo Bonzini        done
19809d653e6SPaolo Bonzini        sed -f $tmp.sed <$tmp.list >$tmp.tmp
19909d653e6SPaolo Bonzini        mv $tmp.tmp $tmp.list
20009d653e6SPaolo Bonzini        xgroup=false
20109d653e6SPaolo Bonzini        continue
20209d653e6SPaolo Bonzini
20309d653e6SPaolo Bonzini    elif $imgopts
20409d653e6SPaolo Bonzini    then
20509d653e6SPaolo Bonzini        IMGOPTS="$r"
20609d653e6SPaolo Bonzini        imgopts=false
20709d653e6SPaolo Bonzini        continue
20809d653e6SPaolo Bonzini    elif $cachemode
20909d653e6SPaolo Bonzini    then
21009d653e6SPaolo Bonzini        CACHEMODE="$r"
21109d653e6SPaolo Bonzini        CACHEMODE_IS_DEFAULT=false
21209d653e6SPaolo Bonzini        cachemode=false
21309d653e6SPaolo Bonzini        continue
21409d653e6SPaolo Bonzini    fi
21509d653e6SPaolo Bonzini
21609d653e6SPaolo Bonzini    xpand=true
21709d653e6SPaolo Bonzini    case "$r"
21809d653e6SPaolo Bonzini    in
21909d653e6SPaolo Bonzini
22009d653e6SPaolo Bonzini        -\? | -h | --help)        # usage
22109d653e6SPaolo Bonzini            echo "Usage: $0 [options] [testlist]"'
22209d653e6SPaolo Bonzini
22309d653e6SPaolo Bonzinicommon options
22409d653e6SPaolo Bonzini    -v                  verbose
22509d653e6SPaolo Bonzini    -d                  debug
22609d653e6SPaolo Bonzini
22709d653e6SPaolo Bonziniimage format options
22809d653e6SPaolo Bonzini    -raw                test raw (default)
22909d653e6SPaolo Bonzini    -bochs              test bochs
23009d653e6SPaolo Bonzini    -cloop              test cloop
23109d653e6SPaolo Bonzini    -parallels          test parallels
23209d653e6SPaolo Bonzini    -qcow               test qcow
23309d653e6SPaolo Bonzini    -qcow2              test qcow2
23409d653e6SPaolo Bonzini    -qed                test qed
23509d653e6SPaolo Bonzini    -vdi                test vdi
23609d653e6SPaolo Bonzini    -vpc                test vpc
23709d653e6SPaolo Bonzini    -vhdx               test vhdx
23809d653e6SPaolo Bonzini    -vmdk               test vmdk
23909d653e6SPaolo Bonzini    -luks               test luks
24009d653e6SPaolo Bonzini
24109d653e6SPaolo Bonziniimage protocol options
24209d653e6SPaolo Bonzini    -file               test file (default)
24309d653e6SPaolo Bonzini    -rbd                test rbd
24409d653e6SPaolo Bonzini    -sheepdog           test sheepdog
24509d653e6SPaolo Bonzini    -nbd                test nbd
24609d653e6SPaolo Bonzini    -ssh                test ssh
24709d653e6SPaolo Bonzini    -nfs                test nfs
24809d653e6SPaolo Bonzini    -vxhs               test vxhs
24909d653e6SPaolo Bonzini
25009d653e6SPaolo Bonziniother options
25109d653e6SPaolo Bonzini    -xdiff              graphical mode diff
25209d653e6SPaolo Bonzini    -nocache            use O_DIRECT on backing file
25309d653e6SPaolo Bonzini    -misalign           misalign memory allocations
25409d653e6SPaolo Bonzini    -n                  show me, do not run tests
25509d653e6SPaolo Bonzini    -o options          -o options to pass to qemu-img create/convert
25609d653e6SPaolo Bonzini    -T                  output timestamps
25709d653e6SPaolo Bonzini    -c mode             cache mode
25809d653e6SPaolo Bonzini
25909d653e6SPaolo Bonzinitestlist options
26009d653e6SPaolo Bonzini    -g group[,group...]        include tests from these groups
26109d653e6SPaolo Bonzini    -x group[,group...]        exclude tests from these groups
26209d653e6SPaolo Bonzini    NNN                        include test NNN
26309d653e6SPaolo Bonzini    NNN-NNN                    include test range (eg. 012-021)
26409d653e6SPaolo Bonzini'
26509d653e6SPaolo Bonzini            exit 0
26609d653e6SPaolo Bonzini            ;;
26709d653e6SPaolo Bonzini
26809d653e6SPaolo Bonzini        -raw)
26909d653e6SPaolo Bonzini            IMGFMT=raw
27009d653e6SPaolo Bonzini            xpand=false
27109d653e6SPaolo Bonzini            ;;
27209d653e6SPaolo Bonzini
27309d653e6SPaolo Bonzini        -bochs)
27409d653e6SPaolo Bonzini            IMGFMT=bochs
27509d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
27609d653e6SPaolo Bonzini            xpand=false
27709d653e6SPaolo Bonzini            ;;
27809d653e6SPaolo Bonzini
27909d653e6SPaolo Bonzini        -cloop)
28009d653e6SPaolo Bonzini            IMGFMT=cloop
28109d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
28209d653e6SPaolo Bonzini            xpand=false
28309d653e6SPaolo Bonzini            ;;
28409d653e6SPaolo Bonzini
28509d653e6SPaolo Bonzini        -parallels)
28609d653e6SPaolo Bonzini            IMGFMT=parallels
28709d653e6SPaolo Bonzini            xpand=false
28809d653e6SPaolo Bonzini            ;;
28909d653e6SPaolo Bonzini
29009d653e6SPaolo Bonzini        -qcow)
29109d653e6SPaolo Bonzini            IMGFMT=qcow
29209d653e6SPaolo Bonzini            xpand=false
29309d653e6SPaolo Bonzini            ;;
29409d653e6SPaolo Bonzini
29509d653e6SPaolo Bonzini        -qcow2)
29609d653e6SPaolo Bonzini            IMGFMT=qcow2
29709d653e6SPaolo Bonzini            xpand=false
29809d653e6SPaolo Bonzini            ;;
29909d653e6SPaolo Bonzini
30009d653e6SPaolo Bonzini        -luks)
30109d653e6SPaolo Bonzini            IMGOPTSSYNTAX=true
30209d653e6SPaolo Bonzini            IMGFMT=luks
30309d653e6SPaolo Bonzini            IMGKEYSECRET=123456
30409d653e6SPaolo Bonzini            xpand=false
30509d653e6SPaolo Bonzini            ;;
30609d653e6SPaolo Bonzini
30709d653e6SPaolo Bonzini        -qed)
30809d653e6SPaolo Bonzini            IMGFMT=qed
30909d653e6SPaolo Bonzini            xpand=false
31009d653e6SPaolo Bonzini            ;;
31109d653e6SPaolo Bonzini
31209d653e6SPaolo Bonzini        -vdi)
31309d653e6SPaolo Bonzini            IMGFMT=vdi
31409d653e6SPaolo Bonzini            xpand=false
31509d653e6SPaolo Bonzini            ;;
31609d653e6SPaolo Bonzini
31709d653e6SPaolo Bonzini        -vmdk)
31809d653e6SPaolo Bonzini            IMGFMT=vmdk
31909d653e6SPaolo Bonzini            xpand=false
32009d653e6SPaolo Bonzini            ;;
32109d653e6SPaolo Bonzini
32209d653e6SPaolo Bonzini        -vpc)
32309d653e6SPaolo Bonzini            IMGFMT=vpc
32409d653e6SPaolo Bonzini            xpand=false
32509d653e6SPaolo Bonzini            ;;
32609d653e6SPaolo Bonzini
32709d653e6SPaolo Bonzini        -vhdx)
32809d653e6SPaolo Bonzini            IMGFMT=vhdx
32909d653e6SPaolo Bonzini            xpand=false
33009d653e6SPaolo Bonzini            ;;
33109d653e6SPaolo Bonzini
33209d653e6SPaolo Bonzini        -file)
33309d653e6SPaolo Bonzini            IMGPROTO=file
33409d653e6SPaolo Bonzini            xpand=false
33509d653e6SPaolo Bonzini            ;;
33609d653e6SPaolo Bonzini
33709d653e6SPaolo Bonzini        -rbd)
33809d653e6SPaolo Bonzini            IMGPROTO=rbd
33909d653e6SPaolo Bonzini            xpand=false
34009d653e6SPaolo Bonzini            ;;
34109d653e6SPaolo Bonzini
34209d653e6SPaolo Bonzini        -sheepdog)
34309d653e6SPaolo Bonzini            IMGPROTO=sheepdog
34409d653e6SPaolo Bonzini            xpand=false
34509d653e6SPaolo Bonzini            ;;
34609d653e6SPaolo Bonzini
34709d653e6SPaolo Bonzini        -nbd)
34809d653e6SPaolo Bonzini            IMGPROTO=nbd
34909d653e6SPaolo Bonzini            xpand=false
35009d653e6SPaolo Bonzini            ;;
35109d653e6SPaolo Bonzini
35209d653e6SPaolo Bonzini        -vxhs)
35309d653e6SPaolo Bonzini            IMGPROTO=vxhs
35409d653e6SPaolo Bonzini            xpand=false
35509d653e6SPaolo Bonzini            ;;
35609d653e6SPaolo Bonzini
35709d653e6SPaolo Bonzini        -ssh)
35809d653e6SPaolo Bonzini            IMGPROTO=ssh
35909d653e6SPaolo Bonzini            xpand=false
36009d653e6SPaolo Bonzini            ;;
36109d653e6SPaolo Bonzini
36209d653e6SPaolo Bonzini        -nfs)
36309d653e6SPaolo Bonzini            IMGPROTO=nfs
36409d653e6SPaolo Bonzini            xpand=false
36509d653e6SPaolo Bonzini            ;;
36609d653e6SPaolo Bonzini
36709d653e6SPaolo Bonzini        -nocache)
36809d653e6SPaolo Bonzini            CACHEMODE="none"
36909d653e6SPaolo Bonzini            CACHEMODE_IS_DEFAULT=false
37009d653e6SPaolo Bonzini            xpand=false
37109d653e6SPaolo Bonzini            ;;
37209d653e6SPaolo Bonzini
37309d653e6SPaolo Bonzini        -misalign)
37409d653e6SPaolo Bonzini            QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
37509d653e6SPaolo Bonzini            xpand=false
37609d653e6SPaolo Bonzini            ;;
37709d653e6SPaolo Bonzini
37809d653e6SPaolo Bonzini        -valgrind)
37909d653e6SPaolo Bonzini            VALGRIND_QEMU='y'
38009d653e6SPaolo Bonzini            xpand=false
38109d653e6SPaolo Bonzini            ;;
38209d653e6SPaolo Bonzini
38309d653e6SPaolo Bonzini        -g)        # -g group ... pick from group file
38409d653e6SPaolo Bonzini            group=true
38509d653e6SPaolo Bonzini            xpand=false
38609d653e6SPaolo Bonzini            ;;
38709d653e6SPaolo Bonzini
38809d653e6SPaolo Bonzini        -xdiff)        # graphical diff mode
38909d653e6SPaolo Bonzini            xpand=false
39009d653e6SPaolo Bonzini
39109d653e6SPaolo Bonzini            if [ ! -z "$DISPLAY" ]
39209d653e6SPaolo Bonzini            then
39309d653e6SPaolo Bonzini                command -v xdiff >/dev/null 2>&1 && diff=xdiff
39409d653e6SPaolo Bonzini                command -v gdiff >/dev/null 2>&1 && diff=gdiff
39509d653e6SPaolo Bonzini                command -v tkdiff >/dev/null 2>&1 && diff=tkdiff
39609d653e6SPaolo Bonzini                command -v xxdiff >/dev/null 2>&1 && diff=xxdiff
39709d653e6SPaolo Bonzini            fi
39809d653e6SPaolo Bonzini            ;;
39909d653e6SPaolo Bonzini
40009d653e6SPaolo Bonzini        -n)        # show me, don't do it
40109d653e6SPaolo Bonzini            showme=true
40209d653e6SPaolo Bonzini            xpand=false
40309d653e6SPaolo Bonzini            ;;
40409d653e6SPaolo Bonzini        -o)
40509d653e6SPaolo Bonzini            imgopts=true
40609d653e6SPaolo Bonzini            xpand=false
40709d653e6SPaolo Bonzini            ;;
40809d653e6SPaolo Bonzini        -c)
40909d653e6SPaolo Bonzini            cachemode=true
41009d653e6SPaolo Bonzini            xpand=false
41109d653e6SPaolo Bonzini            ;;
41209d653e6SPaolo Bonzini        -T)        # turn on timestamp output
41309d653e6SPaolo Bonzini            timestamp=true
41409d653e6SPaolo Bonzini            xpand=false
41509d653e6SPaolo Bonzini            ;;
41609d653e6SPaolo Bonzini
41709d653e6SPaolo Bonzini        -v)
41809d653e6SPaolo Bonzini            verbose=true
41909d653e6SPaolo Bonzini            xpand=false
42009d653e6SPaolo Bonzini            ;;
42109d653e6SPaolo Bonzini        -d)
42209d653e6SPaolo Bonzini            debug=true
42309d653e6SPaolo Bonzini            xpand=false
42409d653e6SPaolo Bonzini            ;;
42509d653e6SPaolo Bonzini        -x)        # -x group ... exclude from group file
42609d653e6SPaolo Bonzini            xgroup=true
42709d653e6SPaolo Bonzini            xpand=false
42809d653e6SPaolo Bonzini            ;;
42909d653e6SPaolo Bonzini        '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
43009d653e6SPaolo Bonzini            echo "No tests?"
43109d653e6SPaolo Bonzini            status=1
43209d653e6SPaolo Bonzini            exit $status
43309d653e6SPaolo Bonzini            ;;
43409d653e6SPaolo Bonzini
43509d653e6SPaolo Bonzini        [0-9]*-[0-9]*)
43609d653e6SPaolo Bonzini            eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
43709d653e6SPaolo Bonzini            ;;
43809d653e6SPaolo Bonzini
43909d653e6SPaolo Bonzini        [0-9]*-)
44009d653e6SPaolo Bonzini            eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
44109d653e6SPaolo Bonzini            end=`echo [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] | sed -e 's/\[0-9]//g' -e 's/  *$//' -e 's/.* //'`
44209d653e6SPaolo Bonzini            if [ -z "$end" ]
44309d653e6SPaolo Bonzini            then
44409d653e6SPaolo Bonzini                echo "No tests in range \"$r\"?"
44509d653e6SPaolo Bonzini                status=1
44609d653e6SPaolo Bonzini                exit $status
44709d653e6SPaolo Bonzini            fi
44809d653e6SPaolo Bonzini            ;;
44909d653e6SPaolo Bonzini
45009d653e6SPaolo Bonzini        *)
45109d653e6SPaolo Bonzini            start=$r
45209d653e6SPaolo Bonzini            end=$r
45309d653e6SPaolo Bonzini            ;;
45409d653e6SPaolo Bonzini
45509d653e6SPaolo Bonzini    esac
45609d653e6SPaolo Bonzini
45709d653e6SPaolo Bonzini    # get rid of leading 0s as can be interpreted as octal
45809d653e6SPaolo Bonzini    start=`echo $start | sed 's/^0*//'`
45909d653e6SPaolo Bonzini    end=`echo $end | sed 's/^0*//'`
46009d653e6SPaolo Bonzini
46109d653e6SPaolo Bonzini    if $xpand
46209d653e6SPaolo Bonzini    then
46309d653e6SPaolo Bonzini        have_test_arg=true
46409d653e6SPaolo Bonzini        awk </dev/null '
46509d653e6SPaolo BonziniBEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
46609d653e6SPaolo Bonzini        | while read id
46709d653e6SPaolo Bonzini        do
46809d653e6SPaolo Bonzini            if grep -s "^$id " "$source_iotests/group" >/dev/null
46909d653e6SPaolo Bonzini            then
47009d653e6SPaolo Bonzini                # in group file ... OK
47109d653e6SPaolo Bonzini                echo $id >>$tmp.list
47209d653e6SPaolo Bonzini            else
47309d653e6SPaolo Bonzini                if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
47409d653e6SPaolo Bonzini                then
47509d653e6SPaolo Bonzini                    # expunged ... will be reported, but not run, later
47609d653e6SPaolo Bonzini                    echo $id >>$tmp.list
47709d653e6SPaolo Bonzini                else
47809d653e6SPaolo Bonzini                    # oops
47909d653e6SPaolo Bonzini                    if [ "$start" == "$end" -a "$id" == "$end" ]
48009d653e6SPaolo Bonzini                    then
48109d653e6SPaolo Bonzini                        echo "$id - unknown test"
48209d653e6SPaolo Bonzini                        exit 1
48309d653e6SPaolo Bonzini                    else
48409d653e6SPaolo Bonzini                        echo "$id - unknown test, ignored"
48509d653e6SPaolo Bonzini                    fi
48609d653e6SPaolo Bonzini                fi
48709d653e6SPaolo Bonzini            fi
48809d653e6SPaolo Bonzini        done || exit 1
48909d653e6SPaolo Bonzini    fi
49009d653e6SPaolo Bonzini
49109d653e6SPaolo Bonzinidone
49209d653e6SPaolo Bonzini
49309d653e6SPaolo Bonzini# Set qemu-io cache mode with $CACHEMODE we have
49409d653e6SPaolo BonziniQEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
49509d653e6SPaolo Bonzini
49609d653e6SPaolo BonziniQEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS"
49709d653e6SPaolo Bonziniif [ "$IMGOPTSSYNTAX" != "true" ]; then
49809d653e6SPaolo Bonzini    QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT"
49909d653e6SPaolo Bonzinifi
50009d653e6SPaolo Bonzini
50109d653e6SPaolo Bonzini# Set default options for qemu-img create -o if they were not specified
50209d653e6SPaolo Bonziniif [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then
50309d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1")
50409d653e6SPaolo Bonzinifi
50509d653e6SPaolo Bonziniif [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then
50609d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10")
50709d653e6SPaolo Bonzinifi
50809d653e6SPaolo Bonzini
50909d653e6SPaolo Bonziniif [ -z "$SAMPLE_IMG_DIR" ]; then
51009d653e6SPaolo Bonzini        SAMPLE_IMG_DIR="$source_iotests/sample_images"
51109d653e6SPaolo Bonzinifi
51209d653e6SPaolo Bonzini
51309d653e6SPaolo Bonziniexport TEST_DIR
51409d653e6SPaolo Bonziniexport SAMPLE_IMG_DIR
51509d653e6SPaolo Bonzini
51609d653e6SPaolo Bonziniif [ -s $tmp.list ]
51709d653e6SPaolo Bonzinithen
51809d653e6SPaolo Bonzini    # found some valid test numbers ... this is good
51909d653e6SPaolo Bonzini    :
52009d653e6SPaolo Bonzinielse
52109d653e6SPaolo Bonzini    if $have_test_arg
52209d653e6SPaolo Bonzini    then
52309d653e6SPaolo Bonzini        # had test numbers, but none in group file ... do nothing
52409d653e6SPaolo Bonzini        touch $tmp.list
52509d653e6SPaolo Bonzini    else
52609d653e6SPaolo Bonzini        # no test numbers, do everything from group file
52709d653e6SPaolo Bonzini        sed -n -e '/^[0-9][0-9][0-9]*/s/[         ].*//p' <"$source_iotests/group" >$tmp.list
52809d653e6SPaolo Bonzini    fi
52909d653e6SPaolo Bonzinifi
53009d653e6SPaolo Bonzini
53109d653e6SPaolo Bonzini# should be sort -n, but this did not work for Linux when this
53209d653e6SPaolo Bonzini# was ported from IRIX
53309d653e6SPaolo Bonzini#
53409d653e6SPaolo Bonzinilist=`sort $tmp.list`
53509d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
53609d653e6SPaolo Bonzini
53709d653e6SPaolo Bonziniif [ -z "$QEMU_PROG" ]
53809d653e6SPaolo Bonzinithen
53909d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu" ]; then
54009d653e6SPaolo Bonzini        export QEMU_PROG="$build_iotests/qemu"
541*96914159SLukáš Doktor    elif [ -x "$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" ]; then
542*96914159SLukáš Doktor        export QEMU_PROG="$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}"
54309d653e6SPaolo Bonzini    else
54409d653e6SPaolo Bonzini        pushd "$build_root" > /dev/null
54509d653e6SPaolo Bonzini        for binary in *-softmmu/qemu-system-*
54609d653e6SPaolo Bonzini        do
54709d653e6SPaolo Bonzini            if [ -x "$binary" ]
54809d653e6SPaolo Bonzini            then
54909d653e6SPaolo Bonzini                export QEMU_PROG="$build_root/$binary"
55009d653e6SPaolo Bonzini                break
55109d653e6SPaolo Bonzini            fi
55209d653e6SPaolo Bonzini        done
55309d653e6SPaolo Bonzini        popd > /dev/null
55409d653e6SPaolo Bonzini        [ "$QEMU_PROG" = "" ] && _init_error "qemu not found"
55509d653e6SPaolo Bonzini    fi
55609d653e6SPaolo Bonzinifi
55763ca8406SEric Blakeexport QEMU_PROG="$(type -p "$QEMU_PROG")"
55809d653e6SPaolo Bonzini
55909d653e6SPaolo Bonziniif [ -z "$QEMU_IMG_PROG" ]; then
56009d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-img" ]; then
56109d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_iotests/qemu-img"
56209d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-img" ]; then
56309d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_root/qemu-img"
56409d653e6SPaolo Bonzini    else
56509d653e6SPaolo Bonzini        _init_error "qemu-img not found"
56609d653e6SPaolo Bonzini    fi
56709d653e6SPaolo Bonzinifi
56863ca8406SEric Blakeexport QEMU_IMG_PROG="$(type -p "$QEMU_IMG_PROG")"
56909d653e6SPaolo Bonzini
57009d653e6SPaolo Bonziniif [ -z "$QEMU_IO_PROG" ]; then
57109d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-io" ]; then
57209d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_iotests/qemu-io"
57309d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-io" ]; then
57409d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_root/qemu-io"
57509d653e6SPaolo Bonzini    else
57609d653e6SPaolo Bonzini        _init_error "qemu-io not found"
57709d653e6SPaolo Bonzini    fi
57809d653e6SPaolo Bonzinifi
57963ca8406SEric Blakeexport QEMU_IO_PROG="$(type -p "$QEMU_IO_PROG")"
58009d653e6SPaolo Bonzini
58109d653e6SPaolo Bonziniif [ -z $QEMU_NBD_PROG ]; then
58209d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-nbd" ]; then
58309d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_iotests/qemu-nbd"
58409d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-nbd" ]; then
58509d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_root/qemu-nbd"
58609d653e6SPaolo Bonzini    else
58709d653e6SPaolo Bonzini        _init_error "qemu-nbd not found"
58809d653e6SPaolo Bonzini    fi
58909d653e6SPaolo Bonzinifi
59063ca8406SEric Blakeexport QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")"
59109d653e6SPaolo Bonzini
59209d653e6SPaolo Bonziniif [ -z "$QEMU_VXHS_PROG" ]; then
59309d653e6SPaolo Bonzini  export QEMU_VXHS_PROG="`set_prog_path qnio_server`"
59409d653e6SPaolo Bonzinifi
59509d653e6SPaolo Bonzini
59609d653e6SPaolo Bonziniif [ -x "$build_iotests/socket_scm_helper" ]
59709d653e6SPaolo Bonzinithen
59809d653e6SPaolo Bonzini    export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper"
59909d653e6SPaolo Bonzinifi
60009d653e6SPaolo Bonzini
60109d653e6SPaolo Bonzinidefault_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p')
60209d653e6SPaolo Bonzinidefault_alias_machine=$($QEMU_PROG -machine help | \
60309d653e6SPaolo Bonzini   sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }")
60409d653e6SPaolo Bonziniif [[ "$default_alias_machine" ]]; then
60509d653e6SPaolo Bonzini    default_machine="$default_alias_machine"
60609d653e6SPaolo Bonzinifi
60709d653e6SPaolo Bonzini
60809d653e6SPaolo Bonziniexport QEMU_DEFAULT_MACHINE="$default_machine"
60989004368SKevin Wolf
61036bd4228SDaniel P. BerrangeTIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT
61136bd4228SDaniel P. Berrange
6126bf19c94SChristoph Hellwig_wallclock()
6136bf19c94SChristoph Hellwig{
6149ee4b6f8SPaolo Bonzini    date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
6156bf19c94SChristoph Hellwig}
6166bf19c94SChristoph Hellwig
6176bf19c94SChristoph Hellwig_timestamp()
6186bf19c94SChristoph Hellwig{
6196bf19c94SChristoph Hellwig    now=`date "+%T"`
620b43671f8SEric Blake    printf %s " [$now]"
6216bf19c94SChristoph Hellwig}
6226bf19c94SChristoph Hellwig
6236bf19c94SChristoph Hellwig_wrapup()
6246bf19c94SChristoph Hellwig{
6256bf19c94SChristoph Hellwig    if $showme
6266bf19c94SChristoph Hellwig    then
6276bf19c94SChristoph Hellwig        :
6286bf19c94SChristoph Hellwig    elif $needwrap
6296bf19c94SChristoph Hellwig    then
63036bd4228SDaniel P. Berrange        if [ -f $TIMESTAMP_FILE -a -f $tmp.time ]
6316bf19c94SChristoph Hellwig        then
63236bd4228SDaniel P. Berrange            cat $TIMESTAMP_FILE $tmp.time \
6339ee4b6f8SPaolo Bonzini            | awk '
6346bf19c94SChristoph Hellwig        { t[$1] = $2 }
6356bf19c94SChristoph HellwigEND        { if (NR > 0) {
6366bf19c94SChristoph Hellwig            for (i in t) print i " " t[i]
6376bf19c94SChristoph Hellwig          }
6386bf19c94SChristoph Hellwig        }' \
6396bf19c94SChristoph Hellwig            | sort -n >$tmp.out
64036bd4228SDaniel P. Berrange            mv $tmp.out $TIMESTAMP_FILE
6416bf19c94SChristoph Hellwig        fi
6426bf19c94SChristoph Hellwig
6436bf19c94SChristoph Hellwig        if [ -f $tmp.expunged ]
6446bf19c94SChristoph Hellwig        then
6456bf19c94SChristoph Hellwig            notrun=`wc -l <$tmp.expunged | sed -e 's/  *//g'`
6466bf19c94SChristoph Hellwig            try=`expr $try - $notrun`
6476bf19c94SChristoph Hellwig            list=`echo "$list" | sed -f $tmp.expunged`
6486bf19c94SChristoph Hellwig        fi
6496bf19c94SChristoph Hellwig
6506bf19c94SChristoph Hellwig        echo "" >>check.log
6516bf19c94SChristoph Hellwig        date >>check.log
6526bf19c94SChristoph Hellwig        echo $list | fmt | sed -e 's/^/    /' >>check.log
6536bf19c94SChristoph Hellwig        $interrupt && echo "Interrupted!" >>check.log
6546bf19c94SChristoph Hellwig
6556bf19c94SChristoph Hellwig        if [ ! -z "$notrun" ]
6566bf19c94SChristoph Hellwig        then
6576bf19c94SChristoph Hellwig            echo "Not run:$notrun"
6586bf19c94SChristoph Hellwig            echo "Not run:$notrun" >>check.log
6596bf19c94SChristoph Hellwig        fi
6606bf19c94SChristoph Hellwig        if [ ! -z "$n_bad" -a $n_bad != 0 ]
6616bf19c94SChristoph Hellwig        then
6626bf19c94SChristoph Hellwig            echo "Failures:$bad"
6636bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests"
6646bf19c94SChristoph Hellwig            echo "Failures:$bad" | fmt >>check.log
6656bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests" >>check.log
6666bf19c94SChristoph Hellwig        else
6676bf19c94SChristoph Hellwig            echo "Passed all $try tests"
6686bf19c94SChristoph Hellwig            echo "Passed all $try tests" >>check.log
6696bf19c94SChristoph Hellwig        fi
6706bf19c94SChristoph Hellwig        needwrap=false
6716bf19c94SChristoph Hellwig    fi
6726bf19c94SChristoph Hellwig
6738803714bSEric Blake    if test -n "$STTY_RESTORE"; then
6748803714bSEric Blake        stty $STTY_RESTORE
6758803714bSEric Blake    fi
6760145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time
6770145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts
6786bf19c94SChristoph Hellwig    rm -f $tmp.*
6796bf19c94SChristoph Hellwig}
6806bf19c94SChristoph Hellwig
6816bf19c94SChristoph Hellwigtrap "_wrapup; exit \$status" 0 1 2 3 15
6826bf19c94SChristoph Hellwig
68336bd4228SDaniel P. Berrange[ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE
6846bf19c94SChristoph Hellwig
6856bf19c94SChristoph HellwigFULL_IMGFMT_DETAILS=`_full_imgfmt_details`
6866bf19c94SChristoph HellwigFULL_HOST_DETAILS=`_full_platform_details`
6876bf19c94SChristoph Hellwig
6886bf19c94SChristoph Hellwigcat <<EOF
689934659c4SMax ReitzQEMU          -- "$QEMU_PROG" $QEMU_OPTIONS
690934659c4SMax ReitzQEMU_IMG      -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
691934659c4SMax ReitzQEMU_IO       -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
692934659c4SMax ReitzQEMU_NBD      -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
6936bf19c94SChristoph HellwigIMGFMT        -- $FULL_IMGFMT_DETAILS
694657c572aSCleber RosaIMGPROTO      -- $IMGPROTO
6956bf19c94SChristoph HellwigPLATFORM      -- $FULL_HOST_DETAILS
696b8aff7d6SFam ZhengTEST_DIR      -- $TEST_DIR
69730b005d9SWenchao XiaSOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
6986bf19c94SChristoph Hellwig
6996bf19c94SChristoph HellwigEOF
7006bf19c94SChristoph Hellwig
7016bf19c94SChristoph Hellwigseq="check"
7026bf19c94SChristoph Hellwig
7036bf19c94SChristoph Hellwig[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
7046bf19c94SChristoph Hellwig
7056bf19c94SChristoph Hellwigfor seq in $list
7066bf19c94SChristoph Hellwigdo
7076bf19c94SChristoph Hellwig    err=false
708b43671f8SEric Blake    printf %s "$seq"
7096bf19c94SChristoph Hellwig    if [ -n "$TESTS_REMAINING_LOG" ] ; then
7106bf19c94SChristoph Hellwig        sed -e "s/$seq//" -e 's/  / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp
7116bf19c94SChristoph Hellwig        mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG
7126bf19c94SChristoph Hellwig        sync
7136bf19c94SChristoph Hellwig    fi
7146bf19c94SChristoph Hellwig
7156bf19c94SChristoph Hellwig    if $showme
7166bf19c94SChristoph Hellwig    then
7176bf19c94SChristoph Hellwig        echo
7186bf19c94SChristoph Hellwig        continue
7196bf19c94SChristoph Hellwig    elif [ -f expunged ] && $expunge && egrep "^$seq([         ]|\$)" expunged >/dev/null
7206bf19c94SChristoph Hellwig    then
7216bf19c94SChristoph Hellwig        echo " - expunged"
7226bf19c94SChristoph Hellwig        rm -f $seq.out.bad
7236bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
724e8f8624dSMax Reitz    elif [ ! -f "$source_iotests/$seq" ]
7256bf19c94SChristoph Hellwig    then
7266bf19c94SChristoph Hellwig        echo " - no such test?"
7276bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
7286bf19c94SChristoph Hellwig    else
7296bf19c94SChristoph Hellwig        # really going to try and run this one
7306bf19c94SChristoph Hellwig        #
7316bf19c94SChristoph Hellwig        rm -f $seq.out.bad
73236bd4228SDaniel P. Berrange        lasttime=`sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE`
7336bf19c94SChristoph Hellwig        if [ "X$lasttime" != X ]; then
734b43671f8SEric Blake                printf %s " ${lasttime}s ..."
7356bf19c94SChristoph Hellwig        else
736b43671f8SEric Blake                printf "        "        # prettier output with timestamps.
7376bf19c94SChristoph Hellwig        fi
7386bf19c94SChristoph Hellwig        rm -f core $seq.notrun
7396bf19c94SChristoph Hellwig
7406bf19c94SChristoph Hellwig        start=`_wallclock`
741b43671f8SEric Blake        $timestamp && printf %s "        [$(date "+%T")]"
742ea81ca9dSMax Reitz
743ea81ca9dSMax Reitz        if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python" ]; then
744ea81ca9dSMax Reitz            run_command="$PYTHON $seq"
745ea81ca9dSMax Reitz        else
746ea81ca9dSMax Reitz            run_command="./$seq"
747ea81ca9dSMax Reitz        fi
748e8f8624dSMax Reitz        export OUTPUT_DIR=$PWD
749aa4f592aSFam Zheng        if $debug; then
750aa4f592aSFam Zheng            (cd "$source_iotests";
751aa4f592aSFam Zheng            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
752aa4f592aSFam Zheng                    $run_command -d 2>&1 | tee $tmp.out)
753aa4f592aSFam Zheng        else
754e8f8624dSMax Reitz            (cd "$source_iotests";
75504129606SStefan Hajnoczi            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
756ea81ca9dSMax Reitz                    $run_command >$tmp.out 2>&1)
757aa4f592aSFam Zheng        fi
7586bf19c94SChristoph Hellwig        sts=$?
7596bf19c94SChristoph Hellwig        $timestamp && _timestamp
7606bf19c94SChristoph Hellwig        stop=`_wallclock`
7616bf19c94SChristoph Hellwig
7626bf19c94SChristoph Hellwig        if [ -f core ]
7636bf19c94SChristoph Hellwig        then
764b43671f8SEric Blake            printf " [dumped core]"
7656bf19c94SChristoph Hellwig            mv core $seq.core
7666bf19c94SChristoph Hellwig            err=true
7676bf19c94SChristoph Hellwig        fi
7686bf19c94SChristoph Hellwig
7696bf19c94SChristoph Hellwig        if [ -f $seq.notrun ]
7706bf19c94SChristoph Hellwig        then
771b43671f8SEric Blake            $timestamp || printf " [not run] "
772b43671f8SEric Blake            $timestamp && echo " [not run]" && printf %s "        $seq -- "
7736bf19c94SChristoph Hellwig            cat $seq.notrun
7746bf19c94SChristoph Hellwig            notrun="$notrun $seq"
7756bf19c94SChristoph Hellwig        else
7766bf19c94SChristoph Hellwig            if [ $sts -ne 0 ]
7776bf19c94SChristoph Hellwig            then
778b43671f8SEric Blake                printf %s " [failed, exit status $sts]"
7796bf19c94SChristoph Hellwig                err=true
7806bf19c94SChristoph Hellwig            fi
7818f94b077SKevin Wolf
782e8f8624dSMax Reitz            reference="$source_iotests/$seq.out"
783e166b414SBo Tu            reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out"
784e166b414SBo Tu            if [ -f "$reference_machine" ]; then
785e166b414SBo Tu                reference="$reference_machine"
786e166b414SBo Tu            fi
787e166b414SBo Tu
788217a0683SStefan Hajnoczi            reference_format="$source_iotests/$seq.out.$IMGFMT"
789217a0683SStefan Hajnoczi            if [ -f "$reference_format" ]; then
790217a0683SStefan Hajnoczi                reference="$reference_format"
791217a0683SStefan Hajnoczi            fi
792217a0683SStefan Hajnoczi
7933baa8449SFam Zheng            if [ "$CACHEMODE" = "none" ]; then
794e8f8624dSMax Reitz                [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
7958f94b077SKevin Wolf            fi
7968f94b077SKevin Wolf
797e8f8624dSMax Reitz            if [ ! -f "$reference" ]
7986bf19c94SChristoph Hellwig            then
7996bf19c94SChristoph Hellwig                echo " - no qualified output"
8006bf19c94SChristoph Hellwig                err=true
8016bf19c94SChristoph Hellwig            else
802e8f8624dSMax Reitz                if diff -w "$reference" $tmp.out >/dev/null 2>&1
8036bf19c94SChristoph Hellwig                then
8046bf19c94SChristoph Hellwig                    echo ""
8056bf19c94SChristoph Hellwig                    if $err
8066bf19c94SChristoph Hellwig                    then
8076bf19c94SChristoph Hellwig                        :
8086bf19c94SChristoph Hellwig                    else
8096bf19c94SChristoph Hellwig                        echo "$seq `expr $stop - $start`" >>$tmp.time
8106bf19c94SChristoph Hellwig                    fi
8116bf19c94SChristoph Hellwig                else
8126bf19c94SChristoph Hellwig                    echo " - output mismatch (see $seq.out.bad)"
8136bf19c94SChristoph Hellwig                    mv $tmp.out $seq.out.bad
81463ca8406SEric Blake                    $diff -w "$reference" "$PWD"/$seq.out.bad
8156bf19c94SChristoph Hellwig                    err=true
8166bf19c94SChristoph Hellwig                fi
8176bf19c94SChristoph Hellwig            fi
8186bf19c94SChristoph Hellwig        fi
8196bf19c94SChristoph Hellwig
8206bf19c94SChristoph Hellwig    fi
8216bf19c94SChristoph Hellwig
8226bf19c94SChristoph Hellwig    # come here for each test, except when $showme is true
8236bf19c94SChristoph Hellwig    #
8246bf19c94SChristoph Hellwig    if $err
8256bf19c94SChristoph Hellwig    then
8266bf19c94SChristoph Hellwig        bad="$bad $seq"
8276bf19c94SChristoph Hellwig        n_bad=`expr $n_bad + 1`
8286bf19c94SChristoph Hellwig        quick=false
8296bf19c94SChristoph Hellwig    fi
8306bf19c94SChristoph Hellwig    [ -f $seq.notrun ] || try=`expr $try + 1`
8316bf19c94SChristoph Hellwig
8326bf19c94SChristoph Hellwig    seq="after_$seq"
8336bf19c94SChristoph Hellwigdone
8346bf19c94SChristoph Hellwig
8356bf19c94SChristoph Hellwiginterrupt=false
8366bf19c94SChristoph Hellwigstatus=`expr $n_bad`
8376bf19c94SChristoph Hellwigexit
838