* [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1
@ 2017-11-14 17:23 Max Reitz
2017-11-14 17:23 ` [Qemu-devel] [PULL 01/20] qcow2: Prevent allocating refcount blocks at offset 0 Max Reitz
` (21 more replies)
0 siblings, 22 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:23 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf
The following changes since commit 191b5fbfa66e5b23e2150f3c6981d30eb84418a9:
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2017-11-14 16:11:19 +0000)
are available in the git repository at:
git://github.com/XanClic/qemu.git tags/pull-block-2017-11-14
for you to fetch changes up to 8b2d7c364d9a2491f7501f6688cd722045cf808a:
qemu-iotests: update unsupported image formats in 194 (2017-11-14 18:06:26 +0100)
----------------------------------------------------------------
Block patches for 2.11.0-rc1
----------------------------------------------------------------
Alberto Garcia (8):
qcow2: Prevent allocating refcount blocks at offset 0
qcow2: Prevent allocating L2 tables at offset 0
qcow2: Prevent allocating compressed clusters at offset 0
qcow2: Don't open images with header.refcount_table_clusters == 0
qcow2: Add iotest for an image with header.refcount_table_offset == 0
qcow2: Add iotest for an empty refcount table
qcow2: Assert that the crypto header does not overlap other metadata
qcow2: Check that corrupted images can be repaired in iotest 060
Eric Blake (1):
iotests: Use new-style NBD connections
Fam Zheng (1):
iotests: 077: Filter out 'resume' lines
Jeff Cody (4):
block/vhdx.c: Don't blindly update the header
block/parallels: Do not update header or truncate image when INMIGRATE
block/parallels: add migration blocker
qemu-iotests: update unsupported image formats in 194
Max Reitz (5):
iotests: Make 030 less flaky
iotests: Add missing 'blkdebug::' in 040
iotests: Make 055 less flaky
iotests: Make 083 less flaky
iotests: Make 136 less flaky
Vladimir Sementsov-Ogievskiy (1):
block/snapshot: dirty all dirty bitmaps on snapshot-switch
block/parallels.c | 22 ++++++---
block/qcow2-cluster.c | 8 ++++
block/qcow2-refcount.c | 14 ++++++
block/qcow2.c | 7 +++
block/snapshot.c | 14 ++++++
block/vhdx.c | 7 ---
tests/qemu-iotests/030 | 8 +++-
tests/qemu-iotests/040 | 2 +-
tests/qemu-iotests/055 | 25 +++++++----
tests/qemu-iotests/060 | 59 +++++++++++++++++++++++++
tests/qemu-iotests/060.out | 103 +++++++++++++++++++++++++++++++++++++++++++
tests/qemu-iotests/077 | 3 +-
tests/qemu-iotests/077.out | 16 -------
tests/qemu-iotests/083 | 4 +-
tests/qemu-iotests/136 | 14 +++++-
tests/qemu-iotests/194 | 2 +-
tests/qemu-iotests/common.rc | 2 +-
17 files changed, 265 insertions(+), 45 deletions(-)
--
2.13.6
^ permalink raw reply [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 01/20] qcow2: Prevent allocating refcount blocks at offset 0
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
@ 2017-11-14 17:23 ` Max Reitz
2017-11-14 17:23 ` [Qemu-devel] [PULL 02/20] qcow2: Prevent allocating L2 tables " Max Reitz
` (20 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:23 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Alberto Garcia
From: Alberto Garcia <berto@igalia.com>
Each entry in the qcow2 cache contains an offset field indicating the
location of the data in the qcow2 image. If the offset is 0 then it
means that the entry contains no data and is available to be used when
needed.
Because of that it is not possible to store in the cache the first
cluster of the qcow2 image (offset = 0). This is not a problem because
that cluster always contains the qcow2 header and we're not using this
cache for that.
However, if the qcow2 image is corrupted it can happen that we try to
allocate a new refcount block at offset 0, triggering this assertion
and crashing QEMU:
qcow2_cache_entry_mark_dirty: Assertion `c->entries[i].offset != 0' failed
This patch adds an explicit check for this scenario and a new test
case.
This problem was originally reported here:
https://bugs.launchpad.net/qemu/+bug/1728615
Reported-by: R.Nageswara Sastry <nasastry@in.ibm.com>
Signed-off-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-id: 92a2fadd10d58b423f269c1d1a309af161cdc73f.1509718618.git.berto@igalia.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/qcow2-refcount.c | 7 +++++++
tests/qemu-iotests/060 | 11 +++++++++++
tests/qemu-iotests/060.out | 8 ++++++++
3 files changed, 26 insertions(+)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index aa3fd6cf17..9059996c4b 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -367,6 +367,13 @@ static int alloc_refcount_block(BlockDriverState *bs,
return new_block;
}
+ /* If we're allocating the block at offset 0 then something is wrong */
+ if (new_block == 0) {
+ qcow2_signal_corruption(bs, true, -1, -1, "Preventing invalid "
+ "allocation of refcount block at offset 0");
+ return -EIO;
+ }
+
#ifdef DEBUG_ALLOC2
fprintf(stderr, "qcow2: Allocate refcount block %d for %" PRIx64
" at %" PRIx64 "\n",
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index 8e95c450eb..dead26aeaf 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -242,6 +242,17 @@ poke_file "$TEST_IMG" "$(($l2_offset+8))" "\x80\x00\x00\x00\x00\x06\x2a\x00"
# Should emit two error messages
$QEMU_IO -c "discard 0 64k" -c "read 64k 64k" "$TEST_IMG" | _filter_qemu_io
+echo
+echo "=== Testing empty refcount table with valid L1 and L2 tables ==="
+echo
+_make_test_img 64M
+$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
+poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
+# Since the first data cluster is already allocated this triggers an
+# allocation with an explicit offset (using qcow2_alloc_clusters_at())
+# causing a refcount block to be allocated at offset 0
+$QEMU_IO -c "write 0 128k" "$TEST_IMG" | _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 5ca3af491f..872719009c 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -181,4 +181,12 @@ qcow2: Marking image as corrupt: Cluster allocation offset 0x62a00 unaligned (L2
discard 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read failed: Input/output error
+
+=== Testing empty refcount table with valid L1 and L2 tables ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
+wrote 65536/65536 bytes at offset 0
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+qcow2: Marking image as corrupt: Preventing invalid allocation of refcount block at offset 0; further corruption events will be suppressed
+write failed: Input/output error
*** done
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 02/20] qcow2: Prevent allocating L2 tables at offset 0
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
2017-11-14 17:23 ` [Qemu-devel] [PULL 01/20] qcow2: Prevent allocating refcount blocks at offset 0 Max Reitz
@ 2017-11-14 17:23 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 03/20] qcow2: Prevent allocating compressed clusters " Max Reitz
` (19 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:23 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Alberto Garcia
From: Alberto Garcia <berto@igalia.com>
If the refcount data is corrupted then we can end up trying to
allocate a new L2 table at offset 0 in the image, triggering an
assertion in the qcow2 cache that would crash QEMU:
qcow2_cache_entry_mark_dirty: Assertion `c->entries[i].offset != 0' failed
This patch adds an explicit check for this scenario and a new test
case.
Signed-off-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-id: 92dac37191ae7844a2da22c122204eb493cc3133.1509718618.git.berto@igalia.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/qcow2-cluster.c | 8 ++++++++
tests/qemu-iotests/060 | 7 +++++++
tests/qemu-iotests/060.out | 6 ++++++
3 files changed, 21 insertions(+)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index fb10e26068..2e072ed155 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -278,6 +278,14 @@ static int l2_allocate(BlockDriverState *bs, int l1_index, uint64_t **table)
goto fail;
}
+ /* If we're allocating the table at offset 0 then something is wrong */
+ if (l2_offset == 0) {
+ qcow2_signal_corruption(bs, true, -1, -1, "Preventing invalid "
+ "allocation of L2 table at offset 0");
+ ret = -EIO;
+ goto fail;
+ }
+
ret = qcow2_cache_flush(bs, s->refcount_block_cache);
if (ret < 0) {
goto fail;
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index dead26aeaf..40f85cc216 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -253,6 +253,13 @@ poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
# causing a refcount block to be allocated at offset 0
$QEMU_IO -c "write 0 128k" "$TEST_IMG" | _filter_qemu_io
+echo
+echo "=== Testing empty refcount block ==="
+echo
+_make_test_img 64M
+poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
+$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _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 872719009c..5b8b518486 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -189,4 +189,10 @@ wrote 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
qcow2: Marking image as corrupt: Preventing invalid allocation of refcount block at offset 0; further corruption events will be suppressed
write failed: Input/output error
+
+=== Testing empty refcount block ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
+qcow2: Marking image as corrupt: Preventing invalid allocation of L2 table at offset 0; further corruption events will be suppressed
+write failed: Input/output error
*** done
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 03/20] qcow2: Prevent allocating compressed clusters at offset 0
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
2017-11-14 17:23 ` [Qemu-devel] [PULL 01/20] qcow2: Prevent allocating refcount blocks at offset 0 Max Reitz
2017-11-14 17:23 ` [Qemu-devel] [PULL 02/20] qcow2: Prevent allocating L2 tables " Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 04/20] qcow2: Don't open images with header.refcount_table_clusters == 0 Max Reitz
` (18 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Alberto Garcia
From: Alberto Garcia <berto@igalia.com>
If the refcount data is corrupted then we can end up trying to
allocate a new compressed cluster at offset 0 in the image, triggering
an assertion in qcow2_alloc_bytes() that would crash QEMU:
qcow2_alloc_bytes: Assertion `offset' failed.
This patch adds an explicit check for this scenario and a new test
case.
Signed-off-by: Alberto Garcia <berto@igalia.com>
Message-id: fb53467cf48e95ff3330def1cf1003a5b862b7d9.1509718618.git.berto@igalia.com
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/qcow2-refcount.c | 7 +++++++
tests/qemu-iotests/060 | 10 ++++++++++
tests/qemu-iotests/060.out | 8 ++++++++
3 files changed, 25 insertions(+)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 9059996c4b..60b8eef3e8 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1082,6 +1082,13 @@ int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
return new_cluster;
}
+ if (new_cluster == 0) {
+ qcow2_signal_corruption(bs, true, -1, -1, "Preventing invalid "
+ "allocation of compressed cluster "
+ "at offset 0");
+ return -EIO;
+ }
+
if (!offset || ROUND_UP(offset, s->cluster_size) != new_cluster) {
offset = new_cluster;
free_in_cluster = s->cluster_size;
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index 40f85cc216..c3bce27b33 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -260,6 +260,16 @@ _make_test_img 64M
poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
+echo
+echo "=== Testing empty refcount block with compressed write ==="
+echo
+_make_test_img 64M
+$QEMU_IO -c "write 64k 64k" "$TEST_IMG" | _filter_qemu_io
+poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
+# The previous write already allocated an L2 table, so now this new
+# write will try to allocate a compressed data cluster at offset 0.
+$QEMU_IO -c "write -c 0k 64k" "$TEST_IMG" | _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 5b8b518486..cf8790ff57 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -195,4 +195,12 @@ write failed: Input/output error
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
qcow2: Marking image as corrupt: Preventing invalid allocation of L2 table at offset 0; further corruption events will be suppressed
write failed: Input/output error
+
+=== Testing empty refcount block with compressed write ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
+wrote 65536/65536 bytes at offset 65536
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+qcow2: Marking image as corrupt: Preventing invalid allocation of compressed cluster at offset 0; further corruption events will be suppressed
+write failed: Input/output error
*** done
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 04/20] qcow2: Don't open images with header.refcount_table_clusters == 0
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (2 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 03/20] qcow2: Prevent allocating compressed clusters " Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 05/20] qcow2: Add iotest for an image with header.refcount_table_offset " Max Reitz
` (17 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Alberto Garcia
From: Alberto Garcia <berto@igalia.com>
qcow2_do_open() is checking that header.refcount_table_clusters is not
too large, but it doesn't check that it's greater than zero. Apart
from the fact that an image like that is obviously corrupted, trying
to use it crashes QEMU since we end up with a null s->refcount_table
after qcow2_refcount_init().
These images can however be repaired, so allow opening them if the
BDRV_O_CHECK flag is set.
Signed-off-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-id: f9750f50c80359babba11062e88f5075a47e8e16.1509718618.git.berto@igalia.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/qcow2.c | 6 ++++++
tests/qemu-iotests/060 | 7 +++++++
tests/qemu-iotests/060.out | 5 +++++
3 files changed, 18 insertions(+)
diff --git a/block/qcow2.c b/block/qcow2.c
index 92cb9f9bfa..defc1fe49f 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1280,6 +1280,12 @@ static int qcow2_do_open(BlockDriverState *bs, QDict *options, int flags,
goto fail;
}
+ if (header.refcount_table_clusters == 0 && !(flags & BDRV_O_CHECK)) {
+ error_setg(errp, "Image does not contain a reference count table");
+ ret = -EINVAL;
+ goto fail;
+ }
+
ret = validate_table_offset(bs, s->refcount_table_offset,
s->refcount_table_size, sizeof(uint64_t));
if (ret < 0) {
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index c3bce27b33..656af50883 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -270,6 +270,13 @@ poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
# write will try to allocate a compressed data cluster at offset 0.
$QEMU_IO -c "write -c 0k 64k" "$TEST_IMG" | _filter_qemu_io
+echo
+echo "=== Testing zero refcount table size ==="
+echo
+_make_test_img 64M
+poke_file "$TEST_IMG" "56" "\x00\x00\x00\x00"
+$QEMU_IO -c "write 0 64k" "$TEST_IMG" 2>&1 | _filter_testdir | _filter_imgfmt
+
# success, all done
echo "*** done"
rm -f $seq.full
diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out
index cf8790ff57..58456e8487 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -203,4 +203,9 @@ wrote 65536/65536 bytes at offset 65536
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
qcow2: Marking image as corrupt: Preventing invalid allocation of compressed cluster at offset 0; further corruption events will be suppressed
write failed: Input/output error
+
+=== Testing zero refcount table size ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
+can't open device TEST_DIR/t.IMGFMT: Image does not contain a reference count table
*** done
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 05/20] qcow2: Add iotest for an image with header.refcount_table_offset == 0
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (3 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 04/20] qcow2: Don't open images with header.refcount_table_clusters == 0 Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 06/20] qcow2: Add iotest for an empty refcount table Max Reitz
` (16 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Alberto Garcia
From: Alberto Garcia <berto@igalia.com>
This patch adds a simple iotest in which we try to write to an image
with the refcount table offset set to 0.
This scenario was already handled by the existing consistency checks,
but we add an explicit test case for completeness.
Signed-off-by: Alberto Garcia <berto@igalia.com>
Message-id: feeceada92486bb8790b90f303fc9fe82a27391a.1509718618.git.berto@igalia.com
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/060 | 7 +++++++
tests/qemu-iotests/060.out | 6 ++++++
2 files changed, 13 insertions(+)
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index 656af50883..dc5a517673 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -277,6 +277,13 @@ _make_test_img 64M
poke_file "$TEST_IMG" "56" "\x00\x00\x00\x00"
$QEMU_IO -c "write 0 64k" "$TEST_IMG" 2>&1 | _filter_testdir | _filter_imgfmt
+echo
+echo "=== Testing incorrect refcount table offset ==="
+echo
+_make_test_img 64M
+poke_file "$TEST_IMG" "48" "\x00\x00\x00\x00\x00\x00\x00\x00"
+$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _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 58456e8487..98f314c16d 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -208,4 +208,10 @@ write failed: Input/output error
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
can't open device TEST_DIR/t.IMGFMT: Image does not contain a reference count table
+
+=== Testing incorrect refcount table offset ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
+qcow2: Marking image as corrupt: Preventing invalid allocation of L2 table at offset 0; further corruption events will be suppressed
+write failed: Input/output error
*** done
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 06/20] qcow2: Add iotest for an empty refcount table
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (4 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 05/20] qcow2: Add iotest for an image with header.refcount_table_offset " Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 07/20] qcow2: Assert that the crypto header does not overlap other metadata Max Reitz
` (15 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Alberto Garcia
From: Alberto Garcia <berto@igalia.com>
This patch adds a simple iotest in which we try to write to an image
with an empty refcount table (i.e. with all entries set to 0).
This scenario was already handled by the existing consistency checks,
but we add an explicit test case for completeness.
Signed-off-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-id: 7e48b0e2ae1a0a18e0ee303b3045f130feec0474.1509718618.git.berto@igalia.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/060 | 7 +++++++
tests/qemu-iotests/060.out | 6 ++++++
2 files changed, 13 insertions(+)
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index dc5a517673..66a8fa4aea 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -243,6 +243,13 @@ poke_file "$TEST_IMG" "$(($l2_offset+8))" "\x80\x00\x00\x00\x00\x06\x2a\x00"
$QEMU_IO -c "discard 0 64k" -c "read 64k 64k" "$TEST_IMG" | _filter_qemu_io
echo
+echo "=== Testing empty refcount table ==="
+echo
+_make_test_img 64M
+poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
+$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
+
+echo
echo "=== Testing empty refcount table with valid L1 and L2 tables ==="
echo
_make_test_img 64M
diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out
index 98f314c16d..cfd78f87a9 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -182,6 +182,12 @@ discard 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read failed: Input/output error
+=== Testing empty refcount table ===
+
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
+qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with refcount table); further corruption events will be suppressed
+write failed: Input/output error
+
=== Testing empty refcount table with valid L1 and L2 tables ===
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 07/20] qcow2: Assert that the crypto header does not overlap other metadata
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (5 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 06/20] qcow2: Add iotest for an empty refcount table Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 08/20] iotests: Make 030 less flaky Max Reitz
` (14 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Alberto Garcia
From: Alberto Garcia <berto@igalia.com>
The crypto header is initialized only when QEMU is creating a new
image, so there's no chance of this happening on a corrupted image.
If QEMU is really trying to allocate the header overlapping other
existing metadata sections then this is a serious bug in QEMU itself
so let's add an assertion.
Signed-off-by: Alberto Garcia <berto@igalia.com>
Message-id: ae3d77f312fc0c5e0ac2bbd71676c0112eebe2e5.1509718618.git.berto@igalia.com
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/qcow2.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/block/qcow2.c b/block/qcow2.c
index defc1fe49f..b3d66a0e88 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -126,6 +126,7 @@ static ssize_t qcow2_crypto_hdr_init_func(QCryptoBlock *block, size_t headerlen,
/* Zero fill remaining space in cluster so it has predictable
* content in case of future spec changes */
clusterlen = size_to_clusters(s, headerlen) * s->cluster_size;
+ assert(qcow2_pre_write_overlap_check(bs, 0, ret, clusterlen) == 0);
ret = bdrv_pwrite_zeroes(bs->file,
ret + headerlen,
clusterlen - headerlen, 0);
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 08/20] iotests: Make 030 less flaky
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (6 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 07/20] qcow2: Assert that the crypto header does not overlap other metadata Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 09/20] iotests: Add missing 'blkdebug::' in 040 Max Reitz
` (13 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf
This patch fixes two race conditions in 030:
1. The first is in TestENOSPC.test_enospc(). After resuming the job,
querying it to confirm it is no longer paused may fail because in the
meantime it might have completed already. The same was fixed in
TestEIO.test_ignore() already (in commit
2c3b44da07d341557a8203cc509ea07fe3605e11).
2. The second is in TestSetSpeed.test_set_speed_invalid(): Here, a
stream job is started on a drive without any break points, with a
block-job-set-speed invoked subsequently. However, without any break
points, the job might have completed in the meantime (on tmpfs at
least); or it might complete before cancel_and_wait() which expects
the job to still exist. This can be fixed like everywhere else by
pausing the drive (installing break points) before starting the job
and letting cancel_and_wait() resume it.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 20171109203025.27493-2-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/030 | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/tests/qemu-iotests/030 b/tests/qemu-iotests/030
index 18838948fa..457984b8e9 100755
--- a/tests/qemu-iotests/030
+++ b/tests/qemu-iotests/030
@@ -666,6 +666,7 @@ class TestENOSPC(TestErrors):
if event['event'] == 'BLOCK_JOB_ERROR':
self.assert_qmp(event, 'data/device', 'drive0')
self.assert_qmp(event, 'data/operation', 'read')
+ error = True
result = self.vm.qmp('query-block-jobs')
self.assert_qmp(result, 'return[0]/paused', True)
@@ -676,9 +677,11 @@ class TestENOSPC(TestErrors):
self.assert_qmp(result, 'return', {})
result = self.vm.qmp('query-block-jobs')
+ if result == {'return': []}:
+ # Race; likely already finished. Check.
+ continue
self.assert_qmp(result, 'return[0]/paused', False)
self.assert_qmp(result, 'return[0]/io-status', 'ok')
- error = True
elif event['event'] == 'BLOCK_JOB_COMPLETED':
self.assertTrue(error, 'job completed unexpectedly')
self.assert_qmp(event, 'data/type', 'stream')
@@ -792,13 +795,14 @@ class TestSetSpeed(iotests.QMPTestCase):
self.assert_no_active_block_jobs()
+ self.vm.pause_drive('drive0')
result = self.vm.qmp('block-stream', device='drive0')
self.assert_qmp(result, 'return', {})
result = self.vm.qmp('block-job-set-speed', device='drive0', speed=-1)
self.assert_qmp(result, 'error/class', 'GenericError')
- self.cancel_and_wait()
+ self.cancel_and_wait(resume=True)
if __name__ == '__main__':
iotests.main(supported_fmts=['qcow2', 'qed'])
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 09/20] iotests: Add missing 'blkdebug::' in 040
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (7 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 08/20] iotests: Make 030 less flaky Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 10/20] iotests: Make 055 less flaky Max Reitz
` (12 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf
040 tries to invoke pause_drive() on a drive that does not use blkdebug.
Good idea, but let's use blkdebug to make it actually work.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 20171109203025.27493-3-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/040 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qemu-iotests/040 b/tests/qemu-iotests/040
index c284d08796..90b5b4f2ad 100755
--- a/tests/qemu-iotests/040
+++ b/tests/qemu-iotests/040
@@ -289,7 +289,7 @@ class TestSetSpeed(ImageCommitTestCase):
qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % mid_img, test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P 0x1 0 512', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P 0xef 524288 524288', mid_img)
- self.vm = iotests.VM().add_drive(test_img)
+ self.vm = iotests.VM().add_drive('blkdebug::' + test_img)
self.vm.launch()
def tearDown(self):
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 10/20] iotests: Make 055 less flaky
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (8 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 09/20] iotests: Add missing 'blkdebug::' in 040 Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 11/20] iotests: Make 083 " Max Reitz
` (11 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf
First of all, test 055 does a valiant job of invoking pause_drive()
sometimes, but that is worth nothing without blkdebug. So the first
thing to do is to sprinkle a couple of "blkdebug::" in there -- with the
exception of the transaction tests, because the blkdebug break points
make the transaction QMP command hang (which is bad). In that case, we
can get away with throttling the block job that it effectively is
paused.
Then, 055 usually does not pause the drive before starting a block job
that should be cancelled. This means that the backup job might be
completed already before block-job-cancel is invoked; thus making the
test either fail (currently) or moot if cancel_and_wait() ignored this
condition. Fix this by pausing the drive before starting the job.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 20171109203025.27493-4-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/055 | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/tests/qemu-iotests/055 b/tests/qemu-iotests/055
index e1206caf9b..8a5d9fd269 100755
--- a/tests/qemu-iotests/055
+++ b/tests/qemu-iotests/055
@@ -48,7 +48,7 @@ class TestSingleDrive(iotests.QMPTestCase):
def setUp(self):
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(image_len))
- self.vm = iotests.VM().add_drive(test_img)
+ self.vm = iotests.VM().add_drive('blkdebug::' + test_img)
self.vm.add_drive(blockdev_target_img, interface="none")
if iotests.qemu_default_machine == 'pc':
self.vm.add_drive(None, 'media=cdrom', 'ide')
@@ -65,10 +65,11 @@ class TestSingleDrive(iotests.QMPTestCase):
def do_test_cancel(self, cmd, target):
self.assert_no_active_block_jobs()
+ self.vm.pause_drive('drive0')
result = self.vm.qmp(cmd, device='drive0', target=target, sync='full')
self.assert_qmp(result, 'return', {})
- event = self.cancel_and_wait()
+ event = self.cancel_and_wait(resume=True)
self.assert_qmp(event, 'data/type', 'backup')
def test_cancel_drive_backup(self):
@@ -166,7 +167,7 @@ class TestSetSpeed(iotests.QMPTestCase):
def setUp(self):
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(image_len))
- self.vm = iotests.VM().add_drive(test_img)
+ self.vm = iotests.VM().add_drive('blkdebug::' + test_img)
self.vm.add_drive(blockdev_target_img, interface="none")
self.vm.launch()
@@ -246,6 +247,8 @@ class TestSetSpeed(iotests.QMPTestCase):
def test_set_speed_invalid_blockdev_backup(self):
self.do_test_set_speed_invalid('blockdev-backup', 'drive1')
+# Note: We cannot use pause_drive() here, or the transaction command
+# would stall. Instead, we limit the block job speed here.
class TestSingleTransaction(iotests.QMPTestCase):
def setUp(self):
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(image_len))
@@ -271,7 +274,8 @@ class TestSingleTransaction(iotests.QMPTestCase):
'type': cmd,
'data': { 'device': 'drive0',
'target': target,
- 'sync': 'full' },
+ 'sync': 'full',
+ 'speed': 64 * 1024 },
}
])
@@ -289,12 +293,12 @@ class TestSingleTransaction(iotests.QMPTestCase):
def do_test_pause(self, cmd, target, image):
self.assert_no_active_block_jobs()
- self.vm.pause_drive('drive0')
result = self.vm.qmp('transaction', actions=[{
'type': cmd,
'data': { 'device': 'drive0',
'target': target,
- 'sync': 'full' },
+ 'sync': 'full',
+ 'speed': 64 * 1024 },
}
])
self.assert_qmp(result, 'return', {})
@@ -302,7 +306,9 @@ class TestSingleTransaction(iotests.QMPTestCase):
result = self.vm.qmp('block-job-pause', device='drive0')
self.assert_qmp(result, 'return', {})
- self.vm.resume_drive('drive0')
+ result = self.vm.qmp('block-job-set-speed', device='drive0', speed=0)
+ self.assert_qmp(result, 'return', {})
+
self.pause_job('drive0')
result = self.vm.qmp('query-block-jobs')
@@ -461,7 +467,7 @@ class TestDriveCompression(iotests.QMPTestCase):
pass
def do_prepare_drives(self, fmt, args, attach_target):
- self.vm = iotests.VM().add_drive(test_img)
+ self.vm = iotests.VM().add_drive('blkdebug::' + test_img)
qemu_img('create', '-f', fmt, blockdev_target_img,
str(TestDriveCompression.image_len), *args)
@@ -500,10 +506,11 @@ class TestDriveCompression(iotests.QMPTestCase):
self.assert_no_active_block_jobs()
+ self.vm.pause_drive('drive0')
result = self.vm.qmp(cmd, device='drive0', sync='full', compress=True, **args)
self.assert_qmp(result, 'return', {})
- event = self.cancel_and_wait()
+ event = self.cancel_and_wait(resume=True)
self.assert_qmp(event, 'data/type', 'backup')
self.vm.shutdown()
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 11/20] iotests: Make 083 less flaky
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (9 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 10/20] iotests: Make 055 less flaky Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 12/20] iotests: Make 136 " Max Reitz
` (10 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf
083 has (at least) two issues:
1. By launching the nbd-fault-injector in background, it may not be
scheduled until the first grep on its output file is executed.
However, until then, that file may not have been created yet -- so it
either does not exist yet (thus making the grep emit an error), or it
does exist but contains stale data (thus making the rest of the test
case work connect to a wrong address).
Fix this by explicitly overwriting the output file before executing
nbd-fault-injector.
2. The nbd-fault-injector prints things other than "Listening on...".
It also prints a "Closing connection" message from time to time. We
currently invoke sed on the whole file in the hope of it only
containing the "Listening on..." line yet. That hope is sometimes
shattered by the brutal reality of race conditions, so make the sed
script more robust.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Message-id: 20171109203025.27493-5-mreitz@redhat.com
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/083 | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tests/qemu-iotests/083 b/tests/qemu-iotests/083
index 0306f112da..3c1adbf0fb 100755
--- a/tests/qemu-iotests/083
+++ b/tests/qemu-iotests/083
@@ -86,6 +86,7 @@ EOF
rm -f "$TEST_DIR/nbd.sock"
+ echo > "$TEST_DIR/nbd-fault-injector.out"
$PYTHON nbd-fault-injector.py $extra_args "$nbd_addr" "$TEST_DIR/nbd-fault-injector.conf" >"$TEST_DIR/nbd-fault-injector.out" 2>&1 &
# Wait for server to be ready
@@ -94,7 +95,8 @@ EOF
done
# Extract the final address (port number has now been assigned in tcp case)
- nbd_addr=$(sed 's/Listening on \(.*\)$/\1/' "$TEST_DIR/nbd-fault-injector.out")
+ nbd_addr=$(sed -n 's/^Listening on //p' \
+ "$TEST_DIR/nbd-fault-injector.out")
if [ "$proto" = "tcp" ]; then
nbd_url="nbd+tcp://$nbd_addr/$export_name"
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 12/20] iotests: Make 136 less flaky
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (10 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 11/20] iotests: Make 083 " Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 13/20] iotests: Use new-style NBD connections Max Reitz
` (9 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf
136 executes some AIO requests without a final aio_flush; then it
advances the virtual clock and thus expects the last access time of the
device to be less than the current time when queried (i.e. idle_time_ns
to be greater than 0). However, without the aio_flush, some requests
may be settled after the clock_step invocation. In that case,
idle_time_ns would be 0 and the test fails.
Fix this by adding an aio_flush if any AIO request other than some other
aio_flush has been executed.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 20171109203025.27493-6-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/136 | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/tests/qemu-iotests/136 b/tests/qemu-iotests/136
index 4b994897af..88b97ea7c6 100644
--- a/tests/qemu-iotests/136
+++ b/tests/qemu-iotests/136
@@ -238,6 +238,18 @@ sector = "%d"
for i in range(failed_wr_ops):
ops.append("aio_write %d 512" % bad_offset)
+ # We need an extra aio_flush to settle all outstanding AIO
+ # operations before we can advance the virtual clock, so that
+ # the last access happens before clock_step and idle_time_ns
+ # will be greater than 0
+ extra_flush = 0
+ if rd_ops + wr_ops + invalid_rd_ops + invalid_wr_ops + \
+ failed_rd_ops + failed_wr_ops > 0:
+ extra_flush = 1
+
+ if extra_flush > 0:
+ ops.append("aio_flush")
+
if failed_wr_ops > 0:
highest_offset = max(highest_offset, bad_offset + 512)
@@ -251,7 +263,7 @@ sector = "%d"
self.total_wr_bytes += wr_ops * wr_size
self.total_wr_ops += wr_ops
self.total_wr_merged += wr_merged
- self.total_flush_ops += flush_ops
+ self.total_flush_ops += flush_ops + extra_flush
self.invalid_rd_ops += invalid_rd_ops
self.invalid_wr_ops += invalid_wr_ops
self.failed_rd_ops += failed_rd_ops
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 13/20] iotests: Use new-style NBD connections
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (11 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 12/20] iotests: Make 136 " Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 14/20] qcow2: Check that corrupted images can be repaired in iotest 060 Max Reitz
` (8 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Eric Blake
From: Eric Blake <eblake@redhat.com>
Old-style NBD is deprecated upstream (it is documented, but no
longer implemented in the reference implementation), and it is
severely limited (it cannot support structured replies, which
means it cannot support efficient handling of zeroes), when
compared to new-style NBD. We are better off having our iotests
favor new-style everywhere (although some explicit tests,
particularly 83, still cover old-style for back-compat reasons);
this is as simple as supplying the empty string as the default
export name, as it does not change the URI needed to connect a
client to the server. This also gives us more coverage of the
just-added structured reply code, when not overriding $QEMU_NBD
to intentionally point to an older server.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-id: 20171109221216.10248-1-eblake@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/common.rc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
index 0e8a33c696..dbae7d74ba 100644
--- a/tests/qemu-iotests/common.rc
+++ b/tests/qemu-iotests/common.rc
@@ -242,7 +242,7 @@ _make_test_img()
if [ $IMGPROTO = "nbd" ]; then
# Pass a sufficiently high number to -e that should be enough for all
# tests
- eval "$QEMU_NBD -v -t -b 127.0.0.1 -p 10810 -f $IMGFMT -e 42 $TEST_IMG_FILE >/dev/null &"
+ eval "$QEMU_NBD -v -t -b 127.0.0.1 -p 10810 -f $IMGFMT -e 42 -x '' $TEST_IMG_FILE >/dev/null &"
sleep 1 # FIXME: qemu-nbd needs to be listening before we continue
fi
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 14/20] qcow2: Check that corrupted images can be repaired in iotest 060
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (12 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 13/20] iotests: Use new-style NBD connections Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 15/20] block/snapshot: dirty all dirty bitmaps on snapshot-switch Max Reitz
` (7 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Alberto Garcia
From: Alberto Garcia <berto@igalia.com>
We just fixed a few bugs that caused QEMU to crash when trying to
write to corrupted qcow2 images, and iotest 060 was expanded to test
all those scenarios.
In almost all cases the corrupted images can be repaired using
qemu-img, so this patch verifies that.
Signed-off-by: Alberto Garcia <berto@igalia.com>
Message-id: 0b1b95340ecdfbc6927e36adf2fd42ae6198747a.1510143008.git.berto@igalia.com
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/060 | 10 ++++++++
tests/qemu-iotests/060.out | 64 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 74 insertions(+)
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
index 66a8fa4aea..fae08b03bf 100755
--- a/tests/qemu-iotests/060
+++ b/tests/qemu-iotests/060
@@ -248,6 +248,8 @@ echo
_make_test_img 64M
poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
+# Repair the image
+_check_test_img -r all
echo
echo "=== Testing empty refcount table with valid L1 and L2 tables ==="
@@ -259,6 +261,8 @@ poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
# allocation with an explicit offset (using qcow2_alloc_clusters_at())
# causing a refcount block to be allocated at offset 0
$QEMU_IO -c "write 0 128k" "$TEST_IMG" | _filter_qemu_io
+# Repair the image
+_check_test_img -r all
echo
echo "=== Testing empty refcount block ==="
@@ -266,6 +270,8 @@ echo
_make_test_img 64M
poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
+# Repair the image
+_check_test_img -r all
echo
echo "=== Testing empty refcount block with compressed write ==="
@@ -276,6 +282,8 @@ poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
# The previous write already allocated an L2 table, so now this new
# write will try to allocate a compressed data cluster at offset 0.
$QEMU_IO -c "write -c 0k 64k" "$TEST_IMG" | _filter_qemu_io
+# Repair the image
+_check_test_img -r all
echo
echo "=== Testing zero refcount table size ==="
@@ -283,6 +291,8 @@ echo
_make_test_img 64M
poke_file "$TEST_IMG" "56" "\x00\x00\x00\x00"
$QEMU_IO -c "write 0 64k" "$TEST_IMG" 2>&1 | _filter_testdir | _filter_imgfmt
+# Repair the image
+_check_test_img -r all
echo
echo "=== Testing incorrect refcount table offset ==="
diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out
index cfd78f87a9..62c22701b8 100644
--- a/tests/qemu-iotests/060.out
+++ b/tests/qemu-iotests/060.out
@@ -187,6 +187,18 @@ read failed: Input/output error
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with refcount table); further corruption events will be suppressed
write failed: Input/output error
+ERROR cluster 0 refcount=0 reference=1
+ERROR cluster 1 refcount=0 reference=1
+ERROR cluster 3 refcount=0 reference=1
+Rebuilding refcount structure
+Repairing cluster 1 refcount=1 reference=0
+The following inconsistencies were found and repaired:
+
+ 0 leaked clusters
+ 3 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
=== Testing empty refcount table with valid L1 and L2 tables ===
@@ -195,12 +207,40 @@ wrote 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
qcow2: Marking image as corrupt: Preventing invalid allocation of refcount block at offset 0; further corruption events will be suppressed
write failed: Input/output error
+ERROR cluster 0 refcount=0 reference=1
+ERROR cluster 1 refcount=0 reference=1
+ERROR cluster 3 refcount=0 reference=1
+ERROR cluster 4 refcount=0 reference=1
+ERROR cluster 5 refcount=0 reference=1
+Rebuilding refcount structure
+Repairing cluster 1 refcount=1 reference=0
+The following inconsistencies were found and repaired:
+
+ 0 leaked clusters
+ 5 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
=== Testing empty refcount block ===
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
qcow2: Marking image as corrupt: Preventing invalid allocation of L2 table at offset 0; further corruption events will be suppressed
write failed: Input/output error
+ERROR cluster 0 refcount=0 reference=1
+ERROR cluster 1 refcount=0 reference=1
+ERROR cluster 2 refcount=0 reference=1
+ERROR cluster 3 refcount=0 reference=1
+Rebuilding refcount structure
+Repairing cluster 1 refcount=1 reference=0
+Repairing cluster 2 refcount=1 reference=0
+The following inconsistencies were found and repaired:
+
+ 0 leaked clusters
+ 4 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
=== Testing empty refcount block with compressed write ===
@@ -209,11 +249,35 @@ wrote 65536/65536 bytes at offset 65536
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
qcow2: Marking image as corrupt: Preventing invalid allocation of compressed cluster at offset 0; further corruption events will be suppressed
write failed: Input/output error
+ERROR cluster 0 refcount=0 reference=1
+ERROR cluster 1 refcount=0 reference=1
+ERROR cluster 2 refcount=0 reference=1
+ERROR cluster 3 refcount=0 reference=1
+Rebuilding refcount structure
+Repairing cluster 1 refcount=1 reference=0
+Repairing cluster 2 refcount=1 reference=0
+The following inconsistencies were found and repaired:
+
+ 0 leaked clusters
+ 4 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
=== Testing zero refcount table size ===
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
can't open device TEST_DIR/t.IMGFMT: Image does not contain a reference count table
+ERROR cluster 0 refcount=0 reference=1
+ERROR cluster 3 refcount=0 reference=1
+Rebuilding refcount structure
+The following inconsistencies were found and repaired:
+
+ 0 leaked clusters
+ 2 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
=== Testing incorrect refcount table offset ===
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 15/20] block/snapshot: dirty all dirty bitmaps on snapshot-switch
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (13 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 14/20] qcow2: Check that corrupted images can be repaired in iotest 060 Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 16/20] iotests: 077: Filter out 'resume' lines Max Reitz
` (6 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf,
Vladimir Sementsov-Ogievskiy
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Snapshot-switch actually changes active state of disk so it should
reflect on dirty bitmaps. Otherwise next incremental backup using
these bitmaps will be invalid.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-id: 20171023092945.54532-1-vsementsov@virtuozzo.com
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/snapshot.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/block/snapshot.c b/block/snapshot.c
index a46564e7b7..1d5ab5f90f 100644
--- a/block/snapshot.c
+++ b/block/snapshot.c
@@ -181,10 +181,24 @@ int bdrv_snapshot_goto(BlockDriverState *bs,
{
BlockDriver *drv = bs->drv;
int ret, open_ret;
+ int64_t len;
if (!drv) {
return -ENOMEDIUM;
}
+
+ len = bdrv_getlength(bs);
+ if (len < 0) {
+ return len;
+ }
+ /* We should set all bits in all enabled dirty bitmaps, because dirty
+ * bitmaps reflect active state of disk and snapshot switch operation
+ * actually dirties active state.
+ * TODO: It may make sense not to set all bits but analyze block status of
+ * current state and destination snapshot and do not set bits corresponding
+ * to both-zero or both-unallocated areas. */
+ bdrv_set_dirty(bs, 0, len);
+
if (drv->bdrv_snapshot_goto) {
return drv->bdrv_snapshot_goto(bs, snapshot_id);
}
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 16/20] iotests: 077: Filter out 'resume' lines
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (14 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 15/20] block/snapshot: dirty all dirty bitmaps on snapshot-switch Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 17/20] block/vhdx.c: Don't blindly update the header Max Reitz
` (5 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Fam Zheng
From: Fam Zheng <famz@redhat.com>
In the "Overlapping multiple requests" cases, the 3rd reqs (the break
point B) doesn't wait for the 2nd, and once resumed the I/O will just
continue. This is because the 2nd is already waiting for the 1st, and
in wait_serialising_requests() there is:
/* If the request is already (indirectly) waiting for us, or
* will wait for us as soon as it wakes up, then just go on
* (instead of producing a deadlock in the former case). */
if (!req->waiting_for) {
/* actually break */
...
}
Consequently, the following "sleep 100; resume A" command races with the
completion of that request, and sometimes results in an unexpected
order of output:
> @@ -56,9 +56,9 @@
> wrote XXX/XXX bytes at offset XXX
> XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> blkdebug: Resuming request 'B'
> +blkdebug: Resuming request 'A'
> wrote XXX/XXX bytes at offset XXX
> XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -blkdebug: Resuming request 'A'
> wrote XXX/XXX bytes at offset XXX
> XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> wrote XXX/XXX bytes at offset XXX
Filter out the "Resuming request" lines to make the output
deterministic.
Reported-by: Patchew <no-reply@patchew.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
Message-id: 20171113150026.4743-1-famz@redhat.com
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/077 | 3 ++-
tests/qemu-iotests/077.out | 16 ----------------
2 files changed, 2 insertions(+), 17 deletions(-)
diff --git a/tests/qemu-iotests/077 b/tests/qemu-iotests/077
index d2d2a2d687..b3c6fb1370 100755
--- a/tests/qemu-iotests/077
+++ b/tests/qemu-iotests/077
@@ -188,7 +188,8 @@ EOF
test_io | $QEMU_IO | _filter_qemu_io | \
sed -e 's,[0-9/]* bytes at offset [0-9]*,XXX/XXX bytes at offset XXX,g' \
-e 's/^[0-9]* \(bytes\|KiB\)/XXX bytes/' \
- -e '/Suspended/d'
+ -e '/Suspended/d' \
+ -e '/blkdebug: Resuming request/d'
echo
echo "== Verify image content =="
diff --git a/tests/qemu-iotests/077.out b/tests/qemu-iotests/077.out
index 16f951fd3d..4aae82f2e2 100644
--- a/tests/qemu-iotests/077.out
+++ b/tests/qemu-iotests/077.out
@@ -4,17 +4,14 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
== Some concurrent requests involving RMW ==
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
@@ -31,51 +28,38 @@ wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'B'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'B'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'B'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'B'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
-blkdebug: Resuming request 'C'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'B'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-blkdebug: Resuming request 'A'
wrote XXX/XXX bytes at offset XXX
XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote XXX/XXX bytes at offset XXX
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 17/20] block/vhdx.c: Don't blindly update the header
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (15 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 16/20] iotests: 077: Filter out 'resume' lines Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 18/20] block/parallels: Do not update header or truncate image when INMIGRATE Max Reitz
` (4 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Jeff Cody
From: Jeff Cody <jcody@redhat.com>
The VHDX specification requires that before user data modification of
the vhdx image, the VHDX header file and data GUIDs need to be updated.
In vhdx_open(), if the image is set to RDWR, we go ahead and update the
header.
However, just because the image is set to RDWR does not mean we can go
ahead and write at this point - specifically, if the QEMU run state is
INMIGRATE, the underlying file BS may be set to inactive via the BDS
open flag of BDRV_O_INACTIVE. Attempting to write under this condition
will cause an assert in bdrv_co_pwritev().
We can alternatively latch the first time the image is written. And lo
and behold, we do just that, via vhdx_user_visible_write() in
vhdx_co_writev(). This means the call to vhdx_update_headers() in
vhdx_open() is likely just vestigial, and can be removed.
Reported-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Jeff Cody <jcody@redhat.com>
Message-id: 659e4cdba6ef4c651737852777c8c93d27b38040.1510059970.git.jcody@redhat.com
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/vhdx.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/block/vhdx.c b/block/vhdx.c
index 7ae4589879..9956933da6 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -1008,13 +1008,6 @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
goto fail;
}
- if (flags & BDRV_O_RDWR) {
- ret = vhdx_update_headers(bs, s, false, NULL);
- if (ret < 0) {
- goto fail;
- }
- }
-
/* TODO: differencing files */
return 0;
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 18/20] block/parallels: Do not update header or truncate image when INMIGRATE
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (16 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 17/20] block/vhdx.c: Don't blindly update the header Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 19/20] block/parallels: add migration blocker Max Reitz
` (3 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Jeff Cody
From: Jeff Cody <jcody@redhat.com>
If we write or modify the image file while the QEMU run state is
INMIGRATE, then the BDRV_O_INACTIVE BDS flag is set. This will cause
an assert, since the image is marked inactive. Make sure we obey this
flag.
Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Jeff Cody <jcody@redhat.com>
Message-id: 3996c930fa8cde8570b7a63032720d76a28fd78b.1510059970.git.jcody@redhat.com
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/parallels.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/block/parallels.c b/block/parallels.c
index 2b6c6e5709..7b7a3efa1d 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -708,7 +708,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
s->prealloc_mode = PRL_PREALLOC_MODE_FALLOCATE;
}
- if (flags & BDRV_O_RDWR) {
+ if ((flags & BDRV_O_RDWR) && !(flags & BDRV_O_INACTIVE)) {
s->header->inuse = cpu_to_le32(HEADER_INUSE_MAGIC);
ret = parallels_update_header(bs);
if (ret < 0) {
@@ -741,12 +741,9 @@ static void parallels_close(BlockDriverState *bs)
{
BDRVParallelsState *s = bs->opaque;
- if (bs->open_flags & BDRV_O_RDWR) {
+ if ((bs->open_flags & BDRV_O_RDWR) && !(bs->open_flags & BDRV_O_INACTIVE)) {
s->header->inuse = 0;
parallels_update_header(bs);
- }
-
- if (bs->open_flags & BDRV_O_RDWR) {
bdrv_truncate(bs->file, s->data_end << BDRV_SECTOR_BITS,
PREALLOC_MODE_OFF, NULL);
}
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 19/20] block/parallels: add migration blocker
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (17 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 18/20] block/parallels: Do not update header or truncate image when INMIGRATE Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 20/20] qemu-iotests: update unsupported image formats in 194 Max Reitz
` (2 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Jeff Cody
From: Jeff Cody <jcody@redhat.com>
Migration does not work for parallels, and has been broken for a while
(see patch 'block/parallels: Do not update header or truncate image when
INMIGRATE'). The bdrv_invalidate_cache() method needs to be added for
migration to be supported. Until this is done, prohibit migration.
Signed-off-by: Jeff Cody <jcody@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Message-id: 5e04a7c8a3089913fa58d484af42dab7993984ad.1510059970.git.jcody@redhat.com
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/parallels.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/block/parallels.c b/block/parallels.c
index 7b7a3efa1d..9545761f49 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -35,6 +35,7 @@
#include "qemu/module.h"
#include "qemu/bswap.h"
#include "qemu/bitmap.h"
+#include "migration/blocker.h"
/**************************************************************/
@@ -100,6 +101,7 @@ typedef struct BDRVParallelsState {
unsigned int tracks;
unsigned int off_multiplier;
+ Error *migration_blocker;
} BDRVParallelsState;
@@ -720,6 +722,16 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
s->bat_dirty_bmap =
bitmap_new(DIV_ROUND_UP(s->header_size, s->bat_dirty_block));
+ /* Disable migration until bdrv_invalidate_cache method is added */
+ error_setg(&s->migration_blocker, "The Parallels format used by node '%s' "
+ "does not support live migration",
+ bdrv_get_device_or_node_name(bs));
+ ret = migrate_add_blocker(s->migration_blocker, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ error_free(s->migration_blocker);
+ goto fail;
+ }
qemu_co_mutex_init(&s->lock);
return 0;
@@ -750,6 +762,9 @@ static void parallels_close(BlockDriverState *bs)
g_free(s->bat_dirty_bmap);
qemu_vfree(s->header);
+
+ migrate_del_blocker(s->migration_blocker);
+ error_free(s->migration_blocker);
}
static QemuOptsList parallels_create_opts = {
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PULL 20/20] qemu-iotests: update unsupported image formats in 194
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (18 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 19/20] block/parallels: add migration blocker Max Reitz
@ 2017-11-14 17:24 ` Max Reitz
2017-11-14 17:28 ` [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Peter Maydell
2017-11-14 18:30 ` Peter Maydell
21 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:24 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Max Reitz, Peter Maydell, Kevin Wolf, Jeff Cody
From: Jeff Cody <jcody@redhat.com>
Test 194 checks for 'luks' to exclude as an unsupported format,
However, most formats are unsupported, due to migration blockers.
Rather than specifying a blacklist of unsupported formats, whitelist
supported formats (specifically, qcow2, qed, raw, dmg).
Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Jeff Cody <jcody@redhat.com>
Message-id: 23ca18c7f843c86a28b1529ca9ac6db4b35ca0e4.1510059970.git.jcody@redhat.com
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
tests/qemu-iotests/194 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qemu-iotests/194 b/tests/qemu-iotests/194
index 8d973b440f..1d4214aca3 100755
--- a/tests/qemu-iotests/194
+++ b/tests/qemu-iotests/194
@@ -21,7 +21,7 @@
import iotests
-iotests.verify_image_format(unsupported_fmts=['luks'])
+iotests.verify_image_format(supported_fmts=['qcow2', 'qed', 'raw', 'dmg'])
iotests.verify_platform(['linux'])
with iotests.FilePath('source.img') as source_img_path, \
--
2.13.6
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (19 preceding siblings ...)
2017-11-14 17:24 ` [Qemu-devel] [PULL 20/20] qemu-iotests: update unsupported image formats in 194 Max Reitz
@ 2017-11-14 17:28 ` Peter Maydell
2017-11-14 17:31 ` Max Reitz
2017-11-14 18:30 ` Peter Maydell
21 siblings, 1 reply; 24+ messages in thread
From: Peter Maydell @ 2017-11-14 17:28 UTC (permalink / raw)
To: Max Reitz; +Cc: Qemu-block, QEMU Developers, Kevin Wolf
On 14 November 2017 at 17:23, Max Reitz <mreitz@redhat.com> wrote:
> The following changes since commit 191b5fbfa66e5b23e2150f3c6981d30eb84418a9:
>
> Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2017-11-14 16:11:19 +0000)
>
> are available in the git repository at:
>
> git://github.com/XanClic/qemu.git tags/pull-block-2017-11-14
>
> for you to fetch changes up to 8b2d7c364d9a2491f7501f6688cd722045cf808a:
>
> qemu-iotests: update unsupported image formats in 194 (2017-11-14 18:06:26 +0100)
>
I can probably squeeze this into rc1, but 17:30 GMT on rc day is at least
an hour later than you can reasonably rely on being able to get a pull
request into the rc....
thanks
-- PMM
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1
2017-11-14 17:28 ` [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Peter Maydell
@ 2017-11-14 17:31 ` Max Reitz
0 siblings, 0 replies; 24+ messages in thread
From: Max Reitz @ 2017-11-14 17:31 UTC (permalink / raw)
To: Peter Maydell; +Cc: Qemu-block, QEMU Developers, Kevin Wolf
[-- Attachment #1: Type: text/plain, Size: 1137 bytes --]
On 2017-11-14 18:28, Peter Maydell wrote:
> On 14 November 2017 at 17:23, Max Reitz <mreitz@redhat.com> wrote:
>> The following changes since commit 191b5fbfa66e5b23e2150f3c6981d30eb84418a9:
>>
>> Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2017-11-14 16:11:19 +0000)
>>
>> are available in the git repository at:
>>
>> git://github.com/XanClic/qemu.git tags/pull-block-2017-11-14
>>
>> for you to fetch changes up to 8b2d7c364d9a2491f7501f6688cd722045cf808a:
>>
>> qemu-iotests: update unsupported image formats in 194 (2017-11-14 18:06:26 +0100)
>>
>
> I can probably squeeze this into rc1, but 17:30 GMT on rc day is at least
> an hour later than you can reasonably rely on being able to get a pull
> request into the rc....
Sorry, I understand.
(I got two errors when testing the build, so I had to debug them and
drop a series -- which is one reason why it got delayed so much. The
other is that I wanted to see if Kevin would be around today so that he
could do a combined pull request.)
I promise to do my build testing earlier next time...
Max
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 512 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
` (20 preceding siblings ...)
2017-11-14 17:28 ` [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Peter Maydell
@ 2017-11-14 18:30 ` Peter Maydell
21 siblings, 0 replies; 24+ messages in thread
From: Peter Maydell @ 2017-11-14 18:30 UTC (permalink / raw)
To: Max Reitz; +Cc: Qemu-block, QEMU Developers, Kevin Wolf
On 14 November 2017 at 17:23, Max Reitz <mreitz@redhat.com> wrote:
> The following changes since commit 191b5fbfa66e5b23e2150f3c6981d30eb84418a9:
>
> Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2017-11-14 16:11:19 +0000)
>
> are available in the git repository at:
>
> git://github.com/XanClic/qemu.git tags/pull-block-2017-11-14
>
> for you to fetch changes up to 8b2d7c364d9a2491f7501f6688cd722045cf808a:
>
> qemu-iotests: update unsupported image formats in 194 (2017-11-14 18:06:26 +0100)
>
> ----------------------------------------------------------------
> Block patches for 2.11.0-rc1
Applied, thanks.
-- PMM
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2017-11-14 18:30 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-14 17:23 [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Max Reitz
2017-11-14 17:23 ` [Qemu-devel] [PULL 01/20] qcow2: Prevent allocating refcount blocks at offset 0 Max Reitz
2017-11-14 17:23 ` [Qemu-devel] [PULL 02/20] qcow2: Prevent allocating L2 tables " Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 03/20] qcow2: Prevent allocating compressed clusters " Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 04/20] qcow2: Don't open images with header.refcount_table_clusters == 0 Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 05/20] qcow2: Add iotest for an image with header.refcount_table_offset " Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 06/20] qcow2: Add iotest for an empty refcount table Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 07/20] qcow2: Assert that the crypto header does not overlap other metadata Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 08/20] iotests: Make 030 less flaky Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 09/20] iotests: Add missing 'blkdebug::' in 040 Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 10/20] iotests: Make 055 less flaky Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 11/20] iotests: Make 083 " Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 12/20] iotests: Make 136 " Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 13/20] iotests: Use new-style NBD connections Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 14/20] qcow2: Check that corrupted images can be repaired in iotest 060 Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 15/20] block/snapshot: dirty all dirty bitmaps on snapshot-switch Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 16/20] iotests: 077: Filter out 'resume' lines Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 17/20] block/vhdx.c: Don't blindly update the header Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 18/20] block/parallels: Do not update header or truncate image when INMIGRATE Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 19/20] block/parallels: add migration blocker Max Reitz
2017-11-14 17:24 ` [Qemu-devel] [PULL 20/20] qemu-iotests: update unsupported image formats in 194 Max Reitz
2017-11-14 17:28 ` [Qemu-devel] [PULL 00/20] Block patches for 2.11.0-rc1 Peter Maydell
2017-11-14 17:31 ` Max Reitz
2017-11-14 18:30 ` Peter Maydell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).