提交 934659c4 编写于 作者: M Max Reitz 提交者: Kevin Wolf

iotests: Do not suppress segfaults in bash tests

Currently, if a qemu/qemu-io/qemu-img/qemu-nbd invocation receives a
segmentation fault, that message is invisible in most cases since the
output is generally filtered and bash suppresses the segmentation fault
notice for any but the last element of a pipe.

Most of the time, the test will then fail anyway because of missing
output, but not necessarily (as happened with test 82 recently).

Fix this by making the corresponding environment variables point to
wrapper functions which execute the respective command in a subshell.

Giving options to qemu/qemu-io/qemu-img and path names with spaces were
broken for the Python tests; this patch "accidentally" fixes that.
Signed-off-by: NMax Reitz <mreitz@redhat.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 0ed82f7a
...@@ -47,13 +47,6 @@ _supported_os Linux ...@@ -47,13 +47,6 @@ _supported_os Linux
_default_cache_mode "writethrough" _default_cache_mode "writethrough"
_supported_cache_modes "writethrough" _supported_cache_modes "writethrough"
_subshell_exec()
{
# Executing crashing commands in a subshell prevents information like the
# "Killed" line from being lost
(exec "$@")
}
size=128M size=128M
echo echo
...@@ -74,8 +67,8 @@ echo "== Creating a dirty image file ==" ...@@ -74,8 +67,8 @@ echo "== Creating a dirty image file =="
IMGOPTS="compat=1.1,lazy_refcounts=on" IMGOPTS="compat=1.1,lazy_refcounts=on"
_make_test_img $size _make_test_img $size
_subshell_exec $QEMU_IO -c "write -P 0x5a 0 512" \ $QEMU_IO -c "write -P 0x5a 0 512" \
-c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \
| _filter_qemu_io | _filter_qemu_io
# The dirty bit must be set # The dirty bit must be set
...@@ -109,8 +102,8 @@ echo "== Opening a dirty image read/write should repair it ==" ...@@ -109,8 +102,8 @@ echo "== Opening a dirty image read/write should repair it =="
IMGOPTS="compat=1.1,lazy_refcounts=on" IMGOPTS="compat=1.1,lazy_refcounts=on"
_make_test_img $size _make_test_img $size
_subshell_exec $QEMU_IO -c "write -P 0x5a 0 512" \ $QEMU_IO -c "write -P 0x5a 0 512" \
-c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \
| _filter_qemu_io | _filter_qemu_io
# The dirty bit must be set # The dirty bit must be set
...@@ -127,8 +120,8 @@ echo "== Creating an image file with lazy_refcounts=off ==" ...@@ -127,8 +120,8 @@ echo "== Creating an image file with lazy_refcounts=off =="
IMGOPTS="compat=1.1,lazy_refcounts=off" IMGOPTS="compat=1.1,lazy_refcounts=off"
_make_test_img $size _make_test_img $size
_subshell_exec $QEMU_IO -c "write -P 0x5a 0 512" \ $QEMU_IO -c "write -P 0x5a 0 512" \
-c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \
| _filter_qemu_io | _filter_qemu_io
# The dirty bit must not be set since lazy_refcounts=off # The dirty bit must not be set since lazy_refcounts=off
......
...@@ -11,7 +11,7 @@ No errors were found on the image. ...@@ -11,7 +11,7 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
wrote 512/512 bytes at offset 0 wrote 512/512 bytes at offset 0
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
./039: Killed ( exec "$@" ) ./common.config: Killed ( exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@" )
incompatible_features 0x1 incompatible_features 0x1
ERROR cluster 5 refcount=0 reference=1 ERROR cluster 5 refcount=0 reference=1
ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0 ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
...@@ -46,7 +46,7 @@ read 512/512 bytes at offset 0 ...@@ -46,7 +46,7 @@ read 512/512 bytes at offset 0
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
wrote 512/512 bytes at offset 0 wrote 512/512 bytes at offset 0
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
./039: Killed ( exec "$@" ) ./common.config: Killed ( exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@" )
incompatible_features 0x1 incompatible_features 0x1
ERROR cluster 5 refcount=0 reference=1 ERROR cluster 5 refcount=0 reference=1
Rebuilding refcount structure Rebuilding refcount structure
...@@ -60,7 +60,7 @@ incompatible_features 0x0 ...@@ -60,7 +60,7 @@ incompatible_features 0x0
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
wrote 512/512 bytes at offset 0 wrote 512/512 bytes at offset 0
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
./039: Killed ( exec "$@" ) ./common.config: Killed ( exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@" )
incompatible_features 0x0 incompatible_features 0x0
No errors were found on the image. No errors were found on the image.
......
...@@ -58,7 +58,8 @@ echo ...@@ -58,7 +58,8 @@ echo
echo "=== Testing dirty version downgrade ===" echo "=== Testing dirty version downgrade ==="
echo echo
IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
$QEMU_IO -c "write -P 0x2a 0 128k" -c flush -c abort "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "write -P 0x2a 0 128k" -c flush -c abort "$TEST_IMG" 2>&1 \
| _filter_qemu_io
$PYTHON qcow2.py "$TEST_IMG" dump-header $PYTHON qcow2.py "$TEST_IMG" dump-header
$QEMU_IMG amend -o "compat=0.10" "$TEST_IMG" $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
$PYTHON qcow2.py "$TEST_IMG" dump-header $PYTHON qcow2.py "$TEST_IMG" dump-header
...@@ -91,7 +92,8 @@ echo ...@@ -91,7 +92,8 @@ echo
echo "=== Testing dirty lazy_refcounts=off ===" echo "=== Testing dirty lazy_refcounts=off ==="
echo echo
IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
$QEMU_IO -c "write -P 0x2a 0 128k" -c flush -c abort "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "write -P 0x2a 0 128k" -c flush -c abort "$TEST_IMG" 2>&1 \
| _filter_qemu_io
$PYTHON qcow2.py "$TEST_IMG" dump-header $PYTHON qcow2.py "$TEST_IMG" dump-header
$QEMU_IMG amend -o "lazy_refcounts=off" "$TEST_IMG" $QEMU_IMG amend -o "lazy_refcounts=off" "$TEST_IMG"
$PYTHON qcow2.py "$TEST_IMG" dump-header $PYTHON qcow2.py "$TEST_IMG" dump-header
......
...@@ -57,6 +57,7 @@ No errors were found on the image. ...@@ -57,6 +57,7 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
wrote 131072/131072 bytes at offset 0 wrote 131072/131072 bytes at offset 0
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
./common.config: Aborted (core dumped) ( exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@" )
magic 0x514649fb magic 0x514649fb
version 3 version 3
backing_file_offset 0x0 backing_file_offset 0x0
...@@ -214,6 +215,7 @@ No errors were found on the image. ...@@ -214,6 +215,7 @@ No errors were found on the image.
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
wrote 131072/131072 bytes at offset 0 wrote 131072/131072 bytes at offset 0
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
./common.config: Aborted (core dumped) ( exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@" )
magic 0x514649fb magic 0x514649fb
version 3 version 3
backing_file_offset 0x0 backing_file_offset 0x0
......
...@@ -231,10 +231,10 @@ FULL_HOST_DETAILS=`_full_platform_details` ...@@ -231,10 +231,10 @@ FULL_HOST_DETAILS=`_full_platform_details`
#FULL_MOUNT_OPTIONS=`_scratch_mount_options` #FULL_MOUNT_OPTIONS=`_scratch_mount_options`
cat <<EOF cat <<EOF
QEMU -- $QEMU QEMU -- "$QEMU_PROG" $QEMU_OPTIONS
QEMU_IMG -- $QEMU_IMG QEMU_IMG -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
QEMU_IO -- $QEMU_IO QEMU_IO -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
QEMU_NBD -- $QEMU_NBD QEMU_NBD -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
IMGFMT -- $FULL_IMGFMT_DETAILS IMGFMT -- $FULL_IMGFMT_DETAILS
IMGPROTO -- $FULL_IMGPROTO_DETAILS IMGPROTO -- $FULL_IMGPROTO_DETAILS
PLATFORM -- $FULL_HOST_DETAILS PLATFORM -- $FULL_HOST_DETAILS
......
...@@ -103,10 +103,31 @@ if [ -z "$QEMU_NBD_PROG" ]; then ...@@ -103,10 +103,31 @@ if [ -z "$QEMU_NBD_PROG" ]; then
export QEMU_NBD_PROG="`set_prog_path qemu-nbd`" export QEMU_NBD_PROG="`set_prog_path qemu-nbd`"
fi fi
export QEMU="$QEMU_PROG $QEMU_OPTIONS" _qemu_wrapper()
export QEMU_IMG=$QEMU_IMG_PROG {
export QEMU_IO="$QEMU_IO_PROG $QEMU_IO_OPTIONS" (exec "$QEMU_PROG" $QEMU_OPTIONS "$@")
export QEMU_NBD=$QEMU_NBD_PROG }
_qemu_img_wrapper()
{
(exec "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS "$@")
}
_qemu_io_wrapper()
{
(exec "$QEMU_IO_PROG" $QEMU_IO_OPTIONS "$@")
}
_qemu_nbd_wrapper()
{
(exec "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS "$@")
}
export QEMU=_qemu_wrapper
export QEMU_IMG=_qemu_img_wrapper
export QEMU_IO=_qemu_io_wrapper
export QEMU_NBD=_qemu_nbd_wrapper
default_machine=$($QEMU -machine \? | awk '/(default)/{print $1}') default_machine=$($QEMU -machine \? | awk '/(default)/{print $1}')
default_alias_machine=$($QEMU -machine \? |\ default_alias_machine=$($QEMU -machine \? |\
awk -v var_default_machine="$default_machine"\)\ awk -v var_default_machine="$default_machine"\)\
......
...@@ -439,7 +439,17 @@ _unsupported_imgopts() ...@@ -439,7 +439,17 @@ _unsupported_imgopts()
# #
_require_command() _require_command()
{ {
eval c=\$$1 if [ "$1" = "QEMU" ]; then
c=$QEMU_PROG
elif [ "$1" = "QEMU_IMG" ]; then
c=$QEMU_IMG_PROG
elif [ "$1" = "QEMU_IO" ]; then
c=$QEMU_IO_PROG
elif [ "$1" = "QEMU_NBD" ]; then
c=$QEMU_NBD_PROG
else
eval c=\$$1
fi
[ -x "$c" ] || _notrun "$1 utility required, skipped this test" [ -x "$c" ] || _notrun "$1 utility required, skipped this test"
} }
......
...@@ -31,11 +31,19 @@ import struct ...@@ -31,11 +31,19 @@ import struct
__all__ = ['imgfmt', 'imgproto', 'test_dir' 'qemu_img', 'qemu_io', __all__ = ['imgfmt', 'imgproto', 'test_dir' 'qemu_img', 'qemu_io',
'VM', 'QMPTestCase', 'notrun', 'main'] 'VM', 'QMPTestCase', 'notrun', 'main']
# This will not work if arguments or path contain spaces but is necessary if we # This will not work if arguments contain spaces but is necessary if we
# want to support the override options that ./check supports. # want to support the override options that ./check supports.
qemu_img_args = os.environ.get('QEMU_IMG', 'qemu-img').strip().split(' ') qemu_img_args = [os.environ.get('QEMU_IMG_PROG', 'qemu-img')]
qemu_io_args = os.environ.get('QEMU_IO', 'qemu-io').strip().split(' ') if os.environ.get('QEMU_IMG_OPTIONS'):
qemu_args = os.environ.get('QEMU', 'qemu').strip().split(' ') qemu_img_args += os.environ['QEMU_IMG_OPTIONS'].strip().split(' ')
qemu_io_args = [os.environ.get('QEMU_IO_PROG', 'qemu-io')]
if os.environ.get('QEMU_IO_OPTIONS'):
qemu_io_args += os.environ['QEMU_IO_OPTIONS'].strip().split(' ')
qemu_args = [os.environ.get('QEMU_PROG', 'qemu')]
if os.environ.get('QEMU_OPTIONS'):
qemu_args += os.environ['QEMU_OPTIONS'].strip().split(' ')
imgfmt = os.environ.get('IMGFMT', 'raw') imgfmt = os.environ.get('IMGFMT', 'raw')
imgproto = os.environ.get('IMGPROTO', 'file') imgproto = os.environ.get('IMGPROTO', 'file')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册