[v2,10/21] iotests: Replace IMGOPTS= by -o
diff mbox series

Message ID 20191015142729.18123-11-mreitz@redhat.com
State New
Headers show
Series
  • iotests: Allow ./check -o data_file
Related show

Commit Message

Max Reitz Oct. 15, 2019, 2:27 p.m. UTC
Tests should not overwrite all user-supplied image options, but only add
to it (which will effectively overwrite conflicting values).  Accomplish
this by passing options to _make_test_img via -o instead of $IMGOPTS.

For some tests, there is no functional change because they already only
appended options to IMGOPTS.  For these, this patch is just a
simplification.

For others, this is a change, so they now heed user-specified $IMGOPTS.
Some of those tests do not work with all image options, though, so we
need to disable them accordingly.

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 tests/qemu-iotests/031 |  9 ++++---
 tests/qemu-iotests/039 | 24 ++++++------------
 tests/qemu-iotests/059 | 18 ++++++-------
 tests/qemu-iotests/060 |  6 ++---
 tests/qemu-iotests/061 | 57 ++++++++++++++++++++++--------------------
 tests/qemu-iotests/079 |  3 +--
 tests/qemu-iotests/106 |  2 +-
 tests/qemu-iotests/108 |  2 +-
 tests/qemu-iotests/112 | 32 ++++++++++++------------
 tests/qemu-iotests/115 |  3 +--
 tests/qemu-iotests/121 |  6 ++---
 tests/qemu-iotests/125 |  2 +-
 tests/qemu-iotests/137 |  2 +-
 tests/qemu-iotests/138 |  3 +--
 tests/qemu-iotests/175 |  2 +-
 tests/qemu-iotests/190 |  2 +-
 tests/qemu-iotests/191 |  3 +--
 tests/qemu-iotests/220 |  4 ++-
 tests/qemu-iotests/243 |  6 +++--
 tests/qemu-iotests/244 | 10 +++++---
 tests/qemu-iotests/250 |  3 +--
 tests/qemu-iotests/265 |  2 +-
 22 files changed, 100 insertions(+), 101 deletions(-)

Comments

Maxim Levitsky Nov. 6, 2019, 3:47 p.m. UTC | #1
On Tue, 2019-10-15 at 16:27 +0200, Max Reitz wrote:
> Tests should not overwrite all user-supplied image options, but only add
> to it (which will effectively overwrite conflicting values).  Accomplish
> this by passing options to _make_test_img via -o instead of $IMGOPTS.
> 
> For some tests, there is no functional change because they already only
> appended options to IMGOPTS.  For these, this patch is just a
> simplification.
> 
> For others, this is a change, so they now heed user-specified $IMGOPTS.
> Some of those tests do not work with all image options, though, so we
> need to disable them accordingly.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  tests/qemu-iotests/031 |  9 ++++---
>  tests/qemu-iotests/039 | 24 ++++++------------
>  tests/qemu-iotests/059 | 18 ++++++-------
>  tests/qemu-iotests/060 |  6 ++---
>  tests/qemu-iotests/061 | 57 ++++++++++++++++++++++--------------------
>  tests/qemu-iotests/079 |  3 +--
>  tests/qemu-iotests/106 |  2 +-
>  tests/qemu-iotests/108 |  2 +-
>  tests/qemu-iotests/112 | 32 ++++++++++++------------
>  tests/qemu-iotests/115 |  3 +--
>  tests/qemu-iotests/121 |  6 ++---
>  tests/qemu-iotests/125 |  2 +-
>  tests/qemu-iotests/137 |  2 +-
>  tests/qemu-iotests/138 |  3 +--
>  tests/qemu-iotests/175 |  2 +-
>  tests/qemu-iotests/190 |  2 +-
>  tests/qemu-iotests/191 |  3 +--
>  tests/qemu-iotests/220 |  4 ++-
>  tests/qemu-iotests/243 |  6 +++--
>  tests/qemu-iotests/244 | 10 +++++---
>  tests/qemu-iotests/250 |  3 +--
>  tests/qemu-iotests/265 |  2 +-
>  22 files changed, 100 insertions(+), 101 deletions(-)
> 



> diff --git a/tests/qemu-iotests/031 b/tests/qemu-iotests/031
> index a3c25ec237..c44fcf91bb 100755
> --- a/tests/qemu-iotests/031
> +++ b/tests/qemu-iotests/031
> @@ -40,19 +40,22 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
>  # This tests qcow2-specific low-level functionality
>  _supported_fmt qcow2
>  _supported_proto file
> +# We want to test compat=0.10, which does not support refcount widths
> +# other than 16
> +_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
In theory the test could be cloned to only restrict refcount_bits to 16 for the 0.10 version
but this is probably not worth it given the nature of the test.

>  
>  CLUSTER_SIZE=65536
>  
>  # qcow2.py output depends on the exact options used, so override the command
>  # line here as an exception
> -for IMGOPTS in "compat=0.10" "compat=1.1"; do
> +for compat in "compat=0.10" "compat=1.1"; do
>  
>      echo
> -    echo ===== Testing with -o $IMGOPTS =====
> +    echo ===== Testing with -o $compat =====
>      echo
>      echo === Create image with unknown header extension ===
>      echo
> -    _make_test_img 64M
> +    _make_test_img -o $compat 64M
>      $PYTHON qcow2.py "$TEST_IMG" add-header-ext 0x12345678 "This is a test header extension"
>      $PYTHON qcow2.py "$TEST_IMG" dump-header
>      _check_test_img
> 


> diff --git a/tests/qemu-iotests/039 b/tests/qemu-iotests/039
> index 325da63a4c..99563bf126 100755
> --- a/tests/qemu-iotests/039
> +++ b/tests/qemu-iotests/039
> @@ -50,8 +50,7 @@ size=128M
>  echo
>  echo "== Checking that image is clean on shutdown =="
>  
> -IMGOPTS="compat=1.1,lazy_refcounts=on"
> -_make_test_img $size
> +_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
>  
>  $QEMU_IO -c "write -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io
>  
> @@ -62,8 +61,7 @@ _check_test_img
>  echo
>  echo "== Creating a dirty image file =="
>  
> -IMGOPTS="compat=1.1,lazy_refcounts=on"
> -_make_test_img $size
> +_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
>  
>  _NO_VALGRIND \
>  $QEMU_IO -c "write -P 0x5a 0 512" \
> @@ -98,8 +96,7 @@ $QEMU_IO -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io
>  echo
>  echo "== Opening a dirty image read/write should repair it =="
>  
> -IMGOPTS="compat=1.1,lazy_refcounts=on"
> -_make_test_img $size
> +_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
>  
>  _NO_VALGRIND \
>  $QEMU_IO -c "write -P 0x5a 0 512" \
> @@ -117,8 +114,7 @@ $PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
>  echo
>  echo "== Creating an image file with lazy_refcounts=off =="
>  
> -IMGOPTS="compat=1.1,lazy_refcounts=off"
> -_make_test_img $size
> +_make_test_img -o "compat=1.1,lazy_refcounts=off" $size
>  
>  _NO_VALGRIND \
>  $QEMU_IO -c "write -P 0x5a 0 512" \
> @@ -132,11 +128,9 @@ _check_test_img
>  echo
>  echo "== Committing to a backing file with lazy_refcounts=on =="
>  
> -IMGOPTS="compat=1.1,lazy_refcounts=on"
> -TEST_IMG="$TEST_IMG".base _make_test_img $size
> +TEST_IMG="$TEST_IMG".base _make_test_img -o "compat=1.1,lazy_refcounts=on" $size
>  
> -IMGOPTS="compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base"
> -_make_test_img $size
> +_make_test_img -o "compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base" $size
>  
>  $QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IMG commit "$TEST_IMG"
> @@ -151,8 +145,7 @@ TEST_IMG="$TEST_IMG".base _check_test_img
>  echo
>  echo "== Changing lazy_refcounts setting at runtime =="
>  
> -IMGOPTS="compat=1.1,lazy_refcounts=off"
> -_make_test_img $size
> +_make_test_img -o "compat=1.1,lazy_refcounts=off" $size
>  
>  _NO_VALGRIND \
>  $QEMU_IO -c "reopen -o lazy-refcounts=on" \
> @@ -164,8 +157,7 @@ $QEMU_IO -c "reopen -o lazy-refcounts=on" \
>  $PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
>  _check_test_img
>  
> -IMGOPTS="compat=1.1,lazy_refcounts=on"
> -_make_test_img $size
> +_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
>  
>  _NO_VALGRIND \
>  $QEMU_IO -c "reopen -o lazy-refcounts=off" \
Looks good.



> diff --git a/tests/qemu-iotests/059 b/tests/qemu-iotests/059
> index 10bfbaecec..3941c3f0c2 100755
> --- a/tests/qemu-iotests/059
> +++ b/tests/qemu-iotests/059
> @@ -70,18 +70,18 @@ poke_file "$TEST_IMG" "$grain_table_size_offset" "\x01\x00\x00\x00"
>  
>  echo
>  echo "=== Testing monolithicFlat creation and opening ==="
> -IMGOPTS="subformat=monolithicFlat" _make_test_img 2G
> +_make_test_img -o "subformat=monolithicFlat" 2G
>  _img_info
>  _cleanup_test_img
>  
>  echo
>  echo "=== Testing monolithicFlat with zeroed_grain ==="
> -IMGOPTS="subformat=monolithicFlat,zeroed_grain=on" _make_test_img 2G
> +_make_test_img -o "subformat=monolithicFlat,zeroed_grain=on" 2G
>  _cleanup_test_img
>  
>  echo
>  echo "=== Testing big twoGbMaxExtentFlat ==="
> -IMGOPTS="subformat=twoGbMaxExtentFlat" _make_test_img 1000G
> +_make_test_img -o "subformat=twoGbMaxExtentFlat" 1000G
>  $QEMU_IMG info $TEST_IMG | _filter_testdir | sed -e 's/cid: [0-9]*/cid: XXXXXXXX/'
>  _cleanup_test_img
>  
> @@ -101,13 +101,13 @@ _img_info
>  
>  echo
>  echo "=== Testing truncated sparse ==="
> -IMGOPTS="subformat=monolithicSparse" _make_test_img 100G
> +_make_test_img -o "subformat=monolithicSparse" 100G
>  truncate -s 10M $TEST_IMG
>  _img_info
>  
>  echo
>  echo "=== Converting to streamOptimized from image with small cluster size==="
> -TEST_IMG="$TEST_IMG.qcow2" IMGFMT=qcow2 IMGOPTS="cluster_size=4096" _make_test_img 1G
> +TEST_IMG="$TEST_IMG.qcow2" IMGFMT=qcow2 _make_test_img -o "cluster_size=4096" 1G
>  $QEMU_IO -f qcow2 -c "write -P 0xa 0 512" "$TEST_IMG.qcow2" | _filter_qemu_io
>  $QEMU_IO -f qcow2 -c "write -P 0xb 10240 512" "$TEST_IMG.qcow2" | _filter_qemu_io
>  $QEMU_IMG convert -f qcow2 -O vmdk -o subformat=streamOptimized "$TEST_IMG.qcow2" "$TEST_IMG" 2>&1
> @@ -117,7 +117,7 @@ echo "=== Testing monolithicFlat with internally generated JSON file name ==="
>  
>  echo '--- blkdebug ---'
>  # Should work, because bdrv_dirname() works fine with blkdebug
> -IMGOPTS="subformat=monolithicFlat" _make_test_img 64M
> +_make_test_img -o "subformat=monolithicFlat" 64M
>  $QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.image.filename=$TEST_IMG,file.inject-error.0.event=read_aio" \
>           -c info \
>      2>&1 \
> @@ -126,7 +126,7 @@ _cleanup_test_img
>  
>  echo '--- quorum ---'
>  # Should not work, because bdrv_dirname() does not work with quorum
> -IMGOPTS="subformat=monolithicFlat" _make_test_img 64M
> +_make_test_img -o "subformat=monolithicFlat" 64M
>  cp "$TEST_IMG" "$TEST_IMG.orig"
>  
>  filename="json:{
> @@ -161,7 +161,7 @@ _cleanup_test_img
>  
>  echo
>  echo "=== Testing 4TB monolithicFlat creation and IO ==="
> -IMGOPTS="subformat=monolithicFlat" _make_test_img 4T
> +_make_test_img -o "subformat=monolithicFlat" 4T
>  _img_info
>  $QEMU_IO -c "write -P 0xa 900G 512" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IO -c "read -v 900G 1024" "$TEST_IMG" | _filter_qemu_io
> @@ -170,7 +170,7 @@ _cleanup_test_img
>  echo
>  echo "=== Testing qemu-img map on extents ==="
>  for fmt in monolithicSparse twoGbMaxExtentSparse; do
> -    IMGOPTS="subformat=$fmt" _make_test_img 31G
> +    _make_test_img -o "subformat=$fmt" 31G
>      $QEMU_IO -c "write 65024 1k" "$TEST_IMG" | _filter_qemu_io
>      $QEMU_IO -c "write 2147483136 1k" "$TEST_IMG" | _filter_qemu_io
>      $QEMU_IO -c "write 5G 1k" "$TEST_IMG" | _filter_qemu_io

