iotests/138: Test leaks/corruptions fixed report

Test that qemu-img check reports the number of leaks and corruptions
fixed in its JSON report (after a successful run).

While touching the _unsupported_imgopts line, adjust the note on why
data_file does not work with this test: The current comment sounds a bit
like it is a mistake for qemu-img check not to check external data
files' refcounts.  But there are no such refcounts, so it is no mistake.
Just say that qemu-img check does not do much for external data files,
and this is why this test does not work with them.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20200324172757.1173824-4-mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Max Reitz 2020-03-24 18:27:57 +01:00
parent 2f8bb28ff0
commit a507c51790
2 changed files with 53 additions and 2 deletions

View File

@ -41,8 +41,10 @@ _supported_fmt qcow2
_supported_proto file _supported_proto file
_supported_os Linux _supported_os Linux
# With an external data file, data clusters are not refcounted # With an external data file, data clusters are not refcounted
# (and so qemu-img check does not check their refcount) # (so qemu-img check would not do much);
_unsupported_imgopts data_file # we want to modify the refcounts, so we need them to have a specific
# format (namely u16)
_unsupported_imgopts data_file 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
echo echo
echo '=== Check on an image with a multiple of 2^32 clusters ===' echo '=== Check on an image with a multiple of 2^32 clusters ==='
@ -65,6 +67,41 @@ poke_file "$TEST_IMG" $((2048 + 8)) "\x00\x80\x00\x00\x00\x00\x00\x00"
# allocate memory", we have an error showing that l2 entry is invalid. # allocate memory", we have an error showing that l2 entry is invalid.
_check_test_img _check_test_img
echo
echo '=== Check leaks-fixed/corruptions-fixed report'
echo
# After leaks and corruptions were fixed, those numbers should be
# reported by qemu-img check
_make_test_img 64k
# Allocate data cluster
$QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io
reftable_ofs=$(peek_file_be "$TEST_IMG" 48 8)
refblock_ofs=$(peek_file_be "$TEST_IMG" $reftable_ofs 8)
# Introduce a leak: Make the image header's refcount 2
poke_file_be "$TEST_IMG" "$refblock_ofs" 2 2
l1_ofs=$(peek_file_be "$TEST_IMG" 40 8)
# Introduce a corruption: Drop the COPIED flag from the (first) L1 entry
l1_entry=$(peek_file_be "$TEST_IMG" $l1_ofs 8)
l1_entry=$((l1_entry & ~(1 << 63)))
poke_file_be "$TEST_IMG" $l1_ofs 8 $l1_entry
echo
# Should print the number of corruptions and leaks fixed
# (Filter out all JSON fields (recognizable by their four-space
# indentation), but keep the "-fixed" fields (by removing two spaces
# from their indentation))
# (Also filter out the L1 entry, because why not)
_check_test_img -r all --output=json \
| sed -e 's/^ \(.*\)-fixed"/\1-fixed"/' \
-e '/^ /d' \
-e "s/\\([^0-9a-f]\\)$(printf %x $l1_entry)\\([^0-9a-f]\\)/\1L1_ENTRY_VALUE\2/"
# success, all done # success, all done
echo "*** done" echo "*** done"
rm -f $seq.full rm -f $seq.full

View File

@ -9,4 +9,18 @@ ERROR: counting reference for region exceeding the end of the file by one cluste
1 errors were found on the image. 1 errors were found on the image.
Data may be corrupted, or further writes to the image may corrupt it. Data may be corrupted, or further writes to the image may corrupt it.
=== Check leaks-fixed/corruptions-fixed report
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=65536
wrote 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
Leaked cluster 0 refcount=2 reference=1
Repairing cluster 0 refcount=2 reference=1
Repairing OFLAG_COPIED L2 cluster: l1_index=0 l1_entry=L1_ENTRY_VALUE refcount=1
{
"corruptions-fixed": 1,
"leaks-fixed": 1,
}
*** done *** done