9ae3a8
From 8ddf0e61ad5bc3ab854a04f6b20d996ef4ed0ae2 Mon Sep 17 00:00:00 2001
9ae3a8
From: Max Reitz <mreitz@redhat.com>
9ae3a8
Date: Mon, 17 Mar 2014 22:45:31 +0100
9ae3a8
Subject: [PATCH 6/6] iotests: Test corruption during COW request
9ae3a8
9ae3a8
RH-Author: Max Reitz <mreitz@redhat.com>
9ae3a8
Message-id: <1395096331-12610-4-git-send-email-mreitz@redhat.com>
9ae3a8
Patchwork-id: 58121
9ae3a8
O-Subject: [RHEL-7.0 qemu-kvm PATCH 3/3] iotests: Test corruption during COW request
9ae3a8
Bugzilla: 1048575
9ae3a8
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
RH-Acked-by: Fam Zheng <famz@redhat.com>
9ae3a8
9ae3a8
BZ: 1048575
9ae3a8
9ae3a8
Extend test file 060 by a test case for corruption occuring concurrently
9ae3a8
to a COW request. QEMU should not crash but rather return an appropriate
9ae3a8
error message.
9ae3a8
9ae3a8
Signed-off-by: Max Reitz <mreitz@redhat.com>
9ae3a8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
(cherry picked from commit 98d39e34fe95f8609be3ccbd1b67926631d2c7c0)
9ae3a8
9ae3a8
Conflicts:
9ae3a8
	tests/qemu-iotests/060
9ae3a8
9ae3a8
As the series allowing blkdebug to be used through the QMP interfaces
9ae3a8
has not yet been backported, this test may not use
9ae3a8
"-o file.driver=blkdebug" to select the blkdebug block driver, but
9ae3a8
rather "blkdebug::$TEST_IMG" as the filename.
9ae3a8
9ae3a8
Signed-off-by: Max Reitz <mreitz@redhat.com>
9ae3a8
---
9ae3a8
 tests/qemu-iotests/060     | 26 ++++++++++++++++++++++++++
9ae3a8
 tests/qemu-iotests/060.out | 15 +++++++++++++++
9ae3a8
 2 files changed, 41 insertions(+)
9ae3a8
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 tests/qemu-iotests/060     |   26 ++++++++++++++++++++++++++
9ae3a8
 tests/qemu-iotests/060.out |   15 +++++++++++++++
9ae3a8
 2 files changed, 41 insertions(+), 0 deletions(-)
9ae3a8
9ae3a8
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
9ae3a8
index bbb1909..2abd566 100644
9ae3a8
--- a/tests/qemu-iotests/060
9ae3a8
+++ b/tests/qemu-iotests/060
9ae3a8
@@ -138,6 +138,32 @@ $QEMU_IMG snapshot -a foo "$TEST_IMG"
9ae3a8
 _check_test_img
9ae3a8
 $QEMU_IO -c "$OPEN_RO" -c "read -P 1 0 512" | _filter_qemu_io
9ae3a8
 
9ae3a8
+echo
9ae3a8
+echo "=== Testing overlap while COW is in flight ==="
9ae3a8
+echo
9ae3a8
+# compat=0.10 is required in order to make the following discard actually
9ae3a8
+# unallocate the sector rather than make it a zero sector - we want COW, after
9ae3a8
+# all.
9ae3a8
+IMGOPTS='compat=0.10' _make_test_img 1G
9ae3a8
+# Write two clusters, the second one enforces creation of an L2 table after
9ae3a8
+# the first data cluster.
9ae3a8
+$QEMU_IO -c 'write 0k 64k' -c 'write 512M 64k' "$TEST_IMG" | _filter_qemu_io
9ae3a8
+# Discard the first cluster. This cluster will soon enough be reallocated and
9ae3a8
+# used for COW.
9ae3a8
+$QEMU_IO -c 'discard 0k 64k' "$TEST_IMG" | _filter_qemu_io
9ae3a8
+# Now, corrupt the image by marking the second L2 table cluster as free.
9ae3a8
+poke_file "$TEST_IMG" '131084' "\x00\x00" # 0x2000c
9ae3a8
+# Start a write operation requiring COW on the image stopping it right before
9ae3a8
+# doing the read; then, trigger the corruption prevention by writing anything to
9ae3a8
+# any unallocated cluster, leading to an attempt to overwrite the second L2
9ae3a8
+# table. Finally, resume the COW write and see it fail (but not crash).
9ae3a8
+echo "open blkdebug::$TEST_IMG
9ae3a8
+break cow_read 0
9ae3a8
+aio_write 0k 1k
9ae3a8
+wait_break 0
9ae3a8
+write 64k 64k
9ae3a8
+resume 0" | $QEMU_IO | _filter_qemu_io
9ae3a8
+
9ae3a8
 # success, all done
9ae3a8
 echo "*** done"
9ae3a8
 rm -f $seq.full
9ae3a8
diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out
9ae3a8
index 6c7bdbb..a517948 100644
9ae3a8
--- a/tests/qemu-iotests/060.out
9ae3a8
+++ b/tests/qemu-iotests/060.out
9ae3a8
@@ -78,4 +78,19 @@ read 512/512 bytes at offset 0
9ae3a8
 No errors were found on the image.
9ae3a8
 read 512/512 bytes at offset 0
9ae3a8
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
9ae3a8
+
9ae3a8
+=== Testing overlap while COW is in flight ===
9ae3a8
+
9ae3a8
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 
9ae3a8
+wrote 65536/65536 bytes at offset 0
9ae3a8
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
9ae3a8
+wrote 65536/65536 bytes at offset 536870912
9ae3a8
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
9ae3a8
+discard 65536/65536 bytes at offset 0
9ae3a8
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
9ae3a8
+qcow2: Preventing invalid write on metadata (overlaps with active L2 table); image marked as corrupt.
9ae3a8
+blkdebug: Suspended request '0'
9ae3a8
+write failed: Input/output error
9ae3a8
+blkdebug: Resuming request '0'
9ae3a8
+aio_write failed: No medium found
9ae3a8
 *** done
9ae3a8
-- 
9ae3a8
1.7.1
9ae3a8