Looks good. Another test that pokes at guessed locations... :-)


> diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
> index 9c2ef42522..92243c2edd 100755
> --- a/tests/qemu-iotests/060
> +++ b/tests/qemu-iotests/060
> @@ -158,7 +158,7 @@ $QEMU_IO -c 'write 0k 64k' "$BACKING_IMG" | _filter_qemu_io
>  # compat=0.10 is required in order to make the following discard actually
>  # unallocate the sector rather than make it a zero sector - we want COW, after
>  # all.
> -IMGOPTS='compat=0.10' _make_test_img -b "$BACKING_IMG" 1G
> +_make_test_img -o 'compat=0.10' -b "$BACKING_IMG" 1G
>  # Write two clusters, the second one enforces creation of an L2 table after
>  # the first data cluster.
>  $QEMU_IO -c 'write 0k 64k' -c 'write 512M 64k' "$TEST_IMG" | _filter_qemu_io
> @@ -398,7 +398,7 @@ echo
>  echo "=== Discarding a non-covered in-bounds refblock ==="
>  echo
>  
> -IMGOPTS='refcount_bits=1' _make_test_img 64M
> +_make_test_img -o 'refcount_bits=1' 64M
>  
>  # Pretend there's a refblock somewhere where there is no refblock to
>  # cover it (but the covering refblock has a valid index in the
> @@ -422,7 +422,7 @@ echo
>  echo "=== Discarding a refblock covered by an unaligned refblock ==="
>  echo
>  
> -IMGOPTS='refcount_bits=1' _make_test_img 64M
> +_make_test_img -o 'refcount_bits=1' 64M
>  
>  # Same as above
>  poke_file "$TEST_IMG" "$(($rt_offset+8))" "\x00\x00\x00\x10\x00\x00\x00\x00"
Looks good.


> diff --git a/tests/qemu-iotests/061 b/tests/qemu-iotests/061
> index 4eac5b83bd..0480be0141 100755
> --- a/tests/qemu-iotests/061
> +++ b/tests/qemu-iotests/061
> @@ -41,11 +41,14 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
>  _supported_fmt qcow2
>  _supported_proto file
>  _supported_os Linux
> +# Conversion between different compat versions can only really work
> +# with refcount_bits=16
100 agree, however in the future this test maybe should be split
to one test that converts between versions and one that
converts between same version. No need to do that now of course.

> +_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
>  
>  echo
>  echo "=== Testing version downgrade with zero expansion ==="
>  echo
> -IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
> +_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
>  $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
>  $PYTHON qcow2.py "$TEST_IMG" dump-header
>  $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
> @@ -56,7 +59,7 @@ _check_test_img
>  echo
>  echo "=== Testing version downgrade with zero expansion and 4K cache entries ==="
>  echo
> -IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
> +_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
>  $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IO -c "write -z 32M 128k" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IO -c map "$TEST_IMG" | _filter_qemu_io
> @@ -72,7 +75,7 @@ _check_test_img
>  echo
>  echo "=== Testing dirty version downgrade ==="
>  echo
> -IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
> +_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
>  _NO_VALGRIND \
>  $QEMU_IO -c "write -P 0x2a 0 128k" -c flush \
>           -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 | _filter_qemu_io
> @@ -85,7 +88,7 @@ _check_test_img
>  echo
>  echo "=== Testing version downgrade with unknown compat/autoclear flags ==="
>  echo
> -IMGOPTS="compat=1.1" _make_test_img 64M
> +_make_test_img -o "compat=1.1" 64M
>  $PYTHON qcow2.py "$TEST_IMG" set-feature-bit compatible 42
>  $PYTHON qcow2.py "$TEST_IMG" set-feature-bit autoclear 42
>  $PYTHON qcow2.py "$TEST_IMG" dump-header
> @@ -96,7 +99,7 @@ _check_test_img
>  echo
>  echo "=== Testing version upgrade and resize ==="
>  echo
> -IMGOPTS="compat=0.10" _make_test_img 64M
> +_make_test_img -o "compat=0.10" 64M
>  $QEMU_IO -c "write -P 0x2a 42M 64k" "$TEST_IMG" | _filter_qemu_io
>  $PYTHON qcow2.py "$TEST_IMG" dump-header
>  $QEMU_IMG amend -o "compat=1.1,lazy_refcounts=on,size=128M" "$TEST_IMG"
> @@ -107,7 +110,7 @@ _check_test_img
>  echo
>  echo "=== Testing dirty lazy_refcounts=off ==="
>  echo
> -IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
> +_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
>  _NO_VALGRIND \
>  $QEMU_IO -c "write -P 0x2a 0 128k" -c flush \
>           -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 | _filter_qemu_io
> @@ -120,8 +123,8 @@ _check_test_img
>  echo
>  echo "=== Testing backing file ==="
>  echo
> -IMGOPTS="compat=1.1" _make_test_img 64M
> -IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
> +_make_test_img -o "compat=1.1" 64M
> +TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
>  $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
>  $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IMG amend -o "backing_file=$TEST_IMG.base,backing_fmt=qcow2" "$TEST_IMG"
> @@ -131,7 +134,7 @@ _check_test_img
>  echo
>  echo "=== Testing invalid configurations ==="
>  echo
> -IMGOPTS="compat=0.10" _make_test_img 64M
> +_make_test_img -o "compat=0.10" 64M
>  $QEMU_IMG amend -o "lazy_refcounts=on" "$TEST_IMG"
>  $QEMU_IMG amend -o "compat=1.1" "$TEST_IMG" # actually valid
>  $QEMU_IMG amend -o "compat=0.10,lazy_refcounts=on" "$TEST_IMG"
> @@ -144,7 +147,7 @@ $QEMU_IMG amend -o "preallocation=on" "$TEST_IMG"
>  echo
>  echo "=== Testing correct handling of unset value ==="
>  echo
> -IMGOPTS="compat=1.1,cluster_size=1k" _make_test_img 64M
> +_make_test_img -o "compat=1.1,cluster_size=1k" 64M
>  echo "Should work:"
>  $QEMU_IMG amend -o "lazy_refcounts=on" "$TEST_IMG"
>  echo "Should not work:" # Just to know which of these tests actually fails
> @@ -153,7 +156,7 @@ $QEMU_IMG amend -o "cluster_size=64k" "$TEST_IMG"
>  echo
>  echo "=== Testing zero expansion on inactive clusters ==="
>  echo
> -IMGOPTS="compat=1.1" _make_test_img 64M
> +_make_test_img -o "compat=1.1" 64M
>  $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IMG snapshot -c foo "$TEST_IMG"
>  $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG" | _filter_qemu_io
> @@ -167,7 +170,7 @@ $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
>  echo
>  echo "=== Testing zero expansion on shared L2 table ==="
>  echo
> -IMGOPTS="compat=1.1" _make_test_img 64M
> +_make_test_img -o "compat=1.1" 64M
>  $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IMG snapshot -c foo "$TEST_IMG"
>  $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
> @@ -180,9 +183,9 @@ $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
>  echo
>  echo "=== Testing zero expansion on backed image ==="
>  echo
> -IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
> +TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
>  $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
> -IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
> +_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
>  $QEMU_IO -c "read -P 0x2a 0 128k" -c "write -z 0 64k" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
>  _check_test_img
> @@ -191,9 +194,9 @@ $QEMU_IO -c "read -P 0 0 64k" -c "read -P 0x2a 64k 64k" "$TEST_IMG" | _filter_qe
>  echo
>  echo "=== Testing zero expansion on backed inactive clusters ==="
>  echo
> -IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
> +TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
>  $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
> -IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
> +_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
>  $QEMU_IO -c "write -z 0 64k" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IMG snapshot -c foo "$TEST_IMG"
>  $QEMU_IO -c "write -P 0x42 0 128k" "$TEST_IMG" | _filter_qemu_io
> @@ -207,9 +210,9 @@ $QEMU_IO -c "read -P 0 0 64k" -c "read -P 0x2a 64k 64k" "$TEST_IMG" | _filter_qe
>  echo
>  echo "=== Testing zero expansion on backed image with shared L2 table ==="
>  echo
> -IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
> +TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
>  $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
> -IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
> +_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
>  $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IMG snapshot -c foo "$TEST_IMG"
>  $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
> @@ -222,7 +225,7 @@ $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
>  echo
>  echo "=== Testing preallocated zero expansion on full image ==="
>  echo
> -IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG" _make_test_img 64M
> +TEST_IMG="$TEST_IMG" _make_test_img -o "compat=1.1" 64M
>  $QEMU_IO -c "write -P 0x2a 0 64M" "$TEST_IMG" -c "write -z 0 64M" | _filter_qemu_io
>  $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
>  _check_test_img
> @@ -231,8 +234,8 @@ $QEMU_IO -c "read -P 0 0 64M" "$TEST_IMG" | _filter_qemu_io
>  echo
>  echo "=== Testing progress report without snapshot ==="
>  echo
> -IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 4G
> -IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 4G
> +TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 4G
> +_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 4G
>  $QEMU_IO -c "write -z 0  64k" \
>           -c "write -z 1G 64k" \
>           -c "write -z 2G 64k" \
> @@ -243,8 +246,8 @@ _check_test_img
>  echo
>  echo "=== Testing progress report with snapshot ==="
>  echo
> -IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 4G
> -IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 4G
> +TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 4G
> +_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 4G
>  $QEMU_IO -c "write -z 0  64k" \
>           -c "write -z 1G 64k" \
>           -c "write -z 2G 64k" \
> @@ -256,7 +259,7 @@ _check_test_img
>  echo
>  echo "=== Testing version downgrade with external data file ==="
>  echo
> -IMGOPTS="compat=1.1,data_file=$TEST_IMG.data" _make_test_img 64M
> +_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data" 64M
>  $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
>  _img_info --format-specific
>  _check_test_img
> @@ -264,11 +267,11 @@ _check_test_img
>  echo
>  echo "=== Try changing the external data file ==="
>  echo
> -IMGOPTS="compat=1.1" _make_test_img 64M
> +_make_test_img -o "compat=1.1" 64M
>  $QEMU_IMG amend -o "data_file=foo" "$TEST_IMG"
>  
>  echo
> -IMGOPTS="compat=1.1,data_file=$TEST_IMG.data" _make_test_img 64M
> +_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data" 64M
>  $QEMU_IMG amend -o "data_file=foo" "$TEST_IMG"
>  _img_info --format-specific
>  TEST_IMG="data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" _img_info --format-specific --image-opts
> @@ -281,7 +284,7 @@ TEST_IMG="data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" _img_info -
>  echo
>  echo "=== Clearing and setting data-file-raw ==="
>  echo
> -IMGOPTS="compat=1.1,data_file=$TEST_IMG.data,data_file_raw=on" _make_test_img 64M
> +_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data,data_file_raw=on" 64M
>  $QEMU_IMG amend -o "data_file_raw=on" "$TEST_IMG"
>  _img_info --format-specific
>  _check_test_img
> 
Looks good.


