Cover various scenarios to show that the bit gets set even for fully-allocated images, as well as scenarios where it is properly cleared.
Signed-off-by: Eric Blake <ebl...@redhat.com> --- tests/qemu-iotests/285 | 107 +++++++++++++++ tests/qemu-iotests/285.out | 257 +++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/group | 1 + 3 files changed, 365 insertions(+) create mode 100755 tests/qemu-iotests/285 create mode 100644 tests/qemu-iotests/285.out diff --git a/tests/qemu-iotests/285 b/tests/qemu-iotests/285 new file mode 100755 index 000000000000..66037af237a1 --- /dev/null +++ b/tests/qemu-iotests/285 @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +# +# Test qcow2 all-zero autoclear bit +# +# 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_test_img +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +_supported_fmt qcow2 +_supported_proto file +_supported_os Linux +# Autoclear bit is not available in compat=0.10; +# encrypted images never advertise all-zero bit +_unsupported_imgopts 'compat=0.10' encrypt + +for mode in off metadata falloc full; do + + echo + echo "=== preallocation=$mode ===" + echo + + _make_test_img -o "preallocation=$mode" 32M + + # Actions that do not lose the all-zero nature of the image: + $QEMU_IO -c 'w -z 0 16M' -c 'discard 8M 16M' "$TEST_IMG" | _filter_qemu_io + $QEMU_IMG resize --preallocation=$mode "$TEST_IMG" +8M + $QEMU_IO -c 'r -P 0 0 40M' "$TEST_IMG" | _filter_qemu_io + $QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific + + # Writing data must clear the all-zero bit: + $QEMU_IO -c 'w -P 1 32M 1M' "$TEST_IMG" | _filter_qemu_io + $QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific + + # Alas, rewriting the image back to zero does not restore the bit + # (checking if each write gets us back to zero does not scale) + $QEMU_IO -c 'w -z 32M 1M' "$TEST_IMG" | _filter_qemu_io + $QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific + +done + +echo +echo "=== backing files ===" +echo + +# Even when a backing file is all zero, we do not set all-zero bit; +# this is true whether we create with a backing file or rebase later +TEST_IMG_SAVE=$TEST_IMG +TEST_IMG=$TEST_IMG.base +_make_test_img 32M +TEST_IMG=$TEST_IMG_SAVE +_make_test_img -b "$TEST_IMG.base" -F qcow2 32M +$QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific +_make_test_img 32M +$QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific +$QEMU_IMG rebase -u -F qcow2 -b "$TEST_IMG.base" "$TEST_IMG" +$QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific + +# qemu-img commit clears an image, but because it still has a backing file, +# setting the all-zero bit is not correct +$QEMU_IO -c 'w -P 1 0 1M' "$TEST_IMG" | _filter_qemu_io +$QEMU_IMG commit "$TEST_IMG" +$QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific + +echo +echo "=== internal snapshots ===" +echo + +# For now, internal snapshots do not remember the all-zero bit +_make_test_img 32M +$QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific +$QEMU_IMG snapshot -c snap "$TEST_IMG" +$QEMU_IO -c 'w -P 1 0 1M' "$TEST_IMG" | _filter_qemu_io +$QEMU_IMG snapshot -l snap "$TEST_IMG" +$QEMU_IMG info "$TEST_IMG" | _filter_img_info --format-specific \ + | _filter_date | _filter_vmstate_size + +# success, all done +echo "*** done" +rm -f $seq.full +status=0 diff --git a/tests/qemu-iotests/285.out b/tests/qemu-iotests/285.out new file mode 100644 index 000000000000..e43ff9906b5f --- /dev/null +++ b/tests/qemu-iotests/285.out @@ -0,0 +1,257 @@ +QA output created by 285 + +=== preallocation=off === + +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 preallocation=off +wrote 16777216/16777216 bytes at offset 0 +16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 16777216/16777216 bytes at offset 8388608 +16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Image resized. +read 41943040/41943040 bytes at offset 0 +40 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 260 KiB +Format specific information: + compat: 1.1 + all zero: true + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 33554432 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 1.25 MiB +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 33554432 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 1.25 MiB +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false + +=== preallocation=metadata === + +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 preallocation=metadata +wrote 16777216/16777216 bytes at offset 0 +16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 16777216/16777216 bytes at offset 8388608 +16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Image resized. +read 41943040/41943040 bytes at offset 0 +40 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 260 KiB +Format specific information: + compat: 1.1 + all zero: true + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 33554432 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 1.25 MiB +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 33554432 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 1.25 MiB +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false + +=== preallocation=falloc === + +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 preallocation=falloc +wrote 16777216/16777216 bytes at offset 0 +16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 16777216/16777216 bytes at offset 8388608 +16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Image resized. +read 41943040/41943040 bytes at offset 0 +40 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 24.3 MiB +Format specific information: + compat: 1.1 + all zero: true + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 33554432 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 24.3 MiB +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 33554432 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 24.3 MiB +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false + +=== preallocation=full === + +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 preallocation=full +wrote 16777216/16777216 bytes at offset 0 +16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 16777216/16777216 bytes at offset 8388608 +16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Image resized. +read 41943040/41943040 bytes at offset 0 +40 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 24.3 MiB +Format specific information: + compat: 1.1 + all zero: true + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 33554432 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 24.3 MiB +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 33554432 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 40 MiB (41943040 bytes) +disk size: 24.3 MiB +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false + +=== backing files === + +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=33554432 +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 32 MiB (33554432 bytes) +disk size: 196 KiB +backing file: TEST_DIR/t.IMGFMT.base +backing file format: IMGFMT +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 32 MiB (33554432 bytes) +disk size: 196 KiB +Format specific information: + compat: 1.1 + all zero: true + lazy refcounts: false + refcount bits: 16 + corrupt: false +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 32 MiB (33554432 bytes) +disk size: 196 KiB +backing file: TEST_DIR/t.IMGFMT.base +backing file format: IMGFMT +Format specific information: + compat: 1.1 + all zero: true + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Image committed. +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 32 MiB (33554432 bytes) +disk size: 260 KiB +backing file: TEST_DIR/t.IMGFMT.base +backing file format: IMGFMT +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false + +=== internal snapshots === + +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 32 MiB (33554432 bytes) +disk size: 196 KiB +Format specific information: + compat: 1.1 + all zero: true + lazy refcounts: false + refcount bits: 16 + corrupt: false +wrote 1048576/1048576 bytes at offset 0 +1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +qemu-img: Expecting one image file name +Try 'qemu-img --help' for more information +image: TEST_DIR/t.IMGFMT +file format: IMGFMT +virtual size: 32 MiB (33554432 bytes) +disk size: SIZE +Snapshot list: +ID TAG VM SIZE DATE VM CLOCK +1 snap SIZE yyyy-mm-dd hh:mm:ss 00:00:00.000 +Format specific information: + compat: 1.1 + lazy refcounts: false + refcount bits: 16 + corrupt: false +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index e041cc1ee360..e9b20818fad5 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -289,3 +289,4 @@ 279 rw backing quick 280 rw migration quick 281 rw quick +285 rw quick -- 2.24.1