[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 for-2.0 05/24] iotests: Test corruption during COW
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v2 for-2.0 05/24] iotests: Test corruption during COW request |
Date: |
Thu, 13 Mar 2014 15:10:49 +0100 |
From: Max Reitz <address@hidden>
Extend test file 060 by a test case for corruption occuring concurrently
to a COW request. QEMU should not crash but rather return an appropriate
error message.
Signed-off-by: Max Reitz <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
tests/qemu-iotests/060 | 26 ++++++++++++++++++++++++++
tests/qemu-iotests/060.out | 15 +++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index af8ed9f..f0116aa 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -138,6 +138,32 @@ $QEMU_IMG snapshot -a foo "$TEST_IMG"
_check_test_img
$QEMU_IO -c "$OPEN_RO" -c "read -P 1 0 512" | _filter_qemu_io
+echo
+echo "=== Testing overlap while COW is in flight ==="
+echo
+# compat=0.10 is required in order to make the following discard actually
+# unallocate the sector rather than make it a zero sector - we want COW, after
+# all.
+IMGOPTS='compat=0.10' _make_test_img 1G
+# Write two clusters, the second one enforces creation of an L2 table after
+# the first data cluster.
+$QEMU_IO -c 'write 0k 64k' -c 'write 512M 64k' "$TEST_IMG" | _filter_qemu_io
+# Discard the first cluster. This cluster will soon enough be reallocated and
+# used for COW.
+$QEMU_IO -c 'discard 0k 64k' "$TEST_IMG" | _filter_qemu_io
+# Now, corrupt the image by marking the second L2 table cluster as free.
+poke_file "$TEST_IMG" '131084' "\x00\x00" # 0x2000c
+# Start a write operation requiring COW on the image stopping it right before
+# doing the read; then, trigger the corruption prevention by writing anything
to
+# any unallocated cluster, leading to an attempt to overwrite the second L2
+# table. Finally, resume the COW write and see it fail (but not crash).
+echo "open -o file.driver=blkdebug $TEST_IMG
+break cow_read 0
+aio_write 0k 1k
+wait_break 0
+write 64k 64k
+resume 0" | $QEMU_IO | _filter_qemu_io
+
# success, all done
echo "*** done"
rm -f $seq.full
diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out
index 6c7bdbb..a517948 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -78,4 +78,19 @@ read 512/512 bytes at offset 0
No errors were found on the image.
read 512/512 bytes at offset 0
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+
+=== Testing overlap while COW is in flight ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824
+wrote 65536/65536 bytes at offset 0
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 65536/65536 bytes at offset 536870912
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+discard 65536/65536 bytes at offset 0
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+qcow2: Preventing invalid write on metadata (overlaps with active L2 table);
image marked as corrupt.
+blkdebug: Suspended request '0'
+write failed: Input/output error
+blkdebug: Resuming request '0'
+aio_write failed: No medium found
*** done
--
1.8.5.3
- [Qemu-devel] [PULL v2 for-2.0 00/24] Block patches, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 01/24] qcow2-refcount: Sanitize refcount table entry, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 02/24] block: Update image size in bdrv_invalidate_cache(), Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 03/24] qcow2: Check bs->drv in copy_sectors(), Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 05/24] iotests: Test corruption during COW request,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v2 for-2.0 07/24] object: add object_get_canonical_path_component(), Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 08/24] rfifolock: add recursive FIFO lock, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 09/24] aio: add aio_context_acquire() and aio_context_release(), Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 06/24] block: Rewrite the snapshot authorization mechanism for block filters., Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 10/24] iothread: add I/O thread object, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 11/24] qdev: make get_pointer() handle temporary strings, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 12/24] iothread: add "iothread" qdev property type, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 15/24] qmp: add query-iothreads command, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 16/24] qcow2: Keep option in qcow2_invalidate_cache(), Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 17/24] qcow2: Don't write with BDRV_O_INCOMING, Stefan Hajnoczi, 2014/03/13