> diff --git a/tests/qemu-iotests/079 b/tests/qemu-iotests/079
> index 81f0c21f53..162355b29a 100755
> --- a/tests/qemu-iotests/079
> +++ b/tests/qemu-iotests/079
> @@ -44,8 +44,7 @@ echo
>  cluster_sizes="16384 32768 65536 131072 262144 524288 1048576 2097152 4194304"
>  
>  for s in $cluster_sizes; do
> -    IMGOPTS=$(_optstr_add "$IMGOPTS" "preallocation=metadata,cluster_size=$s") \
> -        _make_test_img 4G
> +    _make_test_img -o "preallocation=metadata,cluster_size=$s" 4G
>  done
>  
>  # success, all done
Looks good.


> diff --git a/tests/qemu-iotests/106 b/tests/qemu-iotests/106
> index ac47eaa0f5..b5d1ec4078 100755
> --- a/tests/qemu-iotests/106
> +++ b/tests/qemu-iotests/106
> @@ -51,7 +51,7 @@ for create_mode in off falloc full; do
>          echo
>          echo "--- create_mode=$create_mode growth_mode=$growth_mode ---"
>  
> -        IMGOPTS="preallocation=$create_mode" _make_test_img ${CREATION_SIZE}K
> +        _make_test_img -o "preallocation=$create_mode" ${CREATION_SIZE}K
>          $QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
>  
>          expected_size=0
Looks good as well.

> diff --git a/tests/qemu-iotests/108 b/tests/qemu-iotests/108
> index 9c08172237..b0a6ae597b 100755
> --- a/tests/qemu-iotests/108
> +++ b/tests/qemu-iotests/108
> @@ -65,7 +65,7 @@ echo
>  echo '=== Repairing unreferenced data cluster in new refblock area ==='
>  echo
>  
> -IMGOPTS='cluster_size=512' _make_test_img 64M
> +_make_test_img -o 'cluster_size=512' 64M
>  # Allocate the first 128 kB in the image (first refblock)
>  $QEMU_IO -c 'write 0 0x1b200' "$TEST_IMG" | _filter_qemu_io
>  # should be 131072 == 0x20000
> 
Looks good.


> diff --git a/tests/qemu-iotests/112 b/tests/qemu-iotests/112
> index 706c10b600..6850225939 100755
> --- a/tests/qemu-iotests/112
> +++ b/tests/qemu-iotests/112
> @@ -53,20 +53,20 @@ echo '=== refcount_bits limits ==='
>  echo
>  
>  # Must be positive (non-zero)
> -IMGOPTS="$IMGOPTS,refcount_bits=0" _make_test_img 64M
> +_make_test_img -o "refcount_bits=0" 64M
>  # Must be positive (non-negative)
> -IMGOPTS="$IMGOPTS,refcount_bits=-1" _make_test_img 64M
> +_make_test_img -o "refcount_bits=-1" 64M
>  # May not exceed 64
> -IMGOPTS="$IMGOPTS,refcount_bits=128" _make_test_img 64M
> +_make_test_img -o "refcount_bits=128" 64M
>  # Must be a power of two
> -IMGOPTS="$IMGOPTS,refcount_bits=42" _make_test_img 64M
> +_make_test_img -o "refcount_bits=42" 64M
>  
>  # 1 is the minimum
> -IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
> +_make_test_img -o "refcount_bits=1" 64M
>  print_refcount_bits
>  
>  # 64 is the maximum
> -IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
> +_make_test_img -o "refcount_bits=64" 64M
>  print_refcount_bits
>  
>  # 16 is the default
> @@ -78,19 +78,19 @@ echo '=== refcount_bits and compat=0.10 ==='
>  echo
>  
>  # Should work
> -IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=16" _make_test_img 64M
> +_make_test_img -o "compat=0.10,refcount_bits=16" 64M
>  print_refcount_bits
>  
>  # Should not work
> -IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=1" _make_test_img 64M
> -IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=64" _make_test_img 64M
> +_make_test_img -o "compat=0.10,refcount_bits=1" 64M
> +_make_test_img -o "compat=0.10,refcount_bits=64" 64M
>  
>  
>  echo
>  echo '=== Snapshot limit on refcount_bits=1 ==='
>  echo
>  
> -IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
> +_make_test_img -o "refcount_bits=1" 64M
>  print_refcount_bits
>  
>  $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
> @@ -106,7 +106,7 @@ echo
>  echo '=== Snapshot limit on refcount_bits=2 ==='
>  echo
>  
> -IMGOPTS="$IMGOPTS,refcount_bits=2" _make_test_img 64M
> +_make_test_img -o "refcount_bits=2" 64M
>  print_refcount_bits
>  
>  $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
> @@ -124,7 +124,7 @@ echo
>  echo '=== Compressed clusters with refcount_bits=1 ==='
>  echo
>  
> -IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
> +_make_test_img -o "refcount_bits=1" 64M
>  print_refcount_bits
>  
>  # Both should fit into a single host cluster; instead of failing to increase the
> @@ -140,7 +140,7 @@ echo
>  echo '=== MSb set in 64 bit refcount ==='
>  echo
>  
> -IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
> +_make_test_img -o "refcount_bits=64" 64M
>  print_refcount_bits
>  
>  $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
> @@ -158,7 +158,7 @@ echo
>  echo '=== Snapshot on maximum 64 bit refcount value ==='
>  echo
>  
> -IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
> +_make_test_img -o "refcount_bits=64" 64M
>  print_refcount_bits
>  
>  $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
> @@ -239,7 +239,7 @@ echo
>  echo '=== Testing too many references for check ==='
>  echo
>  
> -IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
> +_make_test_img -o "refcount_bits=1" 64M
>  print_refcount_bits
>  
>  # This cluster should be created at 0x50000
> @@ -262,7 +262,7 @@ echo
>  echo '=== Multiple walks necessary during amend ==='
>  echo
>  
> -IMGOPTS="$IMGOPTS,refcount_bits=1,cluster_size=512" _make_test_img 64k
> +_make_test_img -o "refcount_bits=1,cluster_size=512" 64k
>  
>  # Cluster 0 is the image header, clusters 1 to 4 are used by the L1 table, a
>  # single L2 table, the reftable and a single refblock. This creates 58 data
> 
Looks good.


> diff --git a/tests/qemu-iotests/115 b/tests/qemu-iotests/115
> index 9ed3cb6a83..d254b18342 100755
> --- a/tests/qemu-iotests/115
> +++ b/tests/qemu-iotests/115
> @@ -64,8 +64,7 @@ echo
>  # least 256 MB. We can achieve that by using preallocation=metadata for an image
>  # which has a guest disk size of 256 MB.
>  
> -IMGOPTS="$IMGOPTS,refcount_bits=64,cluster_size=512,preallocation=metadata" \
> -    _make_test_img 256M
> +_make_test_img -o "refcount_bits=64,cluster_size=512,preallocation=metadata" 256M
>  
>  # We know for sure that the L1 and refcount tables do not overlap with any other
>  # structure because the metadata overlap checks would have caught that case.
Looks good.


> diff --git a/tests/qemu-iotests/121 b/tests/qemu-iotests/121
> index 90a0424edb..10db813d94 100755
> --- a/tests/qemu-iotests/121
> +++ b/tests/qemu-iotests/121
> @@ -50,7 +50,7 @@ echo
>  # Preallocation speeds up the write operation, but preallocating everything will
>  # destroy the purpose of the write; so preallocate one KB less than what would
>  # cause a reftable growth...
> -IMGOPTS='preallocation=metadata,cluster_size=1k' _make_test_img 64512K
> +_make_test_img -o 'preallocation=metadata,cluster_size=1k' 64512K
>  # ...and make the image the desired size afterwards.
>  $QEMU_IMG resize "$TEST_IMG" 65M
>  
> @@ -73,7 +73,7 @@ echo
>  echo '--- Test 2 ---'
>  echo
>  
> -IMGOPTS='preallocation=metadata,cluster_size=1k' _make_test_img 64513K
> +_make_test_img -o 'preallocation=metadata,cluster_size=1k' 64513K
>  # This results in an L1 table growth which in turn results in some clusters at
>  # the start of the image becoming free
>  $QEMU_IMG resize "$TEST_IMG" 65M
> @@ -96,7 +96,7 @@ echo
>  echo '=== Allocating a new refcount block must not leave holes in the image ==='
>  echo
>  
> -IMGOPTS='cluster_size=512,refcount_bits=16' _make_test_img 1M
> +_make_test_img -o 'cluster_size=512,refcount_bits=16' 1M
>  
>  # This results in an image with 256 used clusters: the qcow2 header,
>  # the refcount table, one refcount block, the L1 table, four L2 tables
> 
Looks good.


