|
@@ -1,6 +1,6 @@
|
|
#!/bin/bash
|
|
#!/bin/bash
|
|
#
|
|
#
|
|
-# Test case for discarding preallocated zero clusters in qcow2
|
|
|
|
|
|
+# Test case for preallocated zero clusters in qcow2
|
|
#
|
|
#
|
|
# Copyright (C) 2013 Red Hat, Inc.
|
|
# Copyright (C) 2013 Red Hat, Inc.
|
|
#
|
|
#
|
|
@@ -55,8 +55,134 @@ _make_test_img $IMG_SIZE
|
|
$QEMU_IO -c "write 0 256k" -c "write -z 0 256k" -c "write 64M 512" \
|
|
$QEMU_IO -c "write 0 256k" -c "write -z 0 256k" -c "write 64M 512" \
|
|
-c "discard 0 $IMG_SIZE" -c "read -P 0 0 $IMG_SIZE" "$TEST_IMG" \
|
|
-c "discard 0 $IMG_SIZE" -c "read -P 0 0 $IMG_SIZE" "$TEST_IMG" \
|
|
| _filter_qemu_io
|
|
| _filter_qemu_io
|
|
|
|
+
|
|
# Check the image (there shouldn't be any leaks)
|
|
# Check the image (there shouldn't be any leaks)
|
|
_check_test_img
|
|
_check_test_img
|
|
|
|
+# Map the image (we want all clusters to be gone)
|
|
|
|
+$QEMU_IMG map "$TEST_IMG"
|
|
|
|
+
|
|
|
|
+_cleanup_test_img
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+echo
|
|
|
|
+echo '=== Writing to preallocated zero clusters ==='
|
|
|
|
+echo
|
|
|
|
+
|
|
|
|
+_make_test_img $IMG_SIZE
|
|
|
|
+
|
|
|
|
+# Create data clusters (not aligned to an L2 table)
|
|
|
|
+$QEMU_IO -c 'write -P 42 1M 256k' "$TEST_IMG" | _filter_qemu_io
|
|
|
|
+orig_map=$($QEMU_IMG map --output=json "$TEST_IMG")
|
|
|
|
+
|
|
|
|
+# Convert the data clusters to preallocated zero clusters
|
|
|
|
+$QEMU_IO -c 'write -z 1M 256k' "$TEST_IMG" | _filter_qemu_io
|
|
|
|
+
|
|
|
|
+# Now write to them (with a COW needed for the head and tail)
|
|
|
|
+$QEMU_IO -c "write -P 23 $(((1024 + 32) * 1024)) 192k" "$TEST_IMG" \
|
|
|
|
+ | _filter_qemu_io
|
|
|
|
+
|
|
|
|
+# Check metadata correctness
|
|
|
|
+_check_test_img
|
|
|
|
+
|
|
|
|
+# Check data correctness
|
|
|
|
+$QEMU_IO -c "read -P 0 $(( 1024 * 1024)) 32k" \
|
|
|
|
+ -c "read -P 23 $(((1024 + 32) * 1024)) 192k" \
|
|
|
|
+ -c "read -P 0 $(((1024 + 32 + 192) * 1024)) 32k" \
|
|
|
|
+ "$TEST_IMG" \
|
|
|
|
+ | _filter_qemu_io
|
|
|
|
+
|
|
|
|
+# Check that we have actually reused the original area
|
|
|
|
+new_map=$($QEMU_IMG map --output=json "$TEST_IMG")
|
|
|
|
+if [ "$new_map" = "$orig_map" ]; then
|
|
|
|
+ echo 'Successfully reused original clusters.'
|
|
|
|
+else
|
|
|
|
+ echo 'Failed to reuse original clusters.'
|
|
|
|
+ echo 'Original map:'
|
|
|
|
+ echo "$orig_map"
|
|
|
|
+ echo 'New map:'
|
|
|
|
+ echo "$new_map"
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+_cleanup_test_img
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+echo
|
|
|
|
+echo '=== Writing to a snapshotted preallocated zero cluster ==='
|
|
|
|
+echo
|
|
|
|
+
|
|
|
|
+_make_test_img 64k
|
|
|
|
+
|
|
|
|
+# Create a preallocated zero cluster
|
|
|
|
+$QEMU_IO -c 'write -P 42 0 64k' -c 'write -z 0 64k' "$TEST_IMG" \
|
|
|
|
+ | _filter_qemu_io
|
|
|
|
+
|
|
|
|
+# Snapshot it
|
|
|
|
+$QEMU_IMG snapshot -c foo "$TEST_IMG"
|
|
|
|
+
|
|
|
|
+# Write to the cluster
|
|
|
|
+$QEMU_IO -c 'write -P 23 0 64k' "$TEST_IMG" | _filter_qemu_io
|
|
|
|
+
|
|
|
|
+# Check metadata correctness
|
|
|
|
+_check_test_img
|
|
|
|
+
|
|
|
|
+# Check data correctness
|
|
|
|
+$QEMU_IO -c 'read -P 23 0 64k' "$TEST_IMG" | _filter_qemu_io
|
|
|
|
+$QEMU_IMG snapshot -a foo "$TEST_IMG"
|
|
|
|
+$QEMU_IO -c 'read -P 0 0 64k' "$TEST_IMG" | _filter_qemu_io
|
|
|
|
+
|
|
|
|
+_cleanup_test_img
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+echo
|
|
|
|
+echo '=== Consecutive write to a preallocated zero cluster ==='
|
|
|
|
+echo
|
|
|
|
+
|
|
|
|
+_make_test_img 192k
|
|
|
|
+
|
|
|
|
+# Create three normal clusters
|
|
|
|
+$QEMU_IO -c 'write -P 42 0 192k' "$TEST_IMG" | _filter_qemu_io
|
|
|
|
+orig_map=$($QEMU_IMG map --output=json "$TEST_IMG")
|
|
|
|
+
|
|
|
|
+# Make the middle cluster a preallocated zero cluster
|
|
|
|
+$QEMU_IO -c 'write -z 64k 64k' "$TEST_IMG" | _filter_qemu_io
|
|
|
|
+
|
|
|
|
+# Try to overwrite everything: This should reuse the whole range. To test that
|
|
|
|
+# this only issues a single continuous write request, use blkdebug.
|
|
|
|
+$QEMU_IO -c 'write -P 42 0 192k' \
|
|
|
|
+ "json:{
|
|
|
|
+ 'driver': '$IMGFMT',
|
|
|
|
+ 'file': {
|
|
|
|
+ 'driver': 'blkdebug',
|
|
|
|
+ 'image.filename': '$TEST_IMG',
|
|
|
|
+ 'set-state': [{
|
|
|
|
+ 'event': 'write_aio',
|
|
|
|
+ 'new_state': 2
|
|
|
|
+ }],
|
|
|
|
+ 'inject-error': [{
|
|
|
|
+ 'event': 'write_aio',
|
|
|
|
+ 'state': 2
|
|
|
|
+ }]
|
|
|
|
+ }
|
|
|
|
+ }" \
|
|
|
|
+ | _filter_qemu_io
|
|
|
|
+
|
|
|
|
+# Check metadata correctness
|
|
|
|
+_check_test_img
|
|
|
|
+
|
|
|
|
+# Check that we have actually reused the original area
|
|
|
|
+new_map=$($QEMU_IMG map --output=json "$TEST_IMG")
|
|
|
|
+if [ "$new_map" = "$orig_map" ]; then
|
|
|
|
+ echo 'Successfully reused original clusters.'
|
|
|
|
+else
|
|
|
|
+ echo 'Failed to reuse original clusters.'
|
|
|
|
+ echo 'Original map:'
|
|
|
|
+ echo "$orig_map"
|
|
|
|
+ echo 'New map:'
|
|
|
|
+ echo "$new_map"
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+_cleanup_test_img
|
|
|
|
+
|
|
|
|
|
|
# success, all done
|
|
# success, all done
|
|
echo "*** done"
|
|
echo "*** done"
|