A discard request deallocates the selected clusters so they read back as zeroes. This is done by clearing the cluster offset field and setting QCOW_OFLAG_ZERO in the L2 entry. This flag is however only supported when qcow_version >= 3. In older images the cluster is simply deallocated, exposing any possible stale data from the backing file. Since discard is an advisory operation it's safer to simply forbid it in this scenario. Note that we are adding this check to qcow2_co_pdiscard() and not to qcow2_cluster_discard() or discard_in_l2_slice() because the last two are also used by qcow2_snapshot_create() to discard the clusters used by the VM state. In this case there's no risk of exposing stale data to the guest and we really want that the clusters are always discarded. Signed-off-by: Alberto Garcia <berto@igalia.com> Message-Id: <20200331114345.29993-1-berto@igalia.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
62 lines
2.7 KiB
Plaintext
62 lines
2.7 KiB
Plaintext
QA output created by 290
|
|
|
|
### Test 'qemu-io -c discard' on a QCOW2 image without a backing file
|
|
|
|
# Create an image with compat=0.10 without a backing file
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072
|
|
# Fill all clusters with data and then discard them
|
|
wrote 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
discard 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Read the data from the discarded clusters
|
|
read 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Output of qemu-img map
|
|
Offset Length Mapped to File
|
|
# Create an image with compat=1.1 without a backing file
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072
|
|
# Fill all clusters with data and then discard them
|
|
wrote 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
discard 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Read the data from the discarded clusters
|
|
read 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Output of qemu-img map
|
|
Offset Length Mapped to File
|
|
|
|
### Test 'qemu-io -c discard' on a QCOW2 image with a backing file
|
|
|
|
# Create a backing image and fill it with data
|
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=131072
|
|
wrote 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Create an image with compat=0.10 and a backing file
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072 backing_file=TEST_DIR/t.IMGFMT.base
|
|
# Fill all clusters with data and then discard them
|
|
wrote 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
discard 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Read the data from the discarded clusters
|
|
read 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Output of qemu-img map
|
|
Offset Length Mapped to File
|
|
0 0x20000 0x50000 TEST_DIR/t.qcow2
|
|
# Create an image with compat=1.1 and a backing file
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=131072 backing_file=TEST_DIR/t.IMGFMT.base
|
|
# Fill all clusters with data and then discard them
|
|
wrote 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
discard 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Read the data from the discarded clusters
|
|
read 131072/131072 bytes at offset 0
|
|
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
# Output of qemu-img map
|
|
Offset Length Mapped to File
|
|
*** done
|