> diff --git a/tests/qemu-iotests/125 b/tests/qemu-iotests/125
> index 4e31aa4e5f..d510984045 100755
> --- a/tests/qemu-iotests/125
> +++ b/tests/qemu-iotests/125
> @@ -114,7 +114,7 @@ for GROWTH_SIZE in 16 48 80; do
>          for growth_mode in off metadata falloc full; do
>              echo "--- cluster_size=$cluster_size growth_size=$GROWTH_SIZE create_mode=$create_mode growth_mode=$growth_mode ---"
>  
> -            IMGOPTS="preallocation=$create_mode,cluster_size=$cluster_size" _make_test_img ${CREATION_SIZE}
> +            _make_test_img -o "preallocation=$create_mode,cluster_size=$cluster_size" ${CREATION_SIZE}
>              $QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
>  
>              host_size_0=$(get_image_size_on_host)
> diff --git a/tests/qemu-iotests/137 b/tests/qemu-iotests/137
> index 089821da0c..6cf2997577 100755
> --- a/tests/qemu-iotests/137
> +++ b/tests/qemu-iotests/137
> @@ -117,7 +117,7 @@ $QEMU_IO \
>      -c "reopen -o cache-clean-interval=-1" \
>      "$TEST_IMG" | _filter_qemu_io
>  
> -IMGOPTS="cluster_size=256k" _make_test_img 32P
> +_make_test_img -o "cluster_size=256k" 32P
>  $QEMU_IO \
>      -c "reopen -o l2-cache-entry-size=512,l2-cache-size=1T" \
>      "$TEST_IMG" | _filter_qemu_io
> 
Looks good.

> diff --git a/tests/qemu-iotests/138 b/tests/qemu-iotests/138
> index 6a731370db..66ae9d5e78 100755
> --- a/tests/qemu-iotests/138
> +++ b/tests/qemu-iotests/138
> @@ -45,8 +45,7 @@ echo
>  echo '=== Check on an image with a multiple of 2^32 clusters ==='
>  echo
>  
> -IMGOPTS=$(_optstr_add "$IMGOPTS" "cluster_size=512") \
> -    _make_test_img 512
> +_make_test_img -o "cluster_size=512" 512
>  
>  # Allocate L2 table
>  $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
> 
Looks good.

> diff --git a/tests/qemu-iotests/175 b/tests/qemu-iotests/175
> index 55db2803ed..020ed8e61f 100755
> --- a/tests/qemu-iotests/175
> +++ b/tests/qemu-iotests/175
> @@ -95,7 +95,7 @@ stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_block
>  for mode in off full falloc; do
>      echo
>      echo "== creating image with preallocation $mode =="
> -    IMGOPTS=preallocation=$mode _make_test_img $size | _filter_imgfmt
> +    _make_test_img -o preallocation=$mode $size | _filter_imgfmt
>      stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size
>  done
>  
> 
Looks good.

> diff --git a/tests/qemu-iotests/190 b/tests/qemu-iotests/190
> index eb766ad09f..5890ff9cfc 100755
> --- a/tests/qemu-iotests/190
> +++ b/tests/qemu-iotests/190
> @@ -45,7 +45,7 @@ _supported_proto file
>  echo "== Huge file =="
>  echo
>  
> -IMGOPTS='cluster_size=2M' _make_test_img 2T
> +_make_test_img -o 'cluster_size=2M' 2T
>  
>  $QEMU_IMG measure -O raw -f qcow2 "$TEST_IMG"
>  $QEMU_IMG measure -O qcow2 -o cluster_size=64k -f qcow2 "$TEST_IMG"
> 
Looks good.

> diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191
> index 528022e8d8..21c16a32cb 100755
> --- a/tests/qemu-iotests/191
> +++ b/tests/qemu-iotests/191
> @@ -51,8 +51,7 @@ echo === Preparing and starting VM ===
>  echo
>  
>  TEST_IMG="${TEST_IMG}.base" _make_test_img $size
> -IMGOPTS=$(_optstr_add "$IMGOPTS" "backing_fmt=$IMGFMT") \
> -    TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
> +TEST_IMG="${TEST_IMG}.mid" _make_test_img -o "backing_fmt=$IMGFMT" -b "${TEST_IMG}.base"
>  _make_test_img -b "${TEST_IMG}.mid"
>  TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"
>  
> 
Looks good.

> diff --git a/tests/qemu-iotests/220 b/tests/qemu-iotests/220
> index 2d62c5dcac..3769f372cb 100755
> --- a/tests/qemu-iotests/220
> +++ b/tests/qemu-iotests/220
> @@ -37,6 +37,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
>  _supported_fmt qcow2
>  _supported_proto file
>  _supported_os Linux
> +# To use a different refcount width but 16 bits we need compat=1.1
> +_unsupported_imgopts 'compat=0.10'
>  
>  echo "== Creating huge file =="
>  
> @@ -46,7 +48,7 @@ if ! truncate --size=513T "$TEST_IMG"; then
>      _notrun "file system on $TEST_DIR does not support large enough files"
>  fi
>  rm "$TEST_IMG"
> -IMGOPTS='cluster_size=2M,refcount_bits=1' _make_test_img 513T
> +_make_test_img -o 'cluster_size=2M,refcount_bits=1' 513T
>  
>  echo "== Populating refcounts =="
>  # We want an image with 256M refcounts * 2M clusters = 512T referenced.
> 
Looks good.


> diff --git a/tests/qemu-iotests/243 b/tests/qemu-iotests/243
> index e563761307..2b84b896db 100755
> --- a/tests/qemu-iotests/243
> +++ b/tests/qemu-iotests/243
> @@ -40,6 +40,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
>  _supported_fmt qcow2
>  _supported_proto file
>  _supported_os Linux
> +# External data files do not work with compat=0.10
> +_unsupported_imgopts 'compat=0.10'
>  
>  for mode in off metadata falloc full; do
>  
> @@ -47,7 +49,7 @@ for mode in off metadata falloc full; do
>      echo "=== preallocation=$mode ==="
>      echo
>  
> -    IMGOPTS="preallocation=$mode" _make_test_img 64M
> +    _make_test_img -o "preallocation=$mode" 64M
>  
>      printf "File size: "
>      du -b $TEST_IMG | cut -f1
> @@ -64,7 +66,7 @@ for mode in off metadata falloc full; do
>      echo "=== External data file: preallocation=$mode ==="
>      echo
>  
> -    IMGOPTS="data_file=$TEST_IMG.data,preallocation=$mode" _make_test_img 64M
> +    _make_test_img -o "data_file=$TEST_IMG.data,preallocation=$mode" 64M
>  
>      echo -n "qcow2 file size: "
>      du -b $TEST_IMG | cut -f1
> 
Looks good.


> diff --git a/tests/qemu-iotests/244 b/tests/qemu-iotests/244
> index 13978f93d2..0375bc12d4 100755
> --- a/tests/qemu-iotests/244
> +++ b/tests/qemu-iotests/244
> @@ -41,13 +41,15 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
>  _supported_fmt qcow2
>  _supported_proto file
>  _supported_os Linux
> +# External data files do not work with compat=0.10
> +_unsupported_imgopts 'compat=0.10'
>  
>  echo
>  echo "=== Create and open image with external data file ==="
>  echo
>  
>  echo "With data file name in the image:"
> -IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
> +_make_test_img -o "data_file=$TEST_IMG.data" 64M
>  _check_test_img
>  
>  $QEMU_IO -c "open $TEST_IMG" -c "read -P 0 0 64k" 2>&1 | _filter_qemu_io | _filter_testdir
> @@ -104,7 +106,7 @@ echo
>  echo "=== Standalone image with external data file (efficient) ==="
>  echo
>  
> -IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
> +_make_test_img -o "data_file=$TEST_IMG.data" 64M
>  
>  echo -n "qcow2 file size before I/O: "
>  du -b $TEST_IMG | cut -f1
> @@ -154,7 +156,7 @@ echo
>  echo "=== Standalone image with external data file (valid raw) ==="
>  echo
>  
> -IMGOPTS="data_file=$TEST_IMG.data,data_file_raw=on" _make_test_img 64M
> +_make_test_img -o "data_file=$TEST_IMG.data,data_file_raw=on" 64M
>  
>  echo -n "qcow2 file size before I/O: "
>  du -b $TEST_IMG | cut -f1
> @@ -187,7 +189,7 @@ echo
>  echo "=== bdrv_co_block_status test for file and offset=0 ==="
>  echo
>  
> -IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
> +_make_test_img -o "data_file=$TEST_IMG.data" 64M
>  
>  $QEMU_IO -c 'write -P 0x11 0 1M' -f $IMGFMT "$TEST_IMG" | _filter_qemu_io
>  $QEMU_IO -c 'read -P 0x11 0 1M' -f $IMGFMT "$TEST_IMG" | _filter_qemu_io
> 
Looks good.

> diff --git a/tests/qemu-iotests/250 b/tests/qemu-iotests/250
> index c9c0a84a5a..670cf19076 100755
> --- a/tests/qemu-iotests/250
> +++ b/tests/qemu-iotests/250
> @@ -55,9 +55,8 @@ disk_usage()
>  }
>  
>  size=2100M
> -IMGOPTS="cluster_size=1M,preallocation=metadata"
>  
> -_make_test_img $size
> +_make_test_img -o "cluster_size=1M,preallocation=metadata" $size
>  $QEMU_IO -c 'discard 0 10M' -c 'discard 2090M 10M' \
>           -c 'write 2090M 10M' -c 'write 0 10M' "$TEST_IMG" | _filter_qemu_io
>  
> 
Looks good.


> diff --git a/tests/qemu-iotests/265 b/tests/qemu-iotests/265
> index dce6f77be3..00f2ec769e 100755
> --- a/tests/qemu-iotests/265
> +++ b/tests/qemu-iotests/265
> @@ -41,7 +41,7 @@ _supported_os Linux
>  echo '--- Writing to the image ---'
>  
>  # Reduce cluster size so we get more and quicker I/O
> -IMGOPTS='cluster_size=4096' _make_test_img 1M
> +_make_test_img -o 'cluster_size=4096' 1M
>  (for ((kb = 1024 - 4; kb >= 0; kb -= 4)); do \
>       echo "aio_write -P 42 $((kb + 1))k 2k"; \
>   done) \
Looks good as well.



To make review of this patch a bit less boring, I went over all
the tests to understand more or less what each test does.
I hope that I didn't miss anything.

Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>

Best regards,
	Maxim Levitsky
