qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

iotests: Extend test 066

066 was supposed to be a test "for discarding preallocated zero
clusters", but it did so incompletely: While it did check the image
file's integrity after the operation, it did not confirm that the
clusters are indeed freed. This patch adds this test.

In addition, new cases for writing to preallocated zero clusters are
added.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>

authored by

Max Reitz and committed by
Kevin Wolf
aa93c834 293073a5

+173 -1
+127 -1
tests/qemu-iotests/066
··· 1 1 #!/bin/bash 2 2 # 3 - # Test case for discarding preallocated zero clusters in qcow2 3 + # Test case for preallocated zero clusters in qcow2 4 4 # 5 5 # Copyright (C) 2013 Red Hat, Inc. 6 6 # ··· 55 55 $QEMU_IO -c "write 0 256k" -c "write -z 0 256k" -c "write 64M 512" \ 56 56 -c "discard 0 $IMG_SIZE" -c "read -P 0 0 $IMG_SIZE" "$TEST_IMG" \ 57 57 | _filter_qemu_io 58 + 58 59 # Check the image (there shouldn't be any leaks) 59 60 _check_test_img 61 + # Map the image (we want all clusters to be gone) 62 + $QEMU_IMG map "$TEST_IMG" 63 + 64 + _cleanup_test_img 65 + 66 + 67 + echo 68 + echo '=== Writing to preallocated zero clusters ===' 69 + echo 70 + 71 + _make_test_img $IMG_SIZE 72 + 73 + # Create data clusters (not aligned to an L2 table) 74 + $QEMU_IO -c 'write -P 42 1M 256k' "$TEST_IMG" | _filter_qemu_io 75 + orig_map=$($QEMU_IMG map --output=json "$TEST_IMG") 76 + 77 + # Convert the data clusters to preallocated zero clusters 78 + $QEMU_IO -c 'write -z 1M 256k' "$TEST_IMG" | _filter_qemu_io 79 + 80 + # Now write to them (with a COW needed for the head and tail) 81 + $QEMU_IO -c "write -P 23 $(((1024 + 32) * 1024)) 192k" "$TEST_IMG" \ 82 + | _filter_qemu_io 83 + 84 + # Check metadata correctness 85 + _check_test_img 86 + 87 + # Check data correctness 88 + $QEMU_IO -c "read -P 0 $(( 1024 * 1024)) 32k" \ 89 + -c "read -P 23 $(((1024 + 32) * 1024)) 192k" \ 90 + -c "read -P 0 $(((1024 + 32 + 192) * 1024)) 32k" \ 91 + "$TEST_IMG" \ 92 + | _filter_qemu_io 93 + 94 + # Check that we have actually reused the original area 95 + new_map=$($QEMU_IMG map --output=json "$TEST_IMG") 96 + if [ "$new_map" = "$orig_map" ]; then 97 + echo 'Successfully reused original clusters.' 98 + else 99 + echo 'Failed to reuse original clusters.' 100 + echo 'Original map:' 101 + echo "$orig_map" 102 + echo 'New map:' 103 + echo "$new_map" 104 + fi 105 + 106 + _cleanup_test_img 107 + 108 + 109 + echo 110 + echo '=== Writing to a snapshotted preallocated zero cluster ===' 111 + echo 112 + 113 + _make_test_img 64k 114 + 115 + # Create a preallocated zero cluster 116 + $QEMU_IO -c 'write -P 42 0 64k' -c 'write -z 0 64k' "$TEST_IMG" \ 117 + | _filter_qemu_io 118 + 119 + # Snapshot it 120 + $QEMU_IMG snapshot -c foo "$TEST_IMG" 121 + 122 + # Write to the cluster 123 + $QEMU_IO -c 'write -P 23 0 64k' "$TEST_IMG" | _filter_qemu_io 124 + 125 + # Check metadata correctness 126 + _check_test_img 127 + 128 + # Check data correctness 129 + $QEMU_IO -c 'read -P 23 0 64k' "$TEST_IMG" | _filter_qemu_io 130 + $QEMU_IMG snapshot -a foo "$TEST_IMG" 131 + $QEMU_IO -c 'read -P 0 0 64k' "$TEST_IMG" | _filter_qemu_io 132 + 133 + _cleanup_test_img 134 + 135 + 136 + echo 137 + echo '=== Consecutive write to a preallocated zero cluster ===' 138 + echo 139 + 140 + _make_test_img 192k 141 + 142 + # Create three normal clusters 143 + $QEMU_IO -c 'write -P 42 0 192k' "$TEST_IMG" | _filter_qemu_io 144 + orig_map=$($QEMU_IMG map --output=json "$TEST_IMG") 145 + 146 + # Make the middle cluster a preallocated zero cluster 147 + $QEMU_IO -c 'write -z 64k 64k' "$TEST_IMG" | _filter_qemu_io 148 + 149 + # Try to overwrite everything: This should reuse the whole range. To test that 150 + # this only issues a single continuous write request, use blkdebug. 151 + $QEMU_IO -c 'write -P 42 0 192k' \ 152 + "json:{ 153 + 'driver': '$IMGFMT', 154 + 'file': { 155 + 'driver': 'blkdebug', 156 + 'image.filename': '$TEST_IMG', 157 + 'set-state': [{ 158 + 'event': 'write_aio', 159 + 'new_state': 2 160 + }], 161 + 'inject-error': [{ 162 + 'event': 'write_aio', 163 + 'state': 2 164 + }] 165 + } 166 + }" \ 167 + | _filter_qemu_io 168 + 169 + # Check metadata correctness 170 + _check_test_img 171 + 172 + # Check that we have actually reused the original area 173 + new_map=$($QEMU_IMG map --output=json "$TEST_IMG") 174 + if [ "$new_map" = "$orig_map" ]; then 175 + echo 'Successfully reused original clusters.' 176 + else 177 + echo 'Failed to reuse original clusters.' 178 + echo 'Original map:' 179 + echo "$orig_map" 180 + echo 'New map:' 181 + echo "$new_map" 182 + fi 183 + 184 + _cleanup_test_img 185 + 60 186 61 187 # success, all done 62 188 echo "*** done"
+46
tests/qemu-iotests/066.out
··· 14 14 read 67109376/67109376 bytes at offset 0 15 15 64 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 16 16 No errors were found on the image. 17 + Offset Length Mapped to File 18 + 19 + === Writing to preallocated zero clusters === 20 + 21 + Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67109376 22 + wrote 262144/262144 bytes at offset 1048576 23 + 256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 24 + wrote 262144/262144 bytes at offset 1048576 25 + 256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 26 + wrote 196608/196608 bytes at offset 1081344 27 + 192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 28 + No errors were found on the image. 29 + read 32768/32768 bytes at offset 1048576 30 + 32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 31 + read 196608/196608 bytes at offset 1081344 32 + 192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 33 + read 32768/32768 bytes at offset 1277952 34 + 32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 35 + Successfully reused original clusters. 36 + 37 + === Writing to a snapshotted preallocated zero cluster === 38 + 39 + Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=65536 40 + wrote 65536/65536 bytes at offset 0 41 + 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 42 + wrote 65536/65536 bytes at offset 0 43 + 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 44 + wrote 65536/65536 bytes at offset 0 45 + 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 46 + No errors were found on the image. 47 + read 65536/65536 bytes at offset 0 48 + 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 49 + read 65536/65536 bytes at offset 0 50 + 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 51 + 52 + === Consecutive write to a preallocated zero cluster === 53 + 54 + Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=196608 55 + wrote 196608/196608 bytes at offset 0 56 + 192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 57 + wrote 65536/65536 bytes at offset 65536 58 + 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 59 + wrote 196608/196608 bytes at offset 0 60 + 192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 61 + No errors were found on the image. 62 + Successfully reused original clusters. 17 63 *** done