diff options
author | Peter Maydell | 2020-12-12 01:20:45 +0100 |
---|---|---|
committer | Peter Maydell | 2020-12-12 01:20:46 +0100 |
commit | ad717e6da3852b5729217d7938eecdb81c546114 (patch) | |
tree | a7bd837a102b0bcc9c270540a229582d146d812c /tests | |
parent | Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20201211' into staging (diff) | |
parent | block: Fix deadlock in bdrv_co_yield_to_drain() (diff) | |
download | qemu-ad717e6da3852b5729217d7938eecdb81c546114.tar.gz qemu-ad717e6da3852b5729217d7938eecdb81c546114.tar.xz qemu-ad717e6da3852b5729217d7938eecdb81c546114.zip |
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging
Block layer patches:
- Support for FUSE exports
- Fix deadlock in bdrv_co_yield_to_drain()
- Use lock guard macros
- Some preparational patches for 64 bit block layer
- file-posix: Fix request extension to INT64_MAX in raw_do_pwrite_zeroes()
# gpg: Signature made Fri 11 Dec 2020 17:06:19 GMT
# gpg: using RSA key DC3DEB159A9AF95D3D7456FE7F09B272C88F2FD6
# gpg: issuer "kwolf@redhat.com"
# gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" [full]
# Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6
* remotes/kevin/tags/for-upstream: (34 commits)
block: Fix deadlock in bdrv_co_yield_to_drain()
block: Fix locking in qmp_block_resize()
block: Simplify qmp_block_resize() error paths
block: introduce BDRV_MAX_LENGTH
block/io: bdrv_check_byte_request(): drop bdrv_is_inserted()
block/io: bdrv_refresh_limits(): use ERRP_GUARD
block/file-posix: fix workaround in raw_do_pwrite_zeroes()
can-host: Fix crash when 'canbus' property is not set
iotests/221: Discard image before qemu-img map
file-posix: check the use_lock before setting the file lock
iotests/308: Add test for FUSE exports
iotests: Enable fuse for many tests
iotests: Allow testing FUSE exports
iotests: Give access to the qemu-storage-daemon
storage-daemon: Call bdrv_close_all() on exit
iotests/287: Clean up subshell test image
iotests: Let _make_test_img guess $TEST_IMG_FILE
iotests: Restrict some Python tests to file
iotests/091: Use _cleanup_qemu instad of "wait"
iotests: Derive image names from $TEST_IMG
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'tests')
92 files changed, 800 insertions, 133 deletions
diff --git a/tests/qemu-iotests/025 b/tests/qemu-iotests/025 index e05d833452..1569d912f4 100755 --- a/tests/qemu-iotests/025 +++ b/tests/qemu-iotests/025 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.pattern _supported_fmt raw qcow2 qed luks -_supported_proto file sheepdog rbd nfs +_supported_proto file sheepdog rbd nfs fuse echo "=== Creating image" echo diff --git a/tests/qemu-iotests/026 b/tests/qemu-iotests/026 index b9713eb591..9ecc5880b1 100755 --- a/tests/qemu-iotests/026 +++ b/tests/qemu-iotests/026 @@ -41,7 +41,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # Currently only qcow2 supports rebasing _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _default_cache_mode writethrough _supported_cache_modes writethrough none # The refcount table tests expect a certain minimum width for refcount entries diff --git a/tests/qemu-iotests/028 b/tests/qemu-iotests/028 index 6dd3ae09a3..57d34aae99 100755 --- a/tests/qemu-iotests/028 +++ b/tests/qemu-iotests/028 @@ -46,7 +46,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # Any format supporting backing files except vmdk and qcow which do not support # smaller backing files. _supported_fmt qcow2 qed -_supported_proto file +_supported_proto file fuse _supported_os Linux # Choose a size that is not necessarily a cluster size multiple for image @@ -116,16 +116,10 @@ else QEMU_COMM_TIMEOUT=1 fi -# Silence output since it contains the disk image path and QEMU's readline -# character echoing makes it very hard to filter the output. Plus, there -# is no telling how many times the command will repeat before succeeding. -# (Note that creating the image results in a "Formatting..." message over -# stdout, which is the same channel the monitor uses. We cannot reliably -# wait for it because the monitor output may interact with it in such a -# way that _timed_wait_for cannot read it. However, once the block job is -# done, we know that the "Formatting..." message must have appeared -# already, so the output is still deterministic.) -silent=y _send_qemu_cmd $h "drive_backup disk ${TEST_IMG}.copy" "(qemu)" +TEST_IMG="$TEST_IMG.copy" _make_test_img $image_size +_send_qemu_cmd $h "drive_backup -n disk ${TEST_IMG}.copy" "(qemu)" \ + | _filter_imgfmt + silent=y qemu_cmd_repeat=20 _send_qemu_cmd $h "info block-jobs" "No active jobs" _send_qemu_cmd $h "info block-jobs" "No active jobs" _send_qemu_cmd $h 'quit' "" diff --git a/tests/qemu-iotests/028.out b/tests/qemu-iotests/028.out index 5a68de5c46..e580488216 100644 --- a/tests/qemu-iotests/028.out +++ b/tests/qemu-iotests/028.out @@ -468,6 +468,9 @@ No errors were found on the image. block-backup +Formatting 'TEST_DIR/t.IMGFMT.copy', fmt=IMGFMT size=4294968832 +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) drive_backup -n disk TEST_DIR/t.IMGFMT.copy (qemu) info block-jobs No active jobs === IO: pattern 195 diff --git a/tests/qemu-iotests/031 b/tests/qemu-iotests/031 index 646ecd593f..2bcbc5886e 100755 --- a/tests/qemu-iotests/031 +++ b/tests/qemu-iotests/031 @@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This tests qcow2-specific low-level functionality _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # We want to test compat=0.10, which does not support external data # files or refcount widths other than 16 _unsupported_imgopts data_file 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' diff --git a/tests/qemu-iotests/034 b/tests/qemu-iotests/034 index ac2d687c71..08f7aea6d5 100755 --- a/tests/qemu-iotests/034 +++ b/tests/qemu-iotests/034 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow qcow2 vmdk qed -_supported_proto file +_supported_proto file fuse _supported_os Linux _unsupported_imgopts "subformat=monolithicFlat" \ "subformat=twoGbMaxExtentFlat" \ diff --git a/tests/qemu-iotests/036 b/tests/qemu-iotests/036 index cf522de7a1..6b82638080 100755 --- a/tests/qemu-iotests/036 +++ b/tests/qemu-iotests/036 @@ -42,7 +42,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This tests qcow2-specific low-level functionality _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # Only qcow2v3 and later supports feature bits; # qcow2.py does not support external data files; # this test requires a cluster size large enough for the feature table diff --git a/tests/qemu-iotests/037 b/tests/qemu-iotests/037 index e1187ac24a..bb893c43dc 100755 --- a/tests/qemu-iotests/037 +++ b/tests/qemu-iotests/037 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow qcow2 vmdk qed -_supported_proto file +_supported_proto file fuse _unsupported_imgopts "subformat=monolithicFlat" \ "subformat=twoGbMaxExtentFlat" \ "subformat=twoGbMaxExtentSparse" \ diff --git a/tests/qemu-iotests/038 b/tests/qemu-iotests/038 index a253231f5b..30f1f73c25 100755 --- a/tests/qemu-iotests/038 +++ b/tests/qemu-iotests/038 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 qed -_supported_proto file +_supported_proto file fuse _supported_os Linux CLUSTER_SIZE=2M diff --git a/tests/qemu-iotests/039 b/tests/qemu-iotests/039 index 42f6503138..ad3867c3fc 100755 --- a/tests/qemu-iotests/039 +++ b/tests/qemu-iotests/039 @@ -40,7 +40,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux _default_cache_mode writethrough _supported_cache_modes writethrough diff --git a/tests/qemu-iotests/046 b/tests/qemu-iotests/046 index 88b3363c19..ed6fae3529 100755 --- a/tests/qemu-iotests/046 +++ b/tests/qemu-iotests/046 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # data_file does not support compressed clusters _unsupported_imgopts data_file @@ -47,6 +47,8 @@ size=128M echo echo "== creating backing file for COW tests ==" +TEST_IMG_SAVE=$TEST_IMG +TEST_IMG="$TEST_IMG.base" _make_test_img $size backing_io() @@ -67,8 +69,7 @@ backing_io() backing_io 0 32 write | $QEMU_IO "$TEST_IMG" | _filter_qemu_io -mv "$TEST_IMG" "$TEST_IMG.base" - +TEST_IMG=$TEST_IMG_SAVE _make_test_img -b "$TEST_IMG.base" -F $IMGFMT 6G echo diff --git a/tests/qemu-iotests/046.out b/tests/qemu-iotests/046.out index b022bcddd5..66ad987ab3 100644 --- a/tests/qemu-iotests/046.out +++ b/tests/qemu-iotests/046.out @@ -1,7 +1,7 @@ QA output created by 046 == creating backing file for COW tests == -Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728 wrote 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 65536/65536 bytes at offset 65536 diff --git a/tests/qemu-iotests/050 b/tests/qemu-iotests/050 index 4b0a390c43..741bdb610e 100755 --- a/tests/qemu-iotests/050 +++ b/tests/qemu-iotests/050 @@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 qed -_supported_proto file +_supported_proto file fuse echo echo "== Creating images ==" diff --git a/tests/qemu-iotests/054 b/tests/qemu-iotests/054 index a8905b60d0..40922db2b1 100755 --- a/tests/qemu-iotests/054 +++ b/tests/qemu-iotests/054 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse echo echo "creating too large image (1 EB)" diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060 index 94c0d5accc..4b81d1aa51 100755 --- a/tests/qemu-iotests/060 +++ b/tests/qemu-iotests/060 @@ -46,7 +46,7 @@ _filter_io_error() # This tests qcow2-specific low-level functionality _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # These tests only work for compat=1.1 images without an external # data file with refcount_bits=16 diff --git a/tests/qemu-iotests/071 b/tests/qemu-iotests/071 index 88faebcc1d..49faae6684 100755 --- a/tests/qemu-iotests/071 +++ b/tests/qemu-iotests/071 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _require_drivers blkdebug blkverify # blkdebug can only inject errors on bs->file, not on the data_file, # so thie test does not work with external data files @@ -61,8 +61,17 @@ echo echo "=== Testing blkverify through filename ===" echo -TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE |\ - _filter_imgfmt +# _make_test_img may set variables that we need to retain. Everything +# in a pipe is executed in a subshell, so doing so would throw away +# all changes. Therefore, we have to store the output in some temp +# file and filter that. +scratch_out="$TEST_DIR/img-create.out" + +TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE \ + >"$scratch_out" +_filter_imgfmt <"$scratch_out" +rm -f "$scratch_out" + _make_test_img $IMG_SIZE $QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \ -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io @@ -76,8 +85,10 @@ echo echo "=== Testing blkverify through file blockref ===" echo -TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE |\ - _filter_imgfmt +TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE \ + >"$scratch_out" +_filter_imgfmt <"$scratch_out" + _make_test_img $IMG_SIZE $QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base,file.test.driver=$IMGFMT,file.test.file.filename=$TEST_IMG" \ -c 'read 0 512' -c 'write -P 42 0x38000 512' -c 'read -P 42 0x38000 512' | _filter_qemu_io diff --git a/tests/qemu-iotests/079 b/tests/qemu-iotests/079 index 3642b51feb..0f0d94a2ac 100755 --- a/tests/qemu-iotests/079 +++ b/tests/qemu-iotests/079 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file nfs +_supported_proto file nfs fuse # Some containers (e.g. non-x86 on Travis) do not allow large files _require_large_file 4G diff --git a/tests/qemu-iotests/080 b/tests/qemu-iotests/080 index 7588c63b6c..bda8617c38 100755 --- a/tests/qemu-iotests/080 +++ b/tests/qemu-iotests/080 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # - Internal snapshots are (currently) impossible with refcount_bits=1, # and generally impossible with external data files diff --git a/tests/qemu-iotests/089 b/tests/qemu-iotests/089 index 66c5415abe..f0929b64c0 100755 --- a/tests/qemu-iotests/089 +++ b/tests/qemu-iotests/089 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # Because anything other than 16 would change the output of qemu_io -c info _unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' @@ -62,7 +62,8 @@ TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE $QEMU_IO -c 'write -P 42 0 512' -c 'write -P 23 512 512' \ -c 'write -P 66 1024 512' "$TEST_IMG.base" | _filter_qemu_io -$QEMU_IMG convert -f raw -O $IMGFMT "$TEST_IMG.base" "$TEST_IMG" +_make_test_img $IMG_SIZE +$QEMU_IMG convert -f raw -O $IMGFMT -n "$TEST_IMG.base" "$TEST_IMG" $QEMU_IO_PROG --cache $CACHEMODE --aio $AIOMODE \ -c 'read -P 42 0 512' -c 'read -P 23 512 512' \ diff --git a/tests/qemu-iotests/089.out b/tests/qemu-iotests/089.out index 15682c2886..c53fc4823a 100644 --- a/tests/qemu-iotests/089.out +++ b/tests/qemu-iotests/089.out @@ -9,6 +9,7 @@ wrote 512/512 bytes at offset 512 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 512/512 bytes at offset 1024 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 read 512/512 bytes at offset 0 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 512/512 bytes at offset 512 diff --git a/tests/qemu-iotests/090 b/tests/qemu-iotests/090 index 1246e4f910..87e872ebf4 100755 --- a/tests/qemu-iotests/090 +++ b/tests/qemu-iotests/090 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file nfs +_supported_proto file nfs fuse # External data files do not support compressed clusters _unsupported_imgopts data_file diff --git a/tests/qemu-iotests/091 b/tests/qemu-iotests/091 index 68fbfd777b..8dee168bf6 100755 --- a/tests/qemu-iotests/091 +++ b/tests/qemu-iotests/091 @@ -44,7 +44,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux _supported_cache_modes writethrough none writeback _default_cache_mode none writeback @@ -96,7 +96,8 @@ _send_qemu_cmd $h2 'qemu-io disk flush' "(qemu)" _send_qemu_cmd $h2 'quit' "" _send_qemu_cmd $h1 'quit' "" -wait +wait=yes _cleanup_qemu >/dev/null + echo "Check image pattern" ${QEMU_IO} -c "read -P 0x22 0 4M" "${TEST_IMG}" | _filter_testdir | _filter_qemu_io diff --git a/tests/qemu-iotests/095 b/tests/qemu-iotests/095 index 77a5f0f3f5..7604ae6966 100755 --- a/tests/qemu-iotests/095 +++ b/tests/qemu-iotests/095 @@ -44,7 +44,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse size_smaller=5M size_larger=100M diff --git a/tests/qemu-iotests/097 b/tests/qemu-iotests/097 index d910a8b107..1837d4e8e0 100755 --- a/tests/qemu-iotests/097 +++ b/tests/qemu-iotests/097 @@ -41,7 +41,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # Any format supporting backing files and bdrv_make_empty _supported_fmt qcow qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux diff --git a/tests/qemu-iotests/098 b/tests/qemu-iotests/098 index f2ccdd7909..a35ce7205e 100755 --- a/tests/qemu-iotests/098 +++ b/tests/qemu-iotests/098 @@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.pattern _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # The code path we want to test here only works for compat=1.1 images; # blkdebug can only inject errors on bs->file, so external data files # do not work with this test diff --git a/tests/qemu-iotests/102 b/tests/qemu-iotests/102 index b898df436f..2cc3efd1ed 100755 --- a/tests/qemu-iotests/102 +++ b/tests/qemu-iotests/102 @@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse IMG_SIZE=64K diff --git a/tests/qemu-iotests/103 b/tests/qemu-iotests/103 index 8c1ebe0443..220481db4c 100755 --- a/tests/qemu-iotests/103 +++ b/tests/qemu-iotests/103 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file nfs +_supported_proto file nfs fuse # Internal snapshots are (currently) impossible with refcount_bits=1, # and generally impossible with external data files _unsupported_imgopts 'refcount_bits=1[^0-9]' data_file diff --git a/tests/qemu-iotests/106 b/tests/qemu-iotests/106 index a20659d443..20ad7bd5a2 100755 --- a/tests/qemu-iotests/106 +++ b/tests/qemu-iotests/106 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt raw -_supported_proto file +_supported_proto file fuse _supported_os Linux # in kB diff --git a/tests/qemu-iotests/107 b/tests/qemu-iotests/107 index 268ba27688..d24829ccf9 100755 --- a/tests/qemu-iotests/107 +++ b/tests/qemu-iotests/107 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file nfs +_supported_proto file nfs fuse IMG_SIZE=64K diff --git a/tests/qemu-iotests/108 b/tests/qemu-iotests/108 index 5f7076fba4..ba67748bdf 100755 --- a/tests/qemu-iotests/108 +++ b/tests/qemu-iotests/108 @@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This tests qcow2-specific low-level functionality _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # This test directly modifies a refblock so it relies on refcount_bits being 16; # and the low-level modification it performs are not tuned for external data diff --git a/tests/qemu-iotests/111 b/tests/qemu-iotests/111 index 3b43d1bd83..bd839a39f4 100755 --- a/tests/qemu-iotests/111 +++ b/tests/qemu-iotests/111 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qed qcow qcow2 vmdk -_supported_proto file +_supported_proto file fuse _unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat" _make_test_img -b "$TEST_IMG.inexistent" diff --git a/tests/qemu-iotests/112 b/tests/qemu-iotests/112 index 20ff5c224a..6e413f5651 100755 --- a/tests/qemu-iotests/112 +++ b/tests/qemu-iotests/112 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This tests qcow2-specific low-level functionality _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # This test will set refcount_bits on its own which would conflict with the # manual setting; compat will be overridden as well; # and external data files do not work well with our refcount testing diff --git a/tests/qemu-iotests/115 b/tests/qemu-iotests/115 index d254b18342..7f53987d1b 100755 --- a/tests/qemu-iotests/115 +++ b/tests/qemu-iotests/115 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # This test relies on refcounts being 64 bits wide (which does not work with # compat=0.10) _unsupported_imgopts 'refcount_bits=\([^6]\|.\([^4]\|$\)\)' 'compat=0.10' diff --git a/tests/qemu-iotests/117 b/tests/qemu-iotests/117 index f37b34f8b1..9039555ac4 100755 --- a/tests/qemu-iotests/117 +++ b/tests/qemu-iotests/117 @@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _make_test_img 64k diff --git a/tests/qemu-iotests/120 b/tests/qemu-iotests/120 index 2931a7550f..45c55c1c01 100755 --- a/tests/qemu-iotests/120 +++ b/tests/qemu-iotests/120 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt generic -_supported_proto file +_supported_proto file fuse _unsupported_fmt luks _require_drivers raw diff --git a/tests/qemu-iotests/121 b/tests/qemu-iotests/121 index 90ea0db737..8357ce089a 100755 --- a/tests/qemu-iotests/121 +++ b/tests/qemu-iotests/121 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # Refcount structures are used much differently with external data # files diff --git a/tests/qemu-iotests/127 b/tests/qemu-iotests/127 index e2ac2f5536..77fdfd0205 100755 --- a/tests/qemu-iotests/127 +++ b/tests/qemu-iotests/127 @@ -41,7 +41,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _require_devices virtio-scsi scsi-hd diff --git a/tests/qemu-iotests/133 b/tests/qemu-iotests/133 index 4070fd9457..bc82d8ebd7 100755 --- a/tests/qemu-iotests/133 +++ b/tests/qemu-iotests/133 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse TEST_IMG="$TEST_IMG.base" _make_test_img 64M _make_test_img -b "$TEST_IMG.base" -F $IMGFMT diff --git a/tests/qemu-iotests/137 b/tests/qemu-iotests/137 index 7ae86892f7..de555a91c9 100755 --- a/tests/qemu-iotests/137 +++ b/tests/qemu-iotests/137 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # We are going to use lazy-refcounts _unsupported_imgopts 'compat=0.10' diff --git a/tests/qemu-iotests/138 b/tests/qemu-iotests/138 index 1d5b0bed6d..e87a64eb89 100755 --- a/tests/qemu-iotests/138 +++ b/tests/qemu-iotests/138 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This tests qcow2-specific low-level functionality _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # With an external data file, data clusters are not refcounted # (so qemu-img check would not do much); diff --git a/tests/qemu-iotests/140 b/tests/qemu-iotests/140 index 309b177e77..ff6b904fa0 100755 --- a/tests/qemu-iotests/140 +++ b/tests/qemu-iotests/140 @@ -44,7 +44,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt generic -_supported_proto file +_supported_proto file fuse _supported_os Linux _make_test_img 64k diff --git a/tests/qemu-iotests/154 b/tests/qemu-iotests/154 index 7f1c0d9bd9..34a1c051b6 100755 --- a/tests/qemu-iotests/154 +++ b/tests/qemu-iotests/154 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux CLUSTER_SIZE=4k diff --git a/tests/qemu-iotests/161 b/tests/qemu-iotests/161 index e270976d87..4fb7d0cbf0 100755 --- a/tests/qemu-iotests/161 +++ b/tests/qemu-iotests/161 @@ -42,15 +42,15 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # Any format implementing BlockDriver.bdrv_change_backing_file _supported_fmt qcow2 qed -_supported_proto file +_supported_proto file fuse _supported_os Linux IMG_SIZE=1M # Create the images -TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE | _filter_imgfmt -TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" -F $IMGFMT | _filter_imgfmt -_make_test_img -b "$TEST_IMG.int" -F $IMGFMT -F $IMGFMT | _filter_imgfmt +TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE +TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" -F $IMGFMT +_make_test_img -b "$TEST_IMG.int" -F $IMGFMT -F $IMGFMT # First test: reopen $TEST.IMG changing the detect-zeroes option on # its backing file ($TEST_IMG.int). @@ -105,9 +105,9 @@ echo echo "*** Commit and then change an option on the backing file" echo # Create the images again -TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE | _filter_imgfmt -TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" -F $IMGFMT| _filter_imgfmt -_make_test_img -b "$TEST_IMG.int" -F $IMGFMT | _filter_imgfmt +TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE +TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" -F $IMGFMT +_make_test_img -b "$TEST_IMG.int" -F $IMGFMT _launch_qemu -drive if=none,file="${TEST_IMG}" _send_qemu_cmd $QEMU_HANDLE \ diff --git a/tests/qemu-iotests/171 b/tests/qemu-iotests/171 index 341064a1c6..f3582edb10 100755 --- a/tests/qemu-iotests/171 +++ b/tests/qemu-iotests/171 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt raw -_supported_proto file +_supported_proto file fuse _supported_os Linux diff --git a/tests/qemu-iotests/174 b/tests/qemu-iotests/174 index e2f14a38c6..1b0dd2e8b7 100755 --- a/tests/qemu-iotests/174 +++ b/tests/qemu-iotests/174 @@ -40,7 +40,15 @@ _unsupported_fmt raw size=256K -IMGFMT=raw IMGKEYSECRET= _make_test_img --no-opts $size | _filter_imgfmt + +# _make_test_img may set variables that we need to retain. Everything +# in a pipe is executed in a subshell, so doing so would throw away +# all changes. Therefore, we have to store the output in some temp +# file and filter that. +scratch_out="$TEST_DIR/img-create.out" +IMGFMT=raw IMGKEYSECRET= _make_test_img --no-opts $size >"$scratch_out" +_filter_imgfmt <"$scratch_out" +rm -f "$scratch_out" echo echo "== reading wrong format should fail ==" diff --git a/tests/qemu-iotests/175 b/tests/qemu-iotests/175 index 00a626aa63..21a77a2bf5 100755 --- a/tests/qemu-iotests/175 +++ b/tests/qemu-iotests/175 @@ -71,7 +71,7 @@ EOF . ./common.filter _supported_fmt raw -_supported_proto file +_supported_proto file fuse _supported_os Linux _default_cache_mode none @@ -89,20 +89,20 @@ min_blocks=$(stat -c '%b' "$TEST_DIR/empty") echo echo "== creating image with default preallocation ==" -_make_test_img -o extent_size_hint=0 $size | _filter_imgfmt +_make_test_img -o extent_size_hint=0 $size stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size for mode in off full falloc; do echo echo "== creating image with preallocation $mode ==" - _make_test_img -o preallocation=$mode,extent_size_hint=0 $size | _filter_imgfmt + _make_test_img -o preallocation=$mode,extent_size_hint=0 $size stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size done for new_size in 4096 1048576; do echo echo "== resize empty image with block_resize ==" - _make_test_img -o extent_size_hint=0 0 | _filter_imgfmt + _make_test_img -o extent_size_hint=0 0 _block_resize $TEST_IMG $new_size >/dev/null stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $new_size done diff --git a/tests/qemu-iotests/176 b/tests/qemu-iotests/176 index 2565ff12ee..5ce3b27069 100755 --- a/tests/qemu-iotests/176 +++ b/tests/qemu-iotests/176 @@ -45,7 +45,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This test is specific to qcow2 _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # Persistent dirty bitmaps require compat=1.1; # Internal snapshots forbid using an external data file diff --git a/tests/qemu-iotests/177 b/tests/qemu-iotests/177 index 5d4a77a6ab..595bfd4236 100755 --- a/tests/qemu-iotests/177 +++ b/tests/qemu-iotests/177 @@ -40,7 +40,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # tests specific to compat=1.1. _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse CLUSTER_SIZE=1M size=128M diff --git a/tests/qemu-iotests/179 b/tests/qemu-iotests/179 index 11a20cb1bf..7ada04c641 100755 --- a/tests/qemu-iotests/179 +++ b/tests/qemu-iotests/179 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # v2 images can't mark clusters as zero diff --git a/tests/qemu-iotests/183 b/tests/qemu-iotests/183 index acdbefa310..d889a3b19c 100755 --- a/tests/qemu-iotests/183 +++ b/tests/qemu-iotests/183 @@ -44,7 +44,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 _supported_os Linux FreeBSD NetBSD _supported_fmt qcow2 raw qed quorum -_supported_proto file +_supported_proto file fuse size=64M _make_test_img $size diff --git a/tests/qemu-iotests/186 b/tests/qemu-iotests/186 index 3ea0442d44..0db25b0e68 100755 --- a/tests/qemu-iotests/186 +++ b/tests/qemu-iotests/186 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _require_drivers null-co if [ "$QEMU_DEFAULT_MACHINE" != "pc" ]; then diff --git a/tests/qemu-iotests/187 b/tests/qemu-iotests/187 index c6e1dc57a0..f262d83e3a 100755 --- a/tests/qemu-iotests/187 +++ b/tests/qemu-iotests/187 @@ -39,7 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse size=64M _make_test_img $size diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191 index d17462e1e4..95a891350d 100755 --- a/tests/qemu-iotests/191 +++ b/tests/qemu-iotests/191 @@ -42,7 +42,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # An external data file would change the query-named-block-nodes output _unsupported_imgopts data_file diff --git a/tests/qemu-iotests/195 b/tests/qemu-iotests/195 index 2351d55fe1..967af5b7b5 100755 --- a/tests/qemu-iotests/195 +++ b/tests/qemu-iotests/195 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse do_run_qemu() { diff --git a/tests/qemu-iotests/200 b/tests/qemu-iotests/200 index 59f7854b9f..046539154f 100755 --- a/tests/qemu-iotests/200 +++ b/tests/qemu-iotests/200 @@ -42,10 +42,9 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 qed -_supported_proto file +_supported_proto file fuse -BACKING_IMG="${TEST_DIR}/backing.img" -TEST_IMG="${TEST_DIR}/test.img" +BACKING_IMG="$TEST_IMG.base" TEST_IMG="$BACKING_IMG" _make_test_img 512M _make_test_img -F $IMGFMT -b "$BACKING_IMG" 512M diff --git a/tests/qemu-iotests/200.out b/tests/qemu-iotests/200.out index a6776070e4..5883f16ac3 100644 --- a/tests/qemu-iotests/200.out +++ b/tests/qemu-iotests/200.out @@ -1,6 +1,6 @@ QA output created by 200 -Formatting 'TEST_DIR/backing.img', fmt=IMGFMT size=536870912 -Formatting 'TEST_DIR/test.img', fmt=IMGFMT size=536870912 backing_file=TEST_DIR/backing.img backing_fmt=IMGFMT +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=536870912 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=536870912 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT wrote 314572800/314572800 bytes at offset 512 300 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/qemu-iotests/204 b/tests/qemu-iotests/204 index 6770fa9b96..536bb8b534 100755 --- a/tests/qemu-iotests/204 +++ b/tests/qemu-iotests/204 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # This test assumes that discard leaves zero clusters; see test 177 for # other tests that also work in older images _unsupported_imgopts 'compat=0.10' diff --git a/tests/qemu-iotests/206 b/tests/qemu-iotests/206 index 11bc51f256..d12d7cb566 100755 --- a/tests/qemu-iotests/206 +++ b/tests/qemu-iotests/206 @@ -23,7 +23,8 @@ import iotests from iotests import imgfmt -iotests.script_initialize(supported_fmts=['qcow2']) +iotests.script_initialize(supported_fmts=['qcow2'], + supported_protocols=['file']) iotests.verify_working_luks() with iotests.FilePath('t.qcow2') as disk_path, \ @@ -201,7 +202,7 @@ with iotests.FilePath('t.qcow2') as disk_path, \ vm.launch() for size in [ 1234, 18446744073709551104, 9223372036854775808, - 9223372036854775296 ]: + 9223372036854775296, 9223372035781033984 ]: vm.blockdev_create({ 'driver': imgfmt, 'file': 'node0', 'size': size }) diff --git a/tests/qemu-iotests/206.out b/tests/qemu-iotests/206.out index a100849fcb..e8a36de00b 100644 --- a/tests/qemu-iotests/206.out +++ b/tests/qemu-iotests/206.out @@ -180,6 +180,12 @@ Job failed: Could not resize image: Image size cannot be negative {"execute": "blockdev-create", "arguments": {"job-id": "job0", "options": {"driver": "qcow2", "file": "node0", "size": 9223372036854775296}}} {"return": {}} +Job failed: Could not resize image: Required too big image size, it must be not greater than 9223372035781033984 +{"execute": "job-dismiss", "arguments": {"id": "job0"}} +{"return": {}} + +{"execute": "blockdev-create", "arguments": {"job-id": "job0", "options": {"driver": "qcow2", "file": "node0", "size": 9223372035781033984}}} +{"return": {}} Job failed: Could not resize image: Failed to grow the L1 table: File too large {"execute": "job-dismiss", "arguments": {"id": "job0"}} {"return": {}} diff --git a/tests/qemu-iotests/214 b/tests/qemu-iotests/214 index af677d90b8..75ae7a14b5 100755 --- a/tests/qemu-iotests/214 +++ b/tests/qemu-iotests/214 @@ -35,7 +35,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # Repairing the corrupted image requires qemu-img check to store a # refcount up to 3, which requires at least two refcount bits. diff --git a/tests/qemu-iotests/217 b/tests/qemu-iotests/217 index d89116ccad..7385342498 100755 --- a/tests/qemu-iotests/217 +++ b/tests/qemu-iotests/217 @@ -36,7 +36,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This test is specific to qcow2 _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # This test needs clusters with at least a refcount of 2 so that # OFLAG_COPIED is not set. refcount_bits=1 is therefore unsupported. diff --git a/tests/qemu-iotests/220 b/tests/qemu-iotests/220 index a9259b7127..9ba3b3fdcb 100755 --- a/tests/qemu-iotests/220 +++ b/tests/qemu-iotests/220 @@ -35,7 +35,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.pattern _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # To use a different refcount width but 16 bits we need compat=1.1, # and external data files do not support compressed clusters. diff --git a/tests/qemu-iotests/221 b/tests/qemu-iotests/221 index 0e9096fec7..7e6086b205 100755 --- a/tests/qemu-iotests/221 +++ b/tests/qemu-iotests/221 @@ -35,7 +35,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt raw -_supported_proto file +_supported_proto file fuse _supported_os Linux _default_cache_mode writeback @@ -46,6 +46,13 @@ echo "=== Check mapping of unaligned raw image ===" echo _make_test_img 65537 # qemu-img create rounds size up + +# file-posix allocates the first block of any images when it is created; +# the size of this block depends on the host page size and the file +# system block size, none of which are constant. Discard the whole +# image so we will not see this allocation in qemu-img map's output. +$QEMU_IO -c 'discard 0 65537' "$TEST_IMG" | _filter_qemu_io + $QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map truncate --size=65537 "$TEST_IMG" # so we resize it and check again diff --git a/tests/qemu-iotests/221.out b/tests/qemu-iotests/221.out index dca024a0c3..93846c7dab 100644 --- a/tests/qemu-iotests/221.out +++ b/tests/qemu-iotests/221.out @@ -3,18 +3,16 @@ QA output created by 221 === Check mapping of unaligned raw image === Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=65537 -[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, -{ "start": 4096, "length": 61952, "depth": 0, "zero": true, "data": false, "offset": OFFSET}] -[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, -{ "start": 4096, "length": 61952, "depth": 0, "zero": true, "data": false, "offset": OFFSET}] +discard 65537/65537 bytes at offset 0 +64.001 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +[{ "start": 0, "length": 66048, "depth": 0, "zero": true, "data": false, "offset": OFFSET}] +[{ "start": 0, "length": 66048, "depth": 0, "zero": true, "data": false, "offset": OFFSET}] wrote 1/1 bytes at offset 65536 1 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, -{ "start": 4096, "length": 61440, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, +[{ "start": 0, "length": 65536, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, { "start": 65536, "length": 1, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, { "start": 65537, "length": 511, "depth": 0, "zero": true, "data": false, "offset": OFFSET}] -[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, -{ "start": 4096, "length": 61440, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, +[{ "start": 0, "length": 65536, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, { "start": 65536, "length": 1, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, { "start": 65537, "length": 511, "depth": 0, "zero": true, "data": false, "offset": OFFSET}] *** done diff --git a/tests/qemu-iotests/229 b/tests/qemu-iotests/229 index 89a5359f32..273ac2472d 100755 --- a/tests/qemu-iotests/229 +++ b/tests/qemu-iotests/229 @@ -44,15 +44,14 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # Needs backing file and backing format support _supported_fmt qcow2 qed -_supported_proto file +_supported_proto file fuse _supported_os Linux # blkdebug can only inject errors on bs->file, so external data files # do not work with this test _unsupported_imgopts data_file -DEST_IMG="$TEST_DIR/d.$IMGFMT" -TEST_IMG="$TEST_DIR/b.$IMGFMT" +DEST_IMG="$TEST_IMG.dest" BLKDEBUG_CONF="$TEST_DIR/blkdebug.conf" _make_test_img 2M diff --git a/tests/qemu-iotests/229.out b/tests/qemu-iotests/229.out index 4de6dfaa28..7eed393013 100644 --- a/tests/qemu-iotests/229.out +++ b/tests/qemu-iotests/229.out @@ -1,6 +1,6 @@ QA output created by 229 -Formatting 'TEST_DIR/b.IMGFMT', fmt=IMGFMT size=2097152 -Formatting 'TEST_DIR/d.IMGFMT', fmt=IMGFMT size=2097152 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2097152 +Formatting 'TEST_DIR/t.IMGFMT.dest', fmt=IMGFMT size=2097152 wrote 2097152/2097152 bytes at offset 0 2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) {'execute': 'qmp_capabilities'} @@ -8,7 +8,7 @@ wrote 2097152/2097152 bytes at offset 0 === Starting drive-mirror, causing error & stop === -{'execute': 'drive-mirror', 'arguments': {'device': 'testdisk', 'format': 'IMGFMT', 'target': 'blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/d.IMGFMT', 'sync': 'full', 'mode': 'existing', 'on-source-error': 'stop', 'on-target-error': 'stop' }} +{'execute': 'drive-mirror', 'arguments': {'device': 'testdisk', 'format': 'IMGFMT', 'target': 'blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT.dest', 'sync': 'full', 'mode': 'existing', 'on-source-error': 'stop', 'on-target-error': 'stop' }} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "testdisk"}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "testdisk"}} {"return": {}} diff --git a/tests/qemu-iotests/242 b/tests/qemu-iotests/242 index 64f1bd95e4..a16de3085f 100755 --- a/tests/qemu-iotests/242 +++ b/tests/qemu-iotests/242 @@ -24,7 +24,8 @@ import struct from iotests import qemu_img_create, qemu_io, qemu_img_pipe, \ file_path, img_info_log, log, filter_qemu_io -iotests.script_initialize(supported_fmts=['qcow2']) +iotests.script_initialize(supported_fmts=['qcow2'], + supported_protocols=['file']) disk = file_path('disk') chunk = 256 * 1024 diff --git a/tests/qemu-iotests/247 b/tests/qemu-iotests/247 index 87e37b39e2..6cf2679750 100755 --- a/tests/qemu-iotests/247 +++ b/tests/qemu-iotests/247 @@ -41,7 +41,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # Requires backing files and .bdrv_change_backing_file support _supported_fmt qcow2 qed -_supported_proto file +_supported_proto file fuse size=128M diff --git a/tests/qemu-iotests/249 b/tests/qemu-iotests/249 index 68f13ed328..29453b8c90 100755 --- a/tests/qemu-iotests/249 +++ b/tests/qemu-iotests/249 @@ -42,15 +42,15 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # Any format implementing BlockDriver.bdrv_change_backing_file _supported_fmt qcow2 qed -_supported_proto file +_supported_proto file fuse _supported_os Linux IMG_SIZE=1M # Create the images: base <- int <- active -TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE | _filter_imgfmt -TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" -F $IMGFMT | _filter_imgfmt -_make_test_img -b "$TEST_IMG.int" -F $IMGFMT | _filter_imgfmt +TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE +TEST_IMG="$TEST_IMG.int" _make_test_img -b "$TEST_IMG.base" -F $IMGFMT +_make_test_img -b "$TEST_IMG.int" -F $IMGFMT # Launch QEMU with these two drives: # none0: base (read-only) diff --git a/tests/qemu-iotests/250 b/tests/qemu-iotests/250 index 9bb6b94d74..3df275c76b 100755 --- a/tests/qemu-iotests/250 +++ b/tests/qemu-iotests/250 @@ -37,7 +37,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # This test does not make much sense with external data files _unsupported_imgopts data_file diff --git a/tests/qemu-iotests/252 b/tests/qemu-iotests/252 index 6662f4c9de..1d74afff99 100755 --- a/tests/qemu-iotests/252 +++ b/tests/qemu-iotests/252 @@ -42,7 +42,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # zero cluster support _supported_fmt qcow2 _unsupported_imgopts 'compat=0.10' -_supported_proto file +_supported_proto file fuse _supported_os Linux CLUSTER_SIZE=65536 diff --git a/tests/qemu-iotests/265 b/tests/qemu-iotests/265 index 00f2ec769e..0e800fb524 100755 --- a/tests/qemu-iotests/265 +++ b/tests/qemu-iotests/265 @@ -35,7 +35,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # qcow2-specific test _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux echo '--- Writing to the image ---' diff --git a/tests/qemu-iotests/268 b/tests/qemu-iotests/268 index 78c3f4db3a..ddf4312284 100755 --- a/tests/qemu-iotests/268 +++ b/tests/qemu-iotests/268 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse echo echo "== Required alignment larger than cluster size ==" diff --git a/tests/qemu-iotests/272 b/tests/qemu-iotests/272 index c2f782d47b..de475bf6f0 100755 --- a/tests/qemu-iotests/272 +++ b/tests/qemu-iotests/272 @@ -35,7 +35,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This is a qcow2 regression test _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # External data files do not support compression; # We need an exact cluster size (2M) and refcount width (2) so we can diff --git a/tests/qemu-iotests/273 b/tests/qemu-iotests/273 index 41ffbf39c4..79b4ab4b05 100755 --- a/tests/qemu-iotests/273 +++ b/tests/qemu-iotests/273 @@ -35,7 +35,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # This is a qcow2 regression test _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # External data files would add nodes to the block graph, so it would # not match the reference output diff --git a/tests/qemu-iotests/279 b/tests/qemu-iotests/279 index 5515d4ed01..2a6315cf17 100755 --- a/tests/qemu-iotests/279 +++ b/tests/qemu-iotests/279 @@ -36,7 +36,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # Backing files are required... _supported_fmt qcow qcow2 vmdk qed -_supported_proto file +_supported_proto file fuse _supported_os Linux _unsupported_imgopts "subformat=monolithicFlat" \ "subformat=twoGbMaxExtentFlat" \ diff --git a/tests/qemu-iotests/286 b/tests/qemu-iotests/286 index f14445ba4a..f64e0eccea 100755 --- a/tests/qemu-iotests/286 +++ b/tests/qemu-iotests/286 @@ -35,7 +35,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.qemu _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # Internal snapshots are (currently) impossible with refcount_bits=1, # and generally impossible with external data files _unsupported_imgopts 'refcount_bits=1[^0-9]' data_file diff --git a/tests/qemu-iotests/287 b/tests/qemu-iotests/287 index f98a4cadc1..3bb383fd4b 100755 --- a/tests/qemu-iotests/287 +++ b/tests/qemu-iotests/287 @@ -32,7 +32,7 @@ status=1 # failure is the default! # This tests qocw2-specific low-level functionality _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux _unsupported_imgopts 'compat=0.10' data_file @@ -51,8 +51,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 CLUSTER_SIZE=65536 # Check if we can run this test. -if IMGOPTS='compression_type=zstd' _make_test_img 64M | - grep "Invalid parameter 'zstd'"; then +output=$(_make_test_img -o 'compression_type=zstd' 64M; _cleanup_test_img) +if echo "$output" | grep -q "Invalid parameter 'zstd'"; then _notrun "ZSTD is disabled" fi diff --git a/tests/qemu-iotests/289 b/tests/qemu-iotests/289 index 1c11d4030e..fe69bde1eb 100755 --- a/tests/qemu-iotests/289 +++ b/tests/qemu-iotests/289 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.pattern _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse # This is a v3-exclusive test; # As for data_file, error paths often very much depend on whether # there is an external data file or not; so we create one exactly when diff --git a/tests/qemu-iotests/290 b/tests/qemu-iotests/290 index 01ee14dcfb..35c38d4f80 100755 --- a/tests/qemu-iotests/290 +++ b/tests/qemu-iotests/290 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux _unsupported_imgopts 'compat=0.10' refcount_bits data_file diff --git a/tests/qemu-iotests/291 b/tests/qemu-iotests/291 index ecef9eec62..bc70d5e389 100755 --- a/tests/qemu-iotests/291 +++ b/tests/qemu-iotests/291 @@ -36,7 +36,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.nbd _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux _require_command QEMU_NBD # compat=0.10 does not support bitmaps diff --git a/tests/qemu-iotests/292 b/tests/qemu-iotests/292 index 83ab19231d..3ae2772e3b 100755 --- a/tests/qemu-iotests/292 +++ b/tests/qemu-iotests/292 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux # We need qemu-img map to show the file where the data is allocated, # but with an external data file, it will show that instead of the diff --git a/tests/qemu-iotests/293 b/tests/qemu-iotests/293 index f86fe3b413..3363bf07f0 100755 --- a/tests/qemu-iotests/293 +++ b/tests/qemu-iotests/293 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 luks -_supported_proto file #TODO +_supported_proto file fuse #TODO _require_working_luks QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT diff --git a/tests/qemu-iotests/294 b/tests/qemu-iotests/294 index 9c95ed8c9a..87da35db49 100755 --- a/tests/qemu-iotests/294 +++ b/tests/qemu-iotests/294 @@ -34,7 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt luks -_supported_proto file #TODO +_supported_proto file fuse #TODO QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT diff --git a/tests/qemu-iotests/305 b/tests/qemu-iotests/305 index 768818af4a..5a415eb2a4 100755 --- a/tests/qemu-iotests/305 +++ b/tests/qemu-iotests/305 @@ -38,7 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 . ./common.filter _supported_fmt qcow2 -_supported_proto file +_supported_proto file fuse _supported_os Linux _unsupported_imgopts cluster_size refcount_bits extended_l2 compat=0.10 data_file diff --git a/tests/qemu-iotests/308 b/tests/qemu-iotests/308 new file mode 100755 index 0000000000..b30f4400f6 --- /dev/null +++ b/tests/qemu-iotests/308 @@ -0,0 +1,339 @@ +#!/usr/bin/env bash +# +# Test FUSE exports (in ways that are not captured by the generic +# tests) +# +# Copyright (C) 2020 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +seq=$(basename "$0") +echo "QA output created by $seq" + +status=1 # failure is the default! + +_cleanup() +{ + _cleanup_qemu + _cleanup_test_img + rmdir "$EXT_MP" 2>/dev/null + rm -f "$EXT_MP" + rm -f "$COPIED_IMG" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +# Generic format, but needs a plain filename +_supported_fmt generic +if [ "$IMGOPTSSYNTAX" = "true" ]; then + _unsupported_fmt $IMGFMT +fi +# We need the image to have exactly the specified size, and VPC does +# not allow that by default +_unsupported_fmt vpc + +_supported_proto file # We create the FUSE export manually +_supported_os Linux # We need /dev/urandom + +# $1: Export ID +# $2: Options (beyond the node-name and ID) +# $3: Expected return value (defaults to 'return') +# $4: Node to export (defaults to 'node-format') +fuse_export_add() +{ + _send_qemu_cmd $QEMU_HANDLE \ + "{'execute': 'block-export-add', + 'arguments': { + 'type': 'fuse', + 'id': '$1', + 'node-name': '${4:-node-format}', + $2 + } }" \ + "${3:-return}" \ + | _filter_imgfmt +} + +# $1: Export ID +fuse_export_del() +{ + _send_qemu_cmd $QEMU_HANDLE \ + "{'execute': 'block-export-del', + 'arguments': { + 'id': '$1' + } }" \ + 'return' + + _send_qemu_cmd $QEMU_HANDLE \ + '' \ + 'BLOCK_EXPORT_DELETED' +} + +# Return the length of the protocol file +# $1: Protocol node export mount point +# $2: Original file (to compare) +get_proto_len() +{ + len1=$(stat -c '%s' "$1") + len2=$(stat -c '%s' "$2") + + if [ "$len1" != "$len2" ]; then + echo 'ERROR: Length of export and original differ:' >&2 + echo "$len1 != $len2" >&2 + else + echo '(OK: Lengths of export and original are the same)' >&2 + fi + + echo "$len1" +} + +COPIED_IMG="$TEST_IMG.copy" +EXT_MP="$TEST_IMG.fuse" + +echo '=== Set up ===' + +# Create image with random data +_make_test_img 64M +$QEMU_IO -c 'write -s /dev/urandom 0 64M' "$TEST_IMG" | _filter_qemu_io + +_launch_qemu +_send_qemu_cmd $QEMU_HANDLE \ + "{'execute': 'qmp_capabilities'}" \ + 'return' + +# Separate blockdev-add calls for format and protocol so we can remove +# the format layer later on +_send_qemu_cmd $QEMU_HANDLE \ + "{'execute': 'blockdev-add', + 'arguments': { + 'driver': 'file', + 'node-name': 'node-protocol', + 'filename': '$TEST_IMG' + } }" \ + 'return' + +_send_qemu_cmd $QEMU_HANDLE \ + "{'execute': 'blockdev-add', + 'arguments': { + 'driver': '$IMGFMT', + 'node-name': 'node-format', + 'file': 'node-protocol' + } }" \ + 'return' + +echo +echo '=== Mountpoint not present ===' + +rmdir "$EXT_MP" 2>/dev/null +rm -f "$EXT_MP" +output=$(fuse_export_add 'export-err' "'mountpoint': '$EXT_MP'" error) + +if echo "$output" | grep -q "Invalid parameter 'fuse'"; then + _notrun 'No FUSE support' +fi + +echo "$output" + +echo +echo '=== Mountpoint is a directory ===' + +mkdir "$EXT_MP" +fuse_export_add 'export-err' "'mountpoint': '$EXT_MP'" error +rmdir "$EXT_MP" + +echo +echo '=== Mountpoint is a regular file ===' + +touch "$EXT_MP" +fuse_export_add 'export-mp' "'mountpoint': '$EXT_MP'" + +# Check that the export presents the same data as the original image +$QEMU_IMG compare -f raw -F $IMGFMT -U "$EXT_MP" "$TEST_IMG" + +echo +echo '=== Mount over existing file ===' + +# This is the coolest feature of FUSE exports: You can transparently +# make images in any format appear as raw images +fuse_export_add 'export-img' "'mountpoint': '$TEST_IMG'" + +# Accesses both exports at the same time, so we get a concurrency test +$QEMU_IMG compare -f raw -F raw -U "$EXT_MP" "$TEST_IMG" + +# Just to be sure, we later want to compare the data offline. Also, +# this allows us to see that cp works without complaining. +# (This is not a given, because cp will expect a short read at EOF. +# Internally, qemu does not allow short reads, so we have to check +# whether the FUSE export driver lets them work.) +cp "$TEST_IMG" "$COPIED_IMG" + +# $TEST_IMG will be in mode 0400 because it is read-only; we are going +# to write to the copy, so make it writable +chmod 0600 "$COPIED_IMG" + +echo +echo '=== Double export ===' + +# We have already seen that exporting a node twice works fine, but you +# cannot export anything twice on the same mount point. The reason is +# that qemu has to stat the given mount point, and this would have to +# be answered by the same qemu instance if it already has an export +# there. However, it cannot answer the stat because it is itself +# caught up in that same stat. +fuse_export_add 'export-err' "'mountpoint': '$EXT_MP'" error + +echo +echo '=== Remove export ===' + +# Double-check that $EXT_MP appears as a non-empty file (the raw image) +$QEMU_IMG info -f raw "$EXT_MP" | grep 'virtual size' + +fuse_export_del 'export-mp' + +# See that the file appears empty again +$QEMU_IMG info -f raw "$EXT_MP" | grep 'virtual size' + +echo +echo '=== Writable export ===' + +fuse_export_add 'export-mp' "'mountpoint': '$EXT_MP', 'writable': true" + +# Check that writing to the read-only export fails +$QEMU_IO -f raw -c 'write -P 42 1M 64k' "$TEST_IMG" | _filter_qemu_io + +# But here it should work +$QEMU_IO -f raw -c 'write -P 42 1M 64k' "$EXT_MP" | _filter_qemu_io + +# (Adjust the copy, too) +$QEMU_IO -f raw -c 'write -P 42 1M 64k' "$COPIED_IMG" | _filter_qemu_io + +echo +echo '=== Resizing exports ===' + +# Here, we need to export the protocol node -- the format layer may +# not be growable, simply because the format does not support it. + +# Remove all exports and the format node first so permissions will not +# get in the way +fuse_export_del 'export-mp' +fuse_export_del 'export-img' + +_send_qemu_cmd $QEMU_HANDLE \ + "{'execute': 'blockdev-del', + 'arguments': { + 'node-name': 'node-format' + } }" \ + 'return' + +# Now export the protocol node +fuse_export_add \ + 'export-mp' \ + "'mountpoint': '$EXT_MP', 'writable': true" \ + 'return' \ + 'node-protocol' + +echo +echo '--- Try growing non-growable export ---' + +# Get the current size so we can write beyond the EOF +orig_len=$(get_proto_len "$EXT_MP" "$TEST_IMG") +orig_disk_usage=$(stat -c '%b' "$TEST_IMG") + +# Should fail (exports are non-growable by default) +# (Note that qemu-io can never write beyond the EOF, so we have to use +# dd here) +dd if=/dev/zero of="$EXT_MP" bs=1 count=64k seek=$orig_len 2>&1 \ + | _filter_testdir | _filter_imgfmt + +echo +echo '--- Resize export ---' + +# But we can truncate it explicitly; even with fallocate +fallocate -o "$orig_len" -l 64k "$EXT_MP" + +new_len=$(get_proto_len "$EXT_MP" "$TEST_IMG") +if [ "$new_len" != "$((orig_len + 65536))" ]; then + echo 'ERROR: Unexpected post-truncate image size:' + echo "$new_len != $((orig_len + 65536))" +else + echo 'OK: Post-truncate image size is as expected' +fi + +new_disk_usage=$(stat -c '%b' "$TEST_IMG") +if [ "$new_disk_usage" -gt "$orig_disk_usage" ]; then + echo 'OK: Disk usage grew with fallocate' +else + echo 'ERROR: Disk usage did not grow despite fallocate:' + echo "$orig_disk_usage => $new_disk_usage" +fi + +echo +echo '--- Try growing growable export ---' + +# Now export as growable +fuse_export_del 'export-mp' +fuse_export_add \ + 'export-mp' \ + "'mountpoint': '$EXT_MP', 'writable': true, 'growable': true" \ + 'return' \ + 'node-protocol' + +# Now we should be able to write beyond the EOF +dd if=/dev/zero of="$EXT_MP" bs=1 count=64k seek=$new_len 2>&1 \ + | _filter_testdir | _filter_imgfmt + +new_len=$(get_proto_len "$EXT_MP" "$TEST_IMG") +if [ "$new_len" != "$((orig_len + 131072))" ]; then + echo 'ERROR: Unexpected post-grow image size:' + echo "$new_len != $((orig_len + 131072))" +else + echo 'OK: Post-grow image size is as expected' +fi + +echo +echo '--- Shrink export ---' + +# Now go back to the original size +truncate -s "$orig_len" "$EXT_MP" + +new_len=$(get_proto_len "$EXT_MP" "$TEST_IMG") +if [ "$new_len" != "$orig_len" ]; then + echo 'ERROR: Unexpected post-truncate image size:' + echo "$new_len != $orig_len" +else + echo 'OK: Post-truncate image size is as expected' +fi + +echo +echo '=== Tear down ===' + +_send_qemu_cmd $QEMU_HANDLE \ + "{'execute': 'quit'}" \ + 'return' + +wait=yes _cleanup_qemu + +echo +echo '=== Compare copy with original ===' + +$QEMU_IMG compare -f raw -F $IMGFMT "$COPIED_IMG" "$TEST_IMG" + +# success, all done +echo "*** done" +rm -f $seq.full +status=0 diff --git a/tests/qemu-iotests/308.out b/tests/qemu-iotests/308.out new file mode 100644 index 0000000000..b93aceed2e --- /dev/null +++ b/tests/qemu-iotests/308.out @@ -0,0 +1,97 @@ +QA output created by 308 +=== Set up === +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 +wrote 67108864/67108864 bytes at offset 0 +64 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +{'execute': 'qmp_capabilities'} +{"return": {}} +{'execute': 'blockdev-add', 'arguments': { 'driver': 'file', 'node-name': 'node-protocol', 'filename': 'TEST_DIR/t.IMGFMT' } } +{"return": {}} +{'execute': 'blockdev-add', 'arguments': { 'driver': 'IMGFMT', 'node-name': 'node-format', 'file': 'node-protocol' } } +{"return": {}} + +=== Mountpoint not present === +{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } } +{"error": {"class": "GenericError", "desc": "Failed to stat 'TEST_DIR/t.IMGFMT.fuse': No such file or directory"}} + +=== Mountpoint is a directory === +{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } } +{"error": {"class": "GenericError", "desc": "'TEST_DIR/t.IMGFMT.fuse' is not a regular file"}} + +=== Mountpoint is a regular file === +{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } } +{"return": {}} +Images are identical. + +=== Mount over existing file === +{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-img', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT' } } +{"return": {}} +Images are identical. + +=== Double export === +{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } } +{"error": {"class": "GenericError", "desc": "There already is a FUSE export on 'TEST_DIR/t.IMGFMT.fuse'"}} + +=== Remove export === +virtual size: 64 MiB (67108864 bytes) +{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } } +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} +virtual size: 0 B (0 bytes) + +=== Writable export === +{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true } } +{"return": {}} +write failed: Permission denied +wrote 65536/65536 bytes at offset 1048576 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 1048576 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +=== Resizing exports === +{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } } +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} +{'execute': 'block-export-del', 'arguments': { 'id': 'export-img' } } +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-img"}} +{'execute': 'blockdev-del', 'arguments': { 'node-name': 'node-format' } } +{"return": {}} +{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-protocol', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true } } +{"return": {}} + +--- Try growing non-growable export --- +(OK: Lengths of export and original are the same) +dd: error writing 'TEST_DIR/t.IMGFMT.fuse': Input/output error +1+0 records in +0+0 records out + +--- Resize export --- +(OK: Lengths of export and original are the same) +OK: Post-truncate image size is as expected +OK: Disk usage grew with fallocate + +--- Try growing growable export --- +{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } } +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} +{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-protocol', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true, 'growable': true } } +{"return": {}} +65536+0 records in +65536+0 records out +(OK: Lengths of export and original are the same) +OK: Post-grow image size is as expected + +--- Shrink export --- +(OK: Lengths of export and original are the same) +OK: Post-truncate image size is as expected + +=== Tear down === +{'execute': 'quit'} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}} + +=== Compare copy with original === +Images are identical. +*** done diff --git a/tests/qemu-iotests/check b/tests/qemu-iotests/check index 678b6e4910..952762d5ed 100755 --- a/tests/qemu-iotests/check +++ b/tests/qemu-iotests/check @@ -270,6 +270,7 @@ image protocol options -rbd test rbd -sheepdog test sheepdog -nbd test nbd + -fuse test fuse -ssh test ssh -nfs test nfs @@ -382,6 +383,11 @@ testlist options xpand=false ;; + -fuse) + IMGPROTO=fuse + xpand=false + ;; + -ssh) IMGPROTO=ssh xpand=false @@ -644,6 +650,17 @@ if [ -z $QEMU_NBD_PROG ]; then fi export QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")" +if [ -z "$QSD_PROG" ]; then + if [ -x "$build_iotests/qemu-storage-daemon" ]; then + export QSD_PROG="$build_iotests/qemu-storage-daemon" + elif [ -x "$build_root/storage-daemon/qemu-storage-daemon" ]; then + export QSD_PROG="$build_root/storage-daemon/qemu-storage-daemon" + else + _init_error "qemu-storage-daemon not found" + fi +fi +export QSD_PROG="$(type -p "$QSD_PROG")" + if [ -x "$build_iotests/socket_scm_helper" ] then export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper" diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter index 838ed15793..172ea5752e 100644 --- a/tests/qemu-iotests/common.filter +++ b/tests/qemu-iotests/common.filter @@ -44,7 +44,8 @@ _filter_qom_path() _filter_testdir() { $SED -e "s#$TEST_DIR/#TEST_DIR/#g" \ - -e "s#$SOCK_DIR/#SOCK_DIR/#g" + -e "s#$SOCK_DIR/#SOCK_DIR/#g" \ + -e "s#SOCK_DIR/fuse-#TEST_DIR/#g" } # replace occurrences of the actual IMGFMT value with IMGFMT @@ -127,6 +128,7 @@ _filter_img_create_filenames() -e "s#$IMGPROTO:$TEST_DIR#TEST_DIR#g" \ -e "s#$TEST_DIR#TEST_DIR#g" \ -e "s#$SOCK_DIR#SOCK_DIR#g" \ + -e 's#SOCK_DIR/fuse-#TEST_DIR/#g' \ -e "s#$IMGFMT#IMGFMT#g" \ -e 's#nbd:127.0.0.1:[0-9]\\+#TEST_DIR/t.IMGFMT#g' \ -e 's#nbd+unix:///\??socket=SOCK_DIR/nbd#TEST_DIR/t.IMGFMT#g' @@ -227,6 +229,7 @@ _filter_img_info() -e "s#$IMGFMT#IMGFMT#g" \ -e 's#nbd://127.0.0.1:[0-9]\\+$#TEST_DIR/t.IMGFMT#g' \ -e 's#nbd+unix:///\??socket=SOCK_DIR/nbd#TEST_DIR/t.IMGFMT#g' \ + -e 's#SOCK_DIR/fuse-#TEST_DIR/#g' \ -e "/encrypted: yes/d" \ -e "/cluster_size: [0-9]\\+/d" \ -e "/table_size: [0-9]\\+/d" \ diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc index 494490a272..29354654cc 100644 --- a/tests/qemu-iotests/common.rc +++ b/tests/qemu-iotests/common.rc @@ -124,6 +124,7 @@ fi : ${VALGRIND_QEMU_IMG=$VALGRIND_QEMU} : ${VALGRIND_QEMU_IO=$VALGRIND_QEMU} : ${VALGRIND_QEMU_NBD=$VALGRIND_QEMU} +: ${VALGRIND_QSD=$VALGRIND_QEMU} # The Valgrind own parameters may be set with # its environment variable VALGRIND_OPTS, e.g. @@ -211,6 +212,21 @@ _qemu_nbd_wrapper() return $RETVAL } +_qemu_storage_daemon_wrapper() +{ + local VALGRIND_LOGFILE="${TEST_DIR}"/$$.valgrind + ( + if [ -n "${QSD_NEED_PID}" ]; then + echo $BASHPID > "${QEMU_TEST_DIR}/qemu-storage-daemon.pid" + fi + VALGRIND_QEMU="${VALGRIND_QSD}" _qemu_proc_exec "${VALGRIND_LOGFILE}" \ + "$QSD_PROG" $QSD_OPTIONS "$@" + ) + RETVAL=$? + _qemu_proc_valgrind_log "${VALGRIND_LOGFILE}" $RETVAL + return $RETVAL +} + # Valgrind bug #409141 https://bugs.kde.org/show_bug.cgi?id=409141 # Until valgrind 3.16+ is ubiquitous, we must work around a hang in # valgrind when issuing sigkill. Disable valgrind for this invocation. @@ -223,6 +239,7 @@ export QEMU=_qemu_wrapper export QEMU_IMG=_qemu_img_wrapper export QEMU_IO=_qemu_io_wrapper export QEMU_NBD=_qemu_nbd_wrapper +export QSD=_qemu_storage_daemon_wrapper if [ "$IMGOPTSSYNTAX" = "true" ]; then DRIVER="driver=$IMGFMT" @@ -240,6 +257,9 @@ if [ "$IMGOPTSSYNTAX" = "true" ]; then TEST_IMG_FILE=$TEST_DIR/t.$IMGFMT TEST_IMG="$DRIVER,file.driver=nbd,file.type=unix" TEST_IMG="$TEST_IMG,file.path=$SOCK_DIR/nbd" + elif [ "$IMGPROTO" = "fuse" ]; then + TEST_IMG_FILE=$TEST_DIR/t.$IMGFMT + TEST_IMG="$DRIVER,file.filename=$SOCK_DIR/fuse-t.$IMGFMT" elif [ "$IMGPROTO" = "ssh" ]; then TEST_IMG_FILE=$TEST_DIR/t.$IMGFMT TEST_IMG="$DRIVER,file.driver=ssh,file.host=127.0.0.1,file.path=$TEST_IMG_FILE" @@ -256,6 +276,9 @@ else elif [ "$IMGPROTO" = "nbd" ]; then TEST_IMG_FILE=$TEST_DIR/t.$IMGFMT TEST_IMG="nbd+unix:///?socket=$SOCK_DIR/nbd" + elif [ "$IMGPROTO" = "fuse" ]; then + TEST_IMG_FILE=$TEST_DIR/t.$IMGFMT + TEST_IMG="$SOCK_DIR/fuse-t.$IMGFMT" elif [ "$IMGPROTO" = "ssh" ]; then TEST_IMG_FILE=$TEST_DIR/t.$IMGFMT REMOTE_TEST_DIR="ssh://\\($USER@\\)\\?127.0.0.1\\(:[0-9]\\+\\)\\?$TEST_DIR" @@ -268,8 +291,12 @@ else TEST_IMG=$IMGPROTO:$TEST_DIR/t.$IMGFMT fi fi +ORIG_TEST_IMG_FILE=$TEST_IMG_FILE ORIG_TEST_IMG="$TEST_IMG" +FUSE_PIDS=() +FUSE_EXPORTS=() + if [ -z "$TEST_DIR" ]; then TEST_DIR=$PWD/scratch fi @@ -330,6 +357,34 @@ _get_data_file() | sed -e "s#\\\$TEST_IMG#$1#" } +# Translate a $TEST_IMG to its corresponding $TEST_IMG_FILE for +# different protocols +_test_img_to_test_img_file() +{ + case "$IMGPROTO" in + file) + echo "$1" + ;; + + fuse) + echo "$1" | sed -e "s#$SOCK_DIR/fuse-#$TEST_DIR/#" + ;; + + nfs) + echo "$1" | sed -e "s#nfs://127.0.0.1##" + ;; + + ssh) + echo "$1" | \ + sed -e "s#ssh://\\($USER@\\)\\?127.0.0.1\\(:[0-9]\\+\\)\\?##" + ;; + + *) + return 1 + ;; + esac +} + _make_test_img() { # extra qemu-img options can be added by tests @@ -343,10 +398,24 @@ _make_test_img() local opts_param=false local misc_params=() - if [ -n "$TEST_IMG_FILE" ]; then - img_name=$TEST_IMG_FILE - else + if [[ $IMGPROTO == fuse && $TEST_IMG == $SOCK_DIR/fuse-* ]]; then + # The caller may be trying to overwrite an existing image + _rm_test_img "$TEST_IMG" + fi + + if [ -z "$TEST_IMG_FILE" ]; then img_name=$TEST_IMG + elif [ "$IMGOPTSSYNTAX" != "true" -a \ + "$TEST_IMG_FILE" = "$ORIG_TEST_IMG_FILE" ]; then + # Handle cases of tests only updating TEST_IMG, but not TEST_IMG_FILE + img_name=$(_test_img_to_test_img_file "$TEST_IMG") + if [ "$?" != 0 ]; then + img_name=$TEST_IMG_FILE + fi + else + # $TEST_IMG_FILE is not the default value, so it definitely has been + # modified by the test + img_name=$TEST_IMG_FILE fi if [ -n "$IMGOPTS" ]; then @@ -418,11 +487,105 @@ _make_test_img() eval "$QEMU_NBD -v -t -k '$SOCK_DIR/nbd' -f $IMGFMT -e 42 -x '' $TEST_IMG_FILE >/dev/null &" sleep 1 # FIXME: qemu-nbd needs to be listening before we continue fi + + if [ $IMGPROTO = "fuse" -a -f "$img_name" ]; then + local export_mp + local pid + local pidfile + local timeout + + export_mp=$(echo "$img_name" | sed -e "s#$TEST_DIR/#$SOCK_DIR/fuse-#") + if ! echo "$export_mp" | grep -q "^$SOCK_DIR"; then + echo 'Cannot use FUSE exports with images outside of TEST_DIR' >&2 + return 1 + fi + + touch "$export_mp" + rm -f "$SOCK_DIR/fuse-output" + + # Usually, users would export formatted nodes. But we present fuse as a + # protocol-level driver here, so we have to leave the format to the + # client. + QSD_NEED_PID=y $QSD \ + --blockdev file,node-name=export-node,filename=$img_name,discard=unmap \ + --export fuse,id=fuse-export,node-name=export-node,mountpoint="$export_mp",writable=on,growable=on \ + & + + pidfile="$QEMU_TEST_DIR/qemu-storage-daemon.pid" + + # Wait for the PID file + while [ ! -f "$pidfile" ]; do + sleep 0.5 + done + + pid=$(cat "$pidfile") + rm -f "$pidfile" + + FUSE_PIDS+=($pid) + FUSE_EXPORTS+=("$export_mp") + fi } _rm_test_img() { local img=$1 + + if [[ $IMGPROTO == fuse && $img == $SOCK_DIR/fuse-* ]]; then + # Drop a FUSE export + local df_output + local i + local image_file + local index='' + local timeout + + for i in "${!FUSE_EXPORTS[@]}"; do + if [ "${FUSE_EXPORTS[i]}" = "$img" ]; then + index=$i + break + fi + done + + if [ -z "$index" ]; then + # Probably gone already + return 0 + fi + + kill "${FUSE_PIDS[index]}" + + # Wait until the mount is gone + timeout=10 # *0.5 s + while true; do + # Will show the mount point; if the mount is still there, + # it will be $img. + df_output=$(df "$img" 2>/dev/null) + + # But df may also show an error ("Transpoint endpoint not + # connected"), so retry in such cases + if [ -n "$df_output" ]; then + if ! echo "$df_output" | grep -q "$img"; then + break + fi + fi + + sleep 0.5 + + timeout=$((timeout - 1)) + if [ "$timeout" = 0 ]; then + echo 'Failed to take down FUSE export' >&2 + return 1 + fi + done + + rm -f "$img" + + unset "FUSE_PIDS[$index]" + unset "FUSE_EXPORTS[$index]" + + image_file=$(echo "$img" | sed -e "s#$SOCK_DIR/fuse-#$TEST_DIR/#") + _rm_test_img "$image_file" + return + fi + if [ "$IMGFMT" = "vmdk" ]; then # Remove all the extents for vmdk "$QEMU_IMG" info "$img" 2>/dev/null | grep 'filename:' | cut -f 2 -d: \ @@ -445,6 +608,17 @@ _cleanup_test_img() rm -f "$TEST_IMG_FILE" ;; + fuse) + local mp + + for mp in "${FUSE_EXPORTS[@]}"; do + _rm_test_img "$mp" + done + + FUSE_PIDS=() + FUSE_EXPORTS=() + ;; + file) _rm_test_img "$TEST_DIR/t.$IMGFMT" _rm_test_img "$TEST_DIR/t.$IMGFMT.orig" @@ -511,6 +685,7 @@ _img_info() sed -e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \ -e "s#$IMGPROTO:$TEST_DIR#TEST_DIR#g" \ -e "s#$TEST_DIR#TEST_DIR#g" \ + -e "s#$SOCK_DIR/fuse-#TEST_DIR/#g" \ -e "s#$IMGFMT#IMGFMT#g" \ -e "/^disk size:/ D" \ -e "/actual-size/ D" | \ diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 2960dff728..9a8394b4cd 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -315,4 +315,5 @@ 304 rw quick 305 rw quick 307 rw quick export +308 rw 309 rw auto quick diff --git a/tests/test-write-threshold.c b/tests/test-write-threshold.c index 97ca12f710..4cf032652d 100644 --- a/tests/test-write-threshold.c +++ b/tests/test-write-threshold.c @@ -64,6 +64,8 @@ static void test_threshold_not_trigger(void) req.offset = 1024; req.bytes = 1024; + assert(bdrv_check_request(req.offset, req.bytes) == 0); + bdrv_write_threshold_set(&bs, threshold); amount = bdrv_write_threshold_exceeded(&bs, &req); g_assert_cmpuint(amount, ==, 0); @@ -82,6 +84,8 @@ static void test_threshold_trigger(void) req.offset = (4 * 1024 * 1024) - 1024; req.bytes = 2 * 1024; + assert(bdrv_check_request(req.offset, req.bytes) == 0); + bdrv_write_threshold_set(&bs, threshold); amount = bdrv_write_threshold_exceeded(&bs, &req); g_assert_cmpuint(amount, >=, 1024); |