Max Reitz Nov. 7, 2019, 9:20 a.m. UTC | #2
On 06.11.19 16:47, Maxim Levitsky wrote:
> On Tue, 2019-10-15 at 16:27 +0200, Max Reitz wrote:
>> Tests should not overwrite all user-supplied image options, but only add
>> to it (which will effectively overwrite conflicting values).  Accomplish
>> this by passing options to _make_test_img via -o instead of $IMGOPTS.
>>
>> For some tests, there is no functional change because they already only
>> appended options to IMGOPTS.  For these, this patch is just a
>> simplification.
>>
>> For others, this is a change, so they now heed user-specified $IMGOPTS.
>> Some of those tests do not work with all image options, though, so we
>> need to disable them accordingly.
>>
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> ---
>>  tests/qemu-iotests/031 |  9 ++++---
>>  tests/qemu-iotests/039 | 24 ++++++------------
>>  tests/qemu-iotests/059 | 18 ++++++-------
>>  tests/qemu-iotests/060 |  6 ++---
>>  tests/qemu-iotests/061 | 57 ++++++++++++++++++++++--------------------
>>  tests/qemu-iotests/079 |  3 +--
>>  tests/qemu-iotests/106 |  2 +-
>>  tests/qemu-iotests/108 |  2 +-
>>  tests/qemu-iotests/112 | 32 ++++++++++++------------
>>  tests/qemu-iotests/115 |  3 +--
>>  tests/qemu-iotests/121 |  6 ++---
>>  tests/qemu-iotests/125 |  2 +-
>>  tests/qemu-iotests/137 |  2 +-
>>  tests/qemu-iotests/138 |  3 +--
>>  tests/qemu-iotests/175 |  2 +-
>>  tests/qemu-iotests/190 |  2 +-
>>  tests/qemu-iotests/191 |  3 +--
>>  tests/qemu-iotests/220 |  4 ++-
>>  tests/qemu-iotests/243 |  6 +++--
>>  tests/qemu-iotests/244 | 10 +++++---
>>  tests/qemu-iotests/250 |  3 +--
>>  tests/qemu-iotests/265 |  2 +-
>>  22 files changed, 100 insertions(+), 101 deletions(-)

[...]

>> @@ -161,7 +161,7 @@ _cleanup_test_img
>>  
>>  echo
>>  echo "=== Testing 4TB monolithicFlat creation and IO ==="
>> -IMGOPTS="subformat=monolithicFlat" _make_test_img 4T
>> +_make_test_img -o "subformat=monolithicFlat" 4T
>>  _img_info
>>  $QEMU_IO -c "write -P 0xa 900G 512" "$TEST_IMG" | _filter_qemu_io
>>  $QEMU_IO -c "read -v 900G 1024" "$TEST_IMG" | _filter_qemu_io
>> @@ -170,7 +170,7 @@ _cleanup_test_img
>>  echo
>>  echo "=== Testing qemu-img map on extents ==="
>>  for fmt in monolithicSparse twoGbMaxExtentSparse; do
>> -    IMGOPTS="subformat=$fmt" _make_test_img 31G
>> +    _make_test_img -o "subformat=$fmt" 31G
>>      $QEMU_IO -c "write 65024 1k" "$TEST_IMG" | _filter_qemu_io
>>      $QEMU_IO -c "write 2147483136 1k" "$TEST_IMG" | _filter_qemu_io
>>      $QEMU_IO -c "write 5G 1k" "$TEST_IMG" | _filter_qemu_io
> 
> Looks good. Another test that pokes at guessed locations... :-)

Actually, no.  These are writes on the format, not the file itself.  The
monolithicSparse subformat will store everything in a single file,
whereas twoGbMaxExtentSparse will create one file per 2 GB of guest
disk.  So the locations are chosen accordingly to that 2 GB limit ((1)
something somewhere in the first extent, (2) something that wraps around
the first 2 GB limit, so hits extents #0 and #1, and (3) something in
the middle of extent #2.)

(The following qemu-img map call then verifies that it lands in the
different files for twoGbMaxExtentSparse, and that monolithicSparse is
at least indeed sparsely allocated.)

Max
Maxim Levitsky Nov. 7, 2019, 9:52 a.m. UTC | #3
On Thu, 2019-11-07 at 10:20 +0100, Max Reitz wrote:
> On 06.11.19 16:47, Maxim Levitsky wrote:
> > On Tue, 2019-10-15 at 16:27 +0200, Max Reitz wrote:
> > > Tests should not overwrite all user-supplied image options, but only add
> > > to it (which will effectively overwrite conflicting values).  Accomplish
> > > this by passing options to _make_test_img via -o instead of $IMGOPTS.
> > > 
> > > For some tests, there is no functional change because they already only
> > > appended options to IMGOPTS.  For these, this patch is just a
> > > simplification.
> > > 
> > > For others, this is a change, so they now heed user-specified $IMGOPTS.
> > > Some of those tests do not work with all image options, though, so we
> > > need to disable them accordingly.
> > > 
> > > Signed-off-by: Max Reitz <mreitz@redhat.com>
> > > ---
> > >  tests/qemu-iotests/031 |  9 ++++---
> > >  tests/qemu-iotests/039 | 24 ++++++------------
> > >  tests/qemu-iotests/059 | 18 ++++++-------
> > >  tests/qemu-iotests/060 |  6 ++---
> > >  tests/qemu-iotests/061 | 57 ++++++++++++++++++++++--------------------
> > >  tests/qemu-iotests/079 |  3 +--
> > >  tests/qemu-iotests/106 |  2 +-
> > >  tests/qemu-iotests/108 |  2 +-
> > >  tests/qemu-iotests/112 | 32 ++++++++++++------------
> > >  tests/qemu-iotests/115 |  3 +--
> > >  tests/qemu-iotests/121 |  6 ++---
> > >  tests/qemu-iotests/125 |  2 +-
> > >  tests/qemu-iotests/137 |  2 +-
> > >  tests/qemu-iotests/138 |  3 +--
> > >  tests/qemu-iotests/175 |  2 +-
> > >  tests/qemu-iotests/190 |  2 +-
> > >  tests/qemu-iotests/191 |  3 +--
> > >  tests/qemu-iotests/220 |  4 ++-
> > >  tests/qemu-iotests/243 |  6 +++--
> > >  tests/qemu-iotests/244 | 10 +++++---
> > >  tests/qemu-iotests/250 |  3 +--
> > >  tests/qemu-iotests/265 |  2 +-
> > >  22 files changed, 100 insertions(+), 101 deletions(-)
> 
> [...]
> 
> > > @@ -161,7 +161,7 @@ _cleanup_test_img
> > >  
> > >  echo
> > >  echo "=== Testing 4TB monolithicFlat creation and IO ==="
> > > -IMGOPTS="subformat=monolithicFlat" _make_test_img 4T
> > > +_make_test_img -o "subformat=monolithicFlat" 4T
> > >  _img_info
> > >  $QEMU_IO -c "write -P 0xa 900G 512" "$TEST_IMG" | _filter_qemu_io
> > >  $QEMU_IO -c "read -v 900G 1024" "$TEST_IMG" | _filter_qemu_io
> > > @@ -170,7 +170,7 @@ _cleanup_test_img
> > >  echo
> > >  echo "=== Testing qemu-img map on extents ==="
> > >  for fmt in monolithicSparse twoGbMaxExtentSparse; do
> > > -    IMGOPTS="subformat=$fmt" _make_test_img 31G
> > > +    _make_test_img -o "subformat=$fmt" 31G
> > >      $QEMU_IO -c "write 65024 1k" "$TEST_IMG" | _filter_qemu_io
> > >      $QEMU_IO -c "write 2147483136 1k" "$TEST_IMG" | _filter_qemu_io
> > >      $QEMU_IO -c "write 5G 1k" "$TEST_IMG" | _filter_qemu_io
> > 
> > Looks good. Another test that pokes at guessed locations... :-)
> 
> Actually, no.  These are writes on the format, not the file itself.  The
> monolithicSparse subformat will store everything in a single file,
> whereas twoGbMaxExtentSparse will create one file per 2 GB of guest
> disk.  So the locations are chosen accordingly to that 2 GB limit ((1)
> something somewhere in the first extent, (2) something that wraps around
> the first 2 GB limit, so hits extents #0 and #1, and (3) something in
> the middle of extent #2.)
> 
> (The following qemu-img map call then verifies that it lands in the
> different files for twoGbMaxExtentSparse, and that monolithicSparse is
> at least indeed sparsely allocated.)
> 
> Max
Good to know, I missed this one.


Best regards,
	Maxim Levitsky

Patch
diff mbox series

diff --git a/tests/qemu-iotests/031 b/tests/qemu-iotests/031
index a3c25ec237..c44fcf91bb 100755
--- a/tests/qemu-iotests/031
+++ b/tests/qemu-iotests/031
@@ -40,19 +40,22 @@  trap "_cleanup; exit \$status" 0 1 2 3 15
 # This tests qcow2-specific low-level functionality
 _supported_fmt qcow2
 _supported_proto file
+# We want to test compat=0.10, which does not support refcount widths
+# other than 16
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
 
 CLUSTER_SIZE=65536
 
 # qcow2.py output depends on the exact options used, so override the command
 # line here as an exception
-for IMGOPTS in "compat=0.10" "compat=1.1"; do
+for compat in "compat=0.10" "compat=1.1"; do
 
     echo
-    echo ===== Testing with -o $IMGOPTS =====
+    echo ===== Testing with -o $compat =====
     echo
     echo === Create image with unknown header extension ===
     echo
-    _make_test_img 64M
+    _make_test_img -o $compat 64M
     $PYTHON qcow2.py "$TEST_IMG" add-header-ext 0x12345678 "This is a test header extension"
     $PYTHON qcow2.py "$TEST_IMG" dump-header
     _check_test_img
diff --git a/tests/qemu-iotests/039 b/tests/qemu-iotests/039
index 325da63a4c..99563bf126 100755
--- a/tests/qemu-iotests/039
+++ b/tests/qemu-iotests/039
@@ -50,8 +50,7 @@  size=128M
 echo
 echo "== Checking that image is clean on shutdown =="
 
-IMGOPTS="compat=1.1,lazy_refcounts=on"
-_make_test_img $size
+_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
 
 $QEMU_IO -c "write -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io
 
@@ -62,8 +61,7 @@  _check_test_img
 echo
 echo "== Creating a dirty image file =="
 
-IMGOPTS="compat=1.1,lazy_refcounts=on"
-_make_test_img $size
+_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
 
 _NO_VALGRIND \
 $QEMU_IO -c "write -P 0x5a 0 512" \
@@ -98,8 +96,7 @@  $QEMU_IO -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io
 echo
 echo "== Opening a dirty image read/write should repair it =="
 
-IMGOPTS="compat=1.1,lazy_refcounts=on"
-_make_test_img $size
+_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
 
 _NO_VALGRIND \
 $QEMU_IO -c "write -P 0x5a 0 512" \
@@ -117,8 +114,7 @@  $PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
 echo
 echo "== Creating an image file with lazy_refcounts=off =="
 
-IMGOPTS="compat=1.1,lazy_refcounts=off"
-_make_test_img $size
+_make_test_img -o "compat=1.1,lazy_refcounts=off" $size
 
 _NO_VALGRIND \
 $QEMU_IO -c "write -P 0x5a 0 512" \
@@ -132,11 +128,9 @@  _check_test_img
 echo
 echo "== Committing to a backing file with lazy_refcounts=on =="
 
-IMGOPTS="compat=1.1,lazy_refcounts=on"
-TEST_IMG="$TEST_IMG".base _make_test_img $size
+TEST_IMG="$TEST_IMG".base _make_test_img -o "compat=1.1,lazy_refcounts=on" $size
 
-IMGOPTS="compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base"
-_make_test_img $size
+_make_test_img -o "compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base" $size
 
 $QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IMG commit "$TEST_IMG"
@@ -151,8 +145,7 @@  TEST_IMG="$TEST_IMG".base _check_test_img
 echo
 echo "== Changing lazy_refcounts setting at runtime =="
 
-IMGOPTS="compat=1.1,lazy_refcounts=off"
-_make_test_img $size
+_make_test_img -o "compat=1.1,lazy_refcounts=off" $size
 
 _NO_VALGRIND \
 $QEMU_IO -c "reopen -o lazy-refcounts=on" \
@@ -164,8 +157,7 @@  $QEMU_IO -c "reopen -o lazy-refcounts=on" \
 $PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
 _check_test_img
 
-IMGOPTS="compat=1.1,lazy_refcounts=on"
-_make_test_img $size
+_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
 
 _NO_VALGRIND \
 $QEMU_IO -c "reopen -o lazy-refcounts=off" \
diff --git a/tests/qemu-iotests/059 b/tests/qemu-iotests/059
index 10bfbaecec..3941c3f0c2 100755
--- a/tests/qemu-iotests/059
+++ b/tests/qemu-iotests/059
@@ -70,18 +70,18 @@  poke_file "$TEST_IMG" "$grain_table_size_offset" "\x01\x00\x00\x00"
 
 echo
 echo "=== Testing monolithicFlat creation and opening ==="
-IMGOPTS="subformat=monolithicFlat" _make_test_img 2G
+_make_test_img -o "subformat=monolithicFlat" 2G
 _img_info
 _cleanup_test_img
 
 echo
 echo "=== Testing monolithicFlat with zeroed_grain ==="
-IMGOPTS="subformat=monolithicFlat,zeroed_grain=on" _make_test_img 2G
+_make_test_img -o "subformat=monolithicFlat,zeroed_grain=on" 2G
 _cleanup_test_img
 
 echo
 echo "=== Testing big twoGbMaxExtentFlat ==="
-IMGOPTS="subformat=twoGbMaxExtentFlat" _make_test_img 1000G
+_make_test_img -o "subformat=twoGbMaxExtentFlat" 1000G
 $QEMU_IMG info $TEST_IMG | _filter_testdir | sed -e 's/cid: [0-9]*/cid: XXXXXXXX/'
 _cleanup_test_img
 
@@ -101,13 +101,13 @@  _img_info
 
 echo
 echo "=== Testing truncated sparse ==="
-IMGOPTS="subformat=monolithicSparse" _make_test_img 100G
+_make_test_img -o "subformat=monolithicSparse" 100G
 truncate -s 10M $TEST_IMG
 _img_info
 
 echo
 echo "=== Converting to streamOptimized from image with small cluster size==="
-TEST_IMG="$TEST_IMG.qcow2" IMGFMT=qcow2 IMGOPTS="cluster_size=4096" _make_test_img 1G
+TEST_IMG="$TEST_IMG.qcow2" IMGFMT=qcow2 _make_test_img -o "cluster_size=4096" 1G
 $QEMU_IO -f qcow2 -c "write -P 0xa 0 512" "$TEST_IMG.qcow2" | _filter_qemu_io
 $QEMU_IO -f qcow2 -c "write -P 0xb 10240 512" "$TEST_IMG.qcow2" | _filter_qemu_io
 $QEMU_IMG convert -f qcow2 -O vmdk -o subformat=streamOptimized "$TEST_IMG.qcow2" "$TEST_IMG" 2>&1
@@ -117,7 +117,7 @@  echo "=== Testing monolithicFlat with internally generated JSON file name ==="
 
 echo '--- blkdebug ---'
 # Should work, because bdrv_dirname() works fine with blkdebug
-IMGOPTS="subformat=monolithicFlat" _make_test_img 64M
+_make_test_img -o "subformat=monolithicFlat" 64M
 $QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.image.filename=$TEST_IMG,file.inject-error.0.event=read_aio" \
          -c info \
     2>&1 \
@@ -126,7 +126,7 @@  _cleanup_test_img
 
 echo '--- quorum ---'
 # Should not work, because bdrv_dirname() does not work with quorum
-IMGOPTS="subformat=monolithicFlat" _make_test_img 64M
+_make_test_img -o "subformat=monolithicFlat" 64M
 cp "$TEST_IMG" "$TEST_IMG.orig"
 
 filename="json:{
@@ -161,7 +161,7 @@  _cleanup_test_img
 
 echo
 echo "=== Testing 4TB monolithicFlat creation and IO ==="
-IMGOPTS="subformat=monolithicFlat" _make_test_img 4T
+_make_test_img -o "subformat=monolithicFlat" 4T
 _img_info
 $QEMU_IO -c "write -P 0xa 900G 512" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IO -c "read -v 900G 1024" "$TEST_IMG" | _filter_qemu_io
@@ -170,7 +170,7 @@  _cleanup_test_img
 echo
 echo "=== Testing qemu-img map on extents ==="
 for fmt in monolithicSparse twoGbMaxExtentSparse; do
-    IMGOPTS="subformat=$fmt" _make_test_img 31G
+    _make_test_img -o "subformat=$fmt" 31G
     $QEMU_IO -c "write 65024 1k" "$TEST_IMG" | _filter_qemu_io
     $QEMU_IO -c "write 2147483136 1k" "$TEST_IMG" | _filter_qemu_io
     $QEMU_IO -c "write 5G 1k" "$TEST_IMG" | _filter_qemu_io
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index 9c2ef42522..92243c2edd 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -158,7 +158,7 @@  $QEMU_IO -c 'write 0k 64k' "$BACKING_IMG" | _filter_qemu_io
 # compat=0.10 is required in order to make the following discard actually
 # unallocate the sector rather than make it a zero sector - we want COW, after
 # all.
-IMGOPTS='compat=0.10' _make_test_img -b "$BACKING_IMG" 1G
+_make_test_img -o 'compat=0.10' -b "$BACKING_IMG" 1G
 # Write two clusters, the second one enforces creation of an L2 table after
 # the first data cluster.
 $QEMU_IO -c 'write 0k 64k' -c 'write 512M 64k' "$TEST_IMG" | _filter_qemu_io
@@ -398,7 +398,7 @@  echo
 echo "=== Discarding a non-covered in-bounds refblock ==="
 echo
 
-IMGOPTS='refcount_bits=1' _make_test_img 64M
+_make_test_img -o 'refcount_bits=1' 64M
 
 # Pretend there's a refblock somewhere where there is no refblock to
 # cover it (but the covering refblock has a valid index in the
@@ -422,7 +422,7 @@  echo
 echo "=== Discarding a refblock covered by an unaligned refblock ==="
 echo
 
-IMGOPTS='refcount_bits=1' _make_test_img 64M
+_make_test_img -o 'refcount_bits=1' 64M
 
 # Same as above
 poke_file "$TEST_IMG" "$(($rt_offset+8))" "\x00\x00\x00\x10\x00\x00\x00\x00"
diff --git a/tests/qemu-iotests/061 b/tests/qemu-iotests/061
index 4eac5b83bd..0480be0141 100755
--- a/tests/qemu-iotests/061
+++ b/tests/qemu-iotests/061
@@ -41,11 +41,14 @@  trap "_cleanup; exit \$status" 0 1 2 3 15
 _supported_fmt qcow2
 _supported_proto file
 _supported_os Linux
+# Conversion between different compat versions can only really work
+# with refcount_bits=16
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
 
 echo
 echo "=== Testing version downgrade with zero expansion ==="
 echo
-IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
+_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
 $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
 $PYTHON qcow2.py "$TEST_IMG" dump-header
 $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
@@ -56,7 +59,7 @@  _check_test_img
 echo
 echo "=== Testing version downgrade with zero expansion and 4K cache entries ==="
 echo
-IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
+_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
 $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IO -c "write -z 32M 128k" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IO -c map "$TEST_IMG" | _filter_qemu_io
@@ -72,7 +75,7 @@  _check_test_img
 echo
 echo "=== Testing dirty version downgrade ==="
 echo
-IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
+_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
 _NO_VALGRIND \
 $QEMU_IO -c "write -P 0x2a 0 128k" -c flush \
          -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 | _filter_qemu_io
@@ -85,7 +88,7 @@  _check_test_img
 echo
 echo "=== Testing version downgrade with unknown compat/autoclear flags ==="
 echo
-IMGOPTS="compat=1.1" _make_test_img 64M
+_make_test_img -o "compat=1.1" 64M
 $PYTHON qcow2.py "$TEST_IMG" set-feature-bit compatible 42
 $PYTHON qcow2.py "$TEST_IMG" set-feature-bit autoclear 42
 $PYTHON qcow2.py "$TEST_IMG" dump-header
@@ -96,7 +99,7 @@  _check_test_img
 echo
 echo "=== Testing version upgrade and resize ==="
 echo
-IMGOPTS="compat=0.10" _make_test_img 64M
+_make_test_img -o "compat=0.10" 64M
 $QEMU_IO -c "write -P 0x2a 42M 64k" "$TEST_IMG" | _filter_qemu_io
 $PYTHON qcow2.py "$TEST_IMG" dump-header
 $QEMU_IMG amend -o "compat=1.1,lazy_refcounts=on,size=128M" "$TEST_IMG"
@@ -107,7 +110,7 @@  _check_test_img
 echo
 echo "=== Testing dirty lazy_refcounts=off ==="
 echo
-IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
+_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
 _NO_VALGRIND \
 $QEMU_IO -c "write -P 0x2a 0 128k" -c flush \
          -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 | _filter_qemu_io
@@ -120,8 +123,8 @@  _check_test_img
 echo
 echo "=== Testing backing file ==="
 echo
-IMGOPTS="compat=1.1" _make_test_img 64M
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
+_make_test_img -o "compat=1.1" 64M
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
 $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
 $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IMG amend -o "backing_file=$TEST_IMG.base,backing_fmt=qcow2" "$TEST_IMG"
@@ -131,7 +134,7 @@  _check_test_img
 echo
 echo "=== Testing invalid configurations ==="
 echo
-IMGOPTS="compat=0.10" _make_test_img 64M
+_make_test_img -o "compat=0.10" 64M
 $QEMU_IMG amend -o "lazy_refcounts=on" "$TEST_IMG"
 $QEMU_IMG amend -o "compat=1.1" "$TEST_IMG" # actually valid
 $QEMU_IMG amend -o "compat=0.10,lazy_refcounts=on" "$TEST_IMG"
@@ -144,7 +147,7 @@  $QEMU_IMG amend -o "preallocation=on" "$TEST_IMG"
 echo
 echo "=== Testing correct handling of unset value ==="
 echo
-IMGOPTS="compat=1.1,cluster_size=1k" _make_test_img 64M
+_make_test_img -o "compat=1.1,cluster_size=1k" 64M
 echo "Should work:"
 $QEMU_IMG amend -o "lazy_refcounts=on" "$TEST_IMG"
 echo "Should not work:" # Just to know which of these tests actually fails
@@ -153,7 +156,7 @@  $QEMU_IMG amend -o "cluster_size=64k" "$TEST_IMG"
 echo
 echo "=== Testing zero expansion on inactive clusters ==="
 echo
-IMGOPTS="compat=1.1" _make_test_img 64M
+_make_test_img -o "compat=1.1" 64M
 $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IMG snapshot -c foo "$TEST_IMG"
 $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG" | _filter_qemu_io
@@ -167,7 +170,7 @@  $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
 echo
 echo "=== Testing zero expansion on shared L2 table ==="
 echo
-IMGOPTS="compat=1.1" _make_test_img 64M
+_make_test_img -o "compat=1.1" 64M
 $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IMG snapshot -c foo "$TEST_IMG"
 $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
@@ -180,9 +183,9 @@  $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
 echo
 echo "=== Testing zero expansion on backed image ==="
 echo
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
 $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
 $QEMU_IO -c "read -P 0x2a 0 128k" -c "write -z 0 64k" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
 _check_test_img
@@ -191,9 +194,9 @@  $QEMU_IO -c "read -P 0 0 64k" -c "read -P 0x2a 64k 64k" "$TEST_IMG" | _filter_qe
 echo
 echo "=== Testing zero expansion on backed inactive clusters ==="
 echo
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
 $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
 $QEMU_IO -c "write -z 0 64k" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IMG snapshot -c foo "$TEST_IMG"
 $QEMU_IO -c "write -P 0x42 0 128k" "$TEST_IMG" | _filter_qemu_io
@@ -207,9 +210,9 @@  $QEMU_IO -c "read -P 0 0 64k" -c "read -P 0x2a 64k 64k" "$TEST_IMG" | _filter_qe
 echo
 echo "=== Testing zero expansion on backed image with shared L2 table ==="
 echo
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
 $QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
 $QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
 $QEMU_IMG snapshot -c foo "$TEST_IMG"
 $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
@@ -222,7 +225,7 @@  $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
 echo
 echo "=== Testing preallocated zero expansion on full image ==="
 echo
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG" _make_test_img 64M
+TEST_IMG="$TEST_IMG" _make_test_img -o "compat=1.1" 64M
 $QEMU_IO -c "write -P 0x2a 0 64M" "$TEST_IMG" -c "write -z 0 64M" | _filter_qemu_io
 $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
 _check_test_img
@@ -231,8 +234,8 @@  $QEMU_IO -c "read -P 0 0 64M" "$TEST_IMG" | _filter_qemu_io
 echo
 echo "=== Testing progress report without snapshot ==="
 echo
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 4G
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 4G
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 4G
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 4G
 $QEMU_IO -c "write -z 0  64k" \
          -c "write -z 1G 64k" \
          -c "write -z 2G 64k" \
@@ -243,8 +246,8 @@  _check_test_img
 echo
 echo "=== Testing progress report with snapshot ==="
 echo
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 4G
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 4G
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 4G
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 4G
 $QEMU_IO -c "write -z 0  64k" \
          -c "write -z 1G 64k" \
          -c "write -z 2G 64k" \
@@ -256,7 +259,7 @@  _check_test_img
 echo
 echo "=== Testing version downgrade with external data file ==="
 echo
-IMGOPTS="compat=1.1,data_file=$TEST_IMG.data" _make_test_img 64M
+_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data" 64M
 $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
 _img_info --format-specific
 _check_test_img
@@ -264,11 +267,11 @@  _check_test_img
 echo
 echo "=== Try changing the external data file ==="
 echo
-IMGOPTS="compat=1.1" _make_test_img 64M
+_make_test_img -o "compat=1.1" 64M
 $QEMU_IMG amend -o "data_file=foo" "$TEST_IMG"
 
 echo
-IMGOPTS="compat=1.1,data_file=$TEST_IMG.data" _make_test_img 64M
+_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data" 64M
 $QEMU_IMG amend -o "data_file=foo" "$TEST_IMG"
 _img_info --format-specific
 TEST_IMG="data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" _img_info --format-specific --image-opts
@@ -281,7 +284,7 @@  TEST_IMG="data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" _img_info -
 echo
 echo "=== Clearing and setting data-file-raw ==="
 echo
-IMGOPTS="compat=1.1,data_file=$TEST_IMG.data,data_file_raw=on" _make_test_img 64M
+_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data,data_file_raw=on" 64M
 $QEMU_IMG amend -o "data_file_raw=on" "$TEST_IMG"
 _img_info --format-specific
 _check_test_img
diff --git a/tests/qemu-iotests/079 b/tests/qemu-iotests/079
index 81f0c21f53..162355b29a 100755
--- a/tests/qemu-iotests/079
+++ b/tests/qemu-iotests/079
@@ -44,8 +44,7 @@  echo
 cluster_sizes="16384 32768 65536 131072 262144 524288 1048576 2097152 4194304"
 
 for s in $cluster_sizes; do
-    IMGOPTS=$(_optstr_add "$IMGOPTS" "preallocation=metadata,cluster_size=$s") \
-        _make_test_img 4G
+    _make_test_img -o "preallocation=metadata,cluster_size=$s" 4G
 done
 
 # success, all done
diff --git a/tests/qemu-iotests/106 b/tests/qemu-iotests/106
index ac47eaa0f5..b5d1ec4078 100755
--- a/tests/qemu-iotests/106
+++ b/tests/qemu-iotests/106
@@ -51,7 +51,7 @@  for create_mode in off falloc full; do
         echo
         echo "--- create_mode=$create_mode growth_mode=$growth_mode ---"
 
-        IMGOPTS="preallocation=$create_mode" _make_test_img ${CREATION_SIZE}K
+        _make_test_img -o "preallocation=$create_mode" ${CREATION_SIZE}K
         $QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
 
         expected_size=0
diff --git a/tests/qemu-iotests/108 b/tests/qemu-iotests/108
index 9c08172237..b0a6ae597b 100755
--- a/tests/qemu-iotests/108
+++ b/tests/qemu-iotests/108
@@ -65,7 +65,7 @@  echo
 echo '=== Repairing unreferenced data cluster in new refblock area ==='
 echo
 
-IMGOPTS='cluster_size=512' _make_test_img 64M
+_make_test_img -o 'cluster_size=512' 64M
 # Allocate the first 128 kB in the image (first refblock)
 $QEMU_IO -c 'write 0 0x1b200' "$TEST_IMG" | _filter_qemu_io
 # should be 131072 == 0x20000
diff --git a/tests/qemu-iotests/112 b/tests/qemu-iotests/112
index 706c10b600..6850225939 100755
--- a/tests/qemu-iotests/112
+++ b/tests/qemu-iotests/112
@@ -53,20 +53,20 @@  echo '=== refcount_bits limits ==='
 echo
 
 # Must be positive (non-zero)
-IMGOPTS="$IMGOPTS,refcount_bits=0" _make_test_img 64M
+_make_test_img -o "refcount_bits=0" 64M
 # Must be positive (non-negative)
-IMGOPTS="$IMGOPTS,refcount_bits=-1" _make_test_img 64M
+_make_test_img -o "refcount_bits=-1" 64M
 # May not exceed 64
-IMGOPTS="$IMGOPTS,refcount_bits=128" _make_test_img 64M
+_make_test_img -o "refcount_bits=128" 64M
 # Must be a power of two
-IMGOPTS="$IMGOPTS,refcount_bits=42" _make_test_img 64M
+_make_test_img -o "refcount_bits=42" 64M
 
 # 1 is the minimum
-IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
+_make_test_img -o "refcount_bits=1" 64M
 print_refcount_bits
 
 # 64 is the maximum
-IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
+_make_test_img -o "refcount_bits=64" 64M
 print_refcount_bits
 
 # 16 is the default
@@ -78,19 +78,19 @@  echo '=== refcount_bits and compat=0.10 ==='
 echo
 
 # Should work
-IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=16" _make_test_img 64M
+_make_test_img -o "compat=0.10,refcount_bits=16" 64M
 print_refcount_bits
 
 # Should not work
-IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=1" _make_test_img 64M
-IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=64" _make_test_img 64M
+_make_test_img -o "compat=0.10,refcount_bits=1" 64M
+_make_test_img -o "compat=0.10,refcount_bits=64" 64M
 
 
 echo
 echo '=== Snapshot limit on refcount_bits=1 ==='
 echo
 
-IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
+_make_test_img -o "refcount_bits=1" 64M
 print_refcount_bits
 
 $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
@@ -106,7 +106,7 @@  echo
 echo '=== Snapshot limit on refcount_bits=2 ==='
 echo
 
-IMGOPTS="$IMGOPTS,refcount_bits=2" _make_test_img 64M
+_make_test_img -o "refcount_bits=2" 64M
 print_refcount_bits
 
 $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
@@ -124,7 +124,7 @@  echo
 echo '=== Compressed clusters with refcount_bits=1 ==='
 echo
 
-IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
+_make_test_img -o "refcount_bits=1" 64M
 print_refcount_bits
 
 # Both should fit into a single host cluster; instead of failing to increase the
@@ -140,7 +140,7 @@  echo
 echo '=== MSb set in 64 bit refcount ==='
 echo
 
-IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
+_make_test_img -o "refcount_bits=64" 64M
 print_refcount_bits
 
 $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
@@ -158,7 +158,7 @@  echo
 echo '=== Snapshot on maximum 64 bit refcount value ==='
 echo
 
-IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
+_make_test_img -o "refcount_bits=64" 64M
 print_refcount_bits
 
 $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
@@ -239,7 +239,7 @@  echo
 echo '=== Testing too many references for check ==='
 echo
 
-IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
+_make_test_img -o "refcount_bits=1" 64M
 print_refcount_bits
 
 # This cluster should be created at 0x50000
@@ -262,7 +262,7 @@  echo
 echo '=== Multiple walks necessary during amend ==='
 echo
 
-IMGOPTS="$IMGOPTS,refcount_bits=1,cluster_size=512" _make_test_img 64k
+_make_test_img -o "refcount_bits=1,cluster_size=512" 64k
 
 # Cluster 0 is the image header, clusters 1 to 4 are used by the L1 table, a
 # single L2 table, the reftable and a single refblock. This creates 58 data
diff --git a/tests/qemu-iotests/115 b/tests/qemu-iotests/115
index 9ed3cb6a83..d254b18342 100755
--- a/tests/qemu-iotests/115
+++ b/tests/qemu-iotests/115
@@ -64,8 +64,7 @@  echo
 # least 256 MB. We can achieve that by using preallocation=metadata for an image
 # which has a guest disk size of 256 MB.
 
-IMGOPTS="$IMGOPTS,refcount_bits=64,cluster_size=512,preallocation=metadata" \
-    _make_test_img 256M
+_make_test_img -o "refcount_bits=64,cluster_size=512,preallocation=metadata" 256M
 
 # We know for sure that the L1 and refcount tables do not overlap with any other
 # structure because the metadata overlap checks would have caught that case.
diff --git a/tests/qemu-iotests/121 b/tests/qemu-iotests/121
index 90a0424edb..10db813d94 100755
--- a/tests/qemu-iotests/121
+++ b/tests/qemu-iotests/121
@@ -50,7 +50,7 @@  echo
 # Preallocation speeds up the write operation, but preallocating everything will
 # destroy the purpose of the write; so preallocate one KB less than what would
 # cause a reftable growth...
-IMGOPTS='preallocation=metadata,cluster_size=1k' _make_test_img 64512K
+_make_test_img -o 'preallocation=metadata,cluster_size=1k' 64512K
 # ...and make the image the desired size afterwards.
 $QEMU_IMG resize "$TEST_IMG" 65M
 
@@ -73,7 +73,7 @@  echo
 echo '--- Test 2 ---'
 echo
 
-IMGOPTS='preallocation=metadata,cluster_size=1k' _make_test_img 64513K
+_make_test_img -o 'preallocation=metadata,cluster_size=1k' 64513K
 # This results in an L1 table growth which in turn results in some clusters at
 # the start of the image becoming free
 $QEMU_IMG resize "$TEST_IMG" 65M
@@ -96,7 +96,7 @@  echo
 echo '=== Allocating a new refcount block must not leave holes in the image ==='
 echo
 
-IMGOPTS='cluster_size=512,refcount_bits=16' _make_test_img 1M
+_make_test_img -o 'cluster_size=512,refcount_bits=16' 1M
 
 # This results in an image with 256 used clusters: the qcow2 header,
 # the refcount table, one refcount block, the L1 table, four L2 tables
diff --git a/tests/qemu-iotests/125 b/tests/qemu-iotests/125
index 4e31aa4e5f..d510984045 100755
--- a/tests/qemu-iotests/125
+++ b/tests/qemu-iotests/125
@@ -114,7 +114,7 @@  for GROWTH_SIZE in 16 48 80; do
         for growth_mode in off metadata falloc full; do
             echo "--- cluster_size=$cluster_size growth_size=$GROWTH_SIZE create_mode=$create_mode growth_mode=$growth_mode ---"
 
-            IMGOPTS="preallocation=$create_mode,cluster_size=$cluster_size" _make_test_img ${CREATION_SIZE}
+            _make_test_img -o "preallocation=$create_mode,cluster_size=$cluster_size" ${CREATION_SIZE}
             $QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
 
             host_size_0=$(get_image_size_on_host)
diff --git a/tests/qemu-iotests/137 b/tests/qemu-iotests/137
index 089821da0c..6cf2997577 100755
--- a/tests/qemu-iotests/137
+++ b/tests/qemu-iotests/137
@@ -117,7 +117,7 @@  $QEMU_IO \
     -c "reopen -o cache-clean-interval=-1" \
     "$TEST_IMG" | _filter_qemu_io
 
-IMGOPTS="cluster_size=256k" _make_test_img 32P
+_make_test_img -o "cluster_size=256k" 32P
 $QEMU_IO \
     -c "reopen -o l2-cache-entry-size=512,l2-cache-size=1T" \
     "$TEST_IMG" | _filter_qemu_io
diff --git a/tests/qemu-iotests/138 b/tests/qemu-iotests/138
index 6a731370db..66ae9d5e78 100755
--- a/tests/qemu-iotests/138
+++ b/tests/qemu-iotests/138
@@ -45,8 +45,7 @@  echo
 echo '=== Check on an image with a multiple of 2^32 clusters ==='
 echo
 
-IMGOPTS=$(_optstr_add "$IMGOPTS" "cluster_size=512") \
-    _make_test_img 512
+_make_test_img -o "cluster_size=512" 512
 
 # Allocate L2 table
 $QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
diff --git a/tests/qemu-iotests/175 b/tests/qemu-iotests/175
index 55db2803ed..020ed8e61f 100755
--- a/tests/qemu-iotests/175
+++ b/tests/qemu-iotests/175
@@ -95,7 +95,7 @@  stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_block
 for mode in off full falloc; do
     echo
     echo "== creating image with preallocation $mode =="
-    IMGOPTS=preallocation=$mode _make_test_img $size | _filter_imgfmt
+    _make_test_img -o preallocation=$mode $size | _filter_imgfmt
     stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size
 done
 
diff --git a/tests/qemu-iotests/190 b/tests/qemu-iotests/190
index eb766ad09f..5890ff9cfc 100755
--- a/tests/qemu-iotests/190
+++ b/tests/qemu-iotests/190
@@ -45,7 +45,7 @@  _supported_proto file
 echo "== Huge file =="
 echo
 
-IMGOPTS='cluster_size=2M' _make_test_img 2T
+_make_test_img -o 'cluster_size=2M' 2T
 
 $QEMU_IMG measure -O raw -f qcow2 "$TEST_IMG"
 $QEMU_IMG measure -O qcow2 -o cluster_size=64k -f qcow2 "$TEST_IMG"
diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191
index 528022e8d8..21c16a32cb 100755
--- a/tests/qemu-iotests/191
+++ b/tests/qemu-iotests/191
@@ -51,8 +51,7 @@  echo === Preparing and starting VM ===
 echo
 
 TEST_IMG="${TEST_IMG}.base" _make_test_img $size
-IMGOPTS=$(_optstr_add "$IMGOPTS" "backing_fmt=$IMGFMT") \
-    TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
+TEST_IMG="${TEST_IMG}.mid" _make_test_img -o "backing_fmt=$IMGFMT" -b "${TEST_IMG}.base"
 _make_test_img -b "${TEST_IMG}.mid"
 TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"
 
diff --git a/tests/qemu-iotests/220 b/tests/qemu-iotests/220
index 2d62c5dcac..3769f372cb 100755
--- a/tests/qemu-iotests/220
+++ b/tests/qemu-iotests/220
@@ -37,6 +37,8 @@  trap "_cleanup; exit \$status" 0 1 2 3 15
 _supported_fmt qcow2
 _supported_proto file
 _supported_os Linux
+# To use a different refcount width but 16 bits we need compat=1.1
+_unsupported_imgopts 'compat=0.10'
 
 echo "== Creating huge file =="
 
@@ -46,7 +48,7 @@  if ! truncate --size=513T "$TEST_IMG"; then
     _notrun "file system on $TEST_DIR does not support large enough files"
 fi
 rm "$TEST_IMG"
-IMGOPTS='cluster_size=2M,refcount_bits=1' _make_test_img 513T
+_make_test_img -o 'cluster_size=2M,refcount_bits=1' 513T
 
 echo "== Populating refcounts =="
 # We want an image with 256M refcounts * 2M clusters = 512T referenced.
diff --git a/tests/qemu-iotests/243 b/tests/qemu-iotests/243
index e563761307..2b84b896db 100755
--- a/tests/qemu-iotests/243
+++ b/tests/qemu-iotests/243
@@ -40,6 +40,8 @@  trap "_cleanup; exit \$status" 0 1 2 3 15
 _supported_fmt qcow2
 _supported_proto file
 _supported_os Linux
+# External data files do not work with compat=0.10
+_unsupported_imgopts 'compat=0.10'
 
 for mode in off metadata falloc full; do
 
@@ -47,7 +49,7 @@  for mode in off metadata falloc full; do
     echo "=== preallocation=$mode ==="
     echo
 
-    IMGOPTS="preallocation=$mode" _make_test_img 64M
+    _make_test_img -o "preallocation=$mode" 64M
 
     printf "File size: "
     du -b $TEST_IMG | cut -f1
@@ -64,7 +66,7 @@  for mode in off metadata falloc full; do
     echo "=== External data file: preallocation=$mode ==="
     echo
 
-    IMGOPTS="data_file=$TEST_IMG.data,preallocation=$mode" _make_test_img 64M
+    _make_test_img -o "data_file=$TEST_IMG.data,preallocation=$mode" 64M
 
     echo -n "qcow2 file size: "
     du -b $TEST_IMG | cut -f1
diff --git a/tests/qemu-iotests/244 b/tests/qemu-iotests/244
index 13978f93d2..0375bc12d4 100755
--- a/tests/qemu-iotests/244
+++ b/tests/qemu-iotests/244
@@ -41,13 +41,15 @@  trap "_cleanup; exit \$status" 0 1 2 3 15
 _supported_fmt qcow2
 _supported_proto file
 _supported_os Linux
+# External data files do not work with compat=0.10
+_unsupported_imgopts 'compat=0.10'
 
 echo
 echo "=== Create and open image with external data file ==="
 echo
 
 echo "With data file name in the image:"
-IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
+_make_test_img -o "data_file=$TEST_IMG.data" 64M
 _check_test_img
 
 $QEMU_IO -c "open $TEST_IMG" -c "read -P 0 0 64k" 2>&1 | _filter_qemu_io | _filter_testdir
@@ -104,7 +106,7 @@  echo
 echo "=== Standalone image with external data file (efficient) ==="
 echo
 
-IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
+_make_test_img -o "data_file=$TEST_IMG.data" 64M
 
 echo -n "qcow2 file size before I/O: "
 du -b $TEST_IMG | cut -f1
@@ -154,7 +156,7 @@  echo
 echo "=== Standalone image with external data file (valid raw) ==="
 echo
 
-IMGOPTS="data_file=$TEST_IMG.data,data_file_raw=on" _make_test_img 64M
+_make_test_img -o "data_file=$TEST_IMG.data,data_file_raw=on" 64M
 
 echo -n "qcow2 file size before I/O: "
 du -b $TEST_IMG | cut -f1
@@ -187,7 +189,7 @@  echo
 echo "=== bdrv_co_block_status test for file and offset=0 ==="
 echo
 
-IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
+_make_test_img -o "data_file=$TEST_IMG.data" 64M
 
 $QEMU_IO -c 'write -P 0x11 0 1M' -f $IMGFMT "$TEST_IMG" | _filter_qemu_io
 $QEMU_IO -c 'read -P 0x11 0 1M' -f $IMGFMT "$TEST_IMG" | _filter_qemu_io
diff --git a/tests/qemu-iotests/250 b/tests/qemu-iotests/250
index c9c0a84a5a..670cf19076 100755
--- a/tests/qemu-iotests/250
+++ b/tests/qemu-iotests/250
@@ -55,9 +55,8 @@  disk_usage()
 }
 
 size=2100M
-IMGOPTS="cluster_size=1M,preallocation=metadata"
 
-_make_test_img $size
+_make_test_img -o "cluster_size=1M,preallocation=metadata" $size
 $QEMU_IO -c 'discard 0 10M' -c 'discard 2090M 10M' \
          -c 'write 2090M 10M' -c 'write 0 10M' "$TEST_IMG" | _filter_qemu_io
 
diff --git a/tests/qemu-iotests/265 b/tests/qemu-iotests/265
index dce6f77be3..00f2ec769e 100755
--- a/tests/qemu-iotests/265
+++ b/tests/qemu-iotests/265
@@ -41,7 +41,7 @@  _supported_os Linux
 echo '--- Writing to the image ---'
 
 # Reduce cluster size so we get more and quicker I/O
-IMGOPTS='cluster_size=4096' _make_test_img 1M
+_make_test_img -o 'cluster_size=4096' 1M
 (for ((kb = 1024 - 4; kb >= 0; kb -= 4)); do \
      echo "aio_write -P 42 $((kb + 1))k 2k"; \
  done) \