* [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity
@ 2016-04-20 14:32 Kevin Wolf
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk Kevin Wolf
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Kevin Wolf @ 2016-04-20 14:32 UTC (permalink / raw)
To: qemu-block; +Cc: kwolf, famz, mreitz, jcody, qemu-devel
Taking over Fam's series as we're late for -rc3. Original cover letter:
This fixes the bug introduced in e5b43573e28 and lately noticed by Kevin.
v2: Move the mirror_clip_sectors() to mirror_iteration. [Max]
v3: Fix nb_clusters calculation and add a test case for it [Kevin]
Fam Zheng (3):
mirror: Don't extend the last sub-chunk
iotests: Add iotests.image_size
iotests: Test case for drive-mirror with unaligned image size
block/mirror.c | 19 ++++++++++---
tests/qemu-iotests/109.out | 44 +++++++++++++++---------------
tests/qemu-iotests/152 | 62 +++++++++++++++++++++++++++++++++++++++++++
tests/qemu-iotests/152.out | 5 ++++
tests/qemu-iotests/group | 1 +
tests/qemu-iotests/iotests.py | 6 +++++
6 files changed, 111 insertions(+), 26 deletions(-)
create mode 100644 tests/qemu-iotests/152
create mode 100644 tests/qemu-iotests/152.out
--
1.8.3.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk
2016-04-20 14:32 [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Kevin Wolf
@ 2016-04-20 14:32 ` Kevin Wolf
2016-04-20 14:46 ` Max Reitz
2016-04-20 14:47 ` Jeff Cody
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 2/3] iotests: Add iotests.image_size Kevin Wolf
` (3 subsequent siblings)
4 siblings, 2 replies; 12+ messages in thread
From: Kevin Wolf @ 2016-04-20 14:32 UTC (permalink / raw)
To: qemu-block; +Cc: kwolf, famz, mreitz, jcody, qemu-devel
From: Fam Zheng <famz@redhat.com>
The last sub-chunk is rounded up to the copy granularity in the target
image, resulting in a larger size than the source.
Add a function to clip the copied sectors to the end.
This undoes the "wrong" changes to tests/qemu-iotests/109.out in
e5b43573e28. The remaining two offset changes are okay.
[ kwolf: Use DIV_ROUND_UP to calculate nb_chunks now ]
Reported-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/mirror.c | 19 +++++++++++++++----
tests/qemu-iotests/109.out | 44 ++++++++++++++++++++++----------------------
2 files changed, 37 insertions(+), 26 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index 9df1fae..d56e30e 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -108,7 +108,7 @@ static void mirror_iteration_done(MirrorOp *op, int ret)
sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
chunk_num = op->sector_num / sectors_per_chunk;
- nb_chunks = op->nb_sectors / sectors_per_chunk;
+ nb_chunks = DIV_ROUND_UP(op->nb_sectors, sectors_per_chunk);
bitmap_clear(s->in_flight_bitmap, chunk_num, nb_chunks);
if (ret >= 0) {
if (s->cow_bitmap) {
@@ -161,6 +161,14 @@ static void mirror_read_complete(void *opaque, int ret)
mirror_write_complete, op);
}
+static inline void mirror_clip_sectors(MirrorBlockJob *s,
+ int64_t sector_num,
+ int *nb_sectors)
+{
+ *nb_sectors = MIN(*nb_sectors,
+ s->bdev_length / BDRV_SECTOR_SIZE - sector_num);
+}
+
/* Round sector_num and/or nb_sectors to target cluster if COW is needed, and
* return the offset of the adjusted tail sector against original. */
static int mirror_cow_align(MirrorBlockJob *s,
@@ -189,6 +197,9 @@ static int mirror_cow_align(MirrorBlockJob *s,
s->target_cluster_sectors);
}
}
+ /* Clipping may result in align_nb_sectors unaligned to chunk boundary, but
+ * that doesn't matter because it's already the end of source image. */
+ mirror_clip_sectors(s, align_sector_num, &align_nb_sectors);
ret = align_sector_num + align_nb_sectors - (*sector_num + *nb_sectors);
*sector_num = align_sector_num;
@@ -231,9 +242,8 @@ static int mirror_do_read(MirrorBlockJob *s, int64_t sector_num,
/* The sector range must meet granularity because:
* 1) Caller passes in aligned values;
* 2) mirror_cow_align is used only when target cluster is larger. */
- assert(!(nb_sectors % sectors_per_chunk));
assert(!(sector_num % sectors_per_chunk));
- nb_chunks = nb_sectors / sectors_per_chunk;
+ nb_chunks = DIV_ROUND_UP(nb_sectors, sectors_per_chunk);
while (s->buf_free_count < nb_chunks) {
trace_mirror_yield_in_flight(s, sector_num, s->in_flight);
@@ -384,6 +394,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
}
}
+ mirror_clip_sectors(s, sector_num, &io_sectors);
switch (mirror_method) {
case MIRROR_METHOD_COPY:
io_sectors = mirror_do_read(s, sector_num, io_sectors);
@@ -399,7 +410,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
}
assert(io_sectors);
sector_num += io_sectors;
- nb_chunks -= io_sectors / sectors_per_chunk;
+ nb_chunks -= DIV_ROUND_UP(io_sectors, sectors_per_chunk);
delay_ns += ratelimit_calculate_delay(&s->limit, io_sectors);
}
return delay_ns;
diff --git a/tests/qemu-iotests/109.out b/tests/qemu-iotests/109.out
index b3358de..38bc073 100644
--- a/tests/qemu-iotests/109.out
+++ b/tests/qemu-iotests/109.out
@@ -10,14 +10,14 @@ Automatically detecting the format is dangerous for raw images, write operations
Specify the 'raw' format explicitly to remove the restrictions.
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 1024, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
{"return": []}
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": {}}
{"return": {}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
-{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 1024, "offset": 1024, "speed": 0, "type": "mirror"}}
+{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 1024, "offset": 1024, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
Warning: Image size mismatch!
Images are identical.
@@ -31,14 +31,14 @@ Automatically detecting the format is dangerous for raw images, write operations
Specify the 'raw' format explicitly to remove the restrictions.
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 262144, "offset": 65536, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 197120, "offset": 512, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
{"return": []}
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": {}}
{"return": {}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 262144, "offset": 262144, "speed": 0, "type": "mirror"}}
-{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 262144, "offset": 262144, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 197120, "offset": 197120, "speed": 0, "type": "mirror"}}
+{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 197120, "offset": 197120, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
Warning: Image size mismatch!
Images are identical.
@@ -73,14 +73,14 @@ Automatically detecting the format is dangerous for raw images, write operations
Specify the 'raw' format explicitly to remove the restrictions.
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 1024, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
{"return": []}
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": {}}
{"return": {}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
-{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 1024, "offset": 1024, "speed": 0, "type": "mirror"}}
+{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 1024, "offset": 1024, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
Warning: Image size mismatch!
Images are identical.
@@ -115,14 +115,14 @@ Automatically detecting the format is dangerous for raw images, write operations
Specify the 'raw' format explicitly to remove the restrictions.
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 2560, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
{"return": []}
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": {}}
{"return": {}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
-{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 2560, "offset": 2560, "speed": 0, "type": "mirror"}}
+{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 2560, "offset": 2560, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
Warning: Image size mismatch!
Images are identical.
@@ -135,14 +135,14 @@ Automatically detecting the format is dangerous for raw images, write operations
Specify the 'raw' format explicitly to remove the restrictions.
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 2560, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
{"return": []}
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": {}}
{"return": {}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
-{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 2560, "offset": 2560, "speed": 0, "type": "mirror"}}
+{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 2560, "offset": 2560, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
Image resized.
Warning: Image size mismatch!
Images are identical.
@@ -198,14 +198,14 @@ Automatically detecting the format is dangerous for raw images, write operations
Specify the 'raw' format explicitly to remove the restrictions.
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 2048, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
{"return": []}
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
{"return": {}}
{"return": {}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
-{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 2048, "offset": 2048, "speed": 0, "type": "mirror"}}
+{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 2048, "offset": 2048, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
Image resized.
Warning: Image size mismatch!
Images are identical.
@@ -218,14 +218,14 @@ WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
{"return": {}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
-{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 512, "offset": 512, "speed": 0, "type": "mirror"}}
+{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 512, "offset": 512, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
Warning: Image size mismatch!
Images are identical.
{"return": {}}
{"return": {}}
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
-{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 512, "offset": 512, "speed": 0, "type": "mirror"}}
+{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 512, "offset": 512, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
Warning: Image size mismatch!
Images are identical.
*** done
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH for-2.6 v3 2/3] iotests: Add iotests.image_size
2016-04-20 14:32 [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Kevin Wolf
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk Kevin Wolf
@ 2016-04-20 14:32 ` Kevin Wolf
2016-04-20 14:48 ` Jeff Cody
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 3/3] iotests: Test case for drive-mirror with unaligned image size Kevin Wolf
` (2 subsequent siblings)
4 siblings, 1 reply; 12+ messages in thread
From: Kevin Wolf @ 2016-04-20 14:32 UTC (permalink / raw)
To: qemu-block; +Cc: kwolf, famz, mreitz, jcody, qemu-devel
From: Fam Zheng <famz@redhat.com>
This retrieves the virtual size of the image out of qemu-img info.
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
tests/qemu-iotests/iotests.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index d9ef60e..56f988a 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -28,6 +28,7 @@ sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'scripts', '
import qmp
import qtest
import struct
+import json
# This will not work if arguments contain spaces but is necessary if we
@@ -103,6 +104,11 @@ def create_image(name, size):
i = i + 512
file.close()
+def image_size(img):
+ '''Return image's virtual size'''
+ r = qemu_img_pipe('info', '--output=json', '-f', imgfmt, img)
+ return json.loads(r)['virtual-size']
+
test_dir_re = re.compile(r"%s" % test_dir)
def filter_test_dir(msg):
return test_dir_re.sub("TEST_DIR", msg)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH for-2.6 v3 3/3] iotests: Test case for drive-mirror with unaligned image size
2016-04-20 14:32 [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Kevin Wolf
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk Kevin Wolf
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 2/3] iotests: Add iotests.image_size Kevin Wolf
@ 2016-04-20 14:32 ` Kevin Wolf
2016-04-20 14:49 ` Max Reitz
2016-04-20 14:50 ` Jeff Cody
2016-04-20 14:51 ` [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Jeff Cody
2016-04-21 2:12 ` Fam Zheng
4 siblings, 2 replies; 12+ messages in thread
From: Kevin Wolf @ 2016-04-20 14:32 UTC (permalink / raw)
To: qemu-block; +Cc: kwolf, famz, mreitz, jcody, qemu-devel
From: Fam Zheng <famz@redhat.com>
This is the regression test for the virtual size mismatch issue between
target and source images.
[ kwolf: Added test_unaligned_with_update ]
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
tests/qemu-iotests/152 | 62 ++++++++++++++++++++++++++++++++++++++++++++++
tests/qemu-iotests/152.out | 5 ++++
tests/qemu-iotests/group | 1 +
3 files changed, 68 insertions(+)
create mode 100644 tests/qemu-iotests/152
create mode 100644 tests/qemu-iotests/152.out
diff --git a/tests/qemu-iotests/152 b/tests/qemu-iotests/152
new file mode 100644
index 0000000..fec546d
--- /dev/null
+++ b/tests/qemu-iotests/152
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+#
+# Tests for drive-mirror with source size unaligned to granularity
+#
+# Copyright (C) 2016 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+import os
+import iotests
+from iotests import qemu_img
+
+test_img = os.path.join(iotests.test_dir, 'test.img')
+target_img = os.path.join(iotests.test_dir, 'target.img')
+
+class TestUnaligned(iotests.QMPTestCase):
+ def setUp(self):
+ qemu_img('create', '-f', iotests.imgfmt, test_img, '512')
+ self.vm = iotests.VM().add_drive(test_img)
+ self.vm.launch()
+
+ def tearDown(self):
+ self.vm.shutdown()
+ os.remove(test_img)
+ try:
+ os.remove(target_img)
+ except OSError:
+ pass
+
+ def test_unaligned(self):
+ result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
+ granularity=65536, target=target_img)
+ self.complete_and_wait()
+ self.vm.shutdown()
+ self.assertEqual(iotests.image_size(test_img), iotests.image_size(target_img),
+ "Target size doesn't match source when granularity when unaligend")
+
+ def test_unaligned_with_update(self):
+ result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
+ granularity=65536, target=target_img)
+ self.wait_ready()
+ self.vm.hmp_qemu_io('drive0', 'write 0 512')
+ self.complete_and_wait(wait_ready=False)
+ self.vm.shutdown()
+ self.assertEqual(iotests.image_size(test_img), iotests.image_size(target_img),
+ "Target size doesn't match source when granularity when unaligend")
+
+
+if __name__ == '__main__':
+ iotests.main(supported_fmts=['raw', 'qcow2'])
diff --git a/tests/qemu-iotests/152.out b/tests/qemu-iotests/152.out
new file mode 100644
index 0000000..fbc63e6
--- /dev/null
+++ b/tests/qemu-iotests/152.out
@@ -0,0 +1,5 @@
+..
+----------------------------------------------------------------------
+Ran 2 tests
+
+OK
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index 2952b9d..822953b 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -152,3 +152,4 @@
148 rw auto quick
149 rw auto sudo
150 rw auto quick
+152 rw auto quick
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk Kevin Wolf
@ 2016-04-20 14:46 ` Max Reitz
2016-04-20 14:47 ` Jeff Cody
1 sibling, 0 replies; 12+ messages in thread
From: Max Reitz @ 2016-04-20 14:46 UTC (permalink / raw)
To: Kevin Wolf, qemu-block; +Cc: famz, jcody, qemu-devel
[-- Attachment #1.1: Type: text/plain, Size: 854 bytes --]
On 20.04.2016 16:32, Kevin Wolf wrote:
> From: Fam Zheng <famz@redhat.com>
>
> The last sub-chunk is rounded up to the copy granularity in the target
> image, resulting in a larger size than the source.
>
> Add a function to clip the copied sectors to the end.
>
> This undoes the "wrong" changes to tests/qemu-iotests/109.out in
> e5b43573e28. The remaining two offset changes are okay.
>
> [ kwolf: Use DIV_ROUND_UP to calculate nb_chunks now ]
>
> Reported-by: Kevin Wolf <kwolf@redhat.com>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block/mirror.c | 19 +++++++++++++++----
> tests/qemu-iotests/109.out | 44 ++++++++++++++++++++++----------------------
> 2 files changed, 37 insertions(+), 26 deletions(-)
Reviewed-by: Max Reitz <mreitz@redhat.com>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk Kevin Wolf
2016-04-20 14:46 ` Max Reitz
@ 2016-04-20 14:47 ` Jeff Cody
1 sibling, 0 replies; 12+ messages in thread
From: Jeff Cody @ 2016-04-20 14:47 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-block, famz, mreitz, qemu-devel
On Wed, Apr 20, 2016 at 04:32:44PM +0200, Kevin Wolf wrote:
> From: Fam Zheng <famz@redhat.com>
>
> The last sub-chunk is rounded up to the copy granularity in the target
> image, resulting in a larger size than the source.
>
> Add a function to clip the copied sectors to the end.
>
> This undoes the "wrong" changes to tests/qemu-iotests/109.out in
> e5b43573e28. The remaining two offset changes are okay.
>
> [ kwolf: Use DIV_ROUND_UP to calculate nb_chunks now ]
>
> Reported-by: Kevin Wolf <kwolf@redhat.com>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block/mirror.c | 19 +++++++++++++++----
> tests/qemu-iotests/109.out | 44 ++++++++++++++++++++++----------------------
> 2 files changed, 37 insertions(+), 26 deletions(-)
>
> diff --git a/block/mirror.c b/block/mirror.c
> index 9df1fae..d56e30e 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -108,7 +108,7 @@ static void mirror_iteration_done(MirrorOp *op, int ret)
>
> sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
> chunk_num = op->sector_num / sectors_per_chunk;
> - nb_chunks = op->nb_sectors / sectors_per_chunk;
> + nb_chunks = DIV_ROUND_UP(op->nb_sectors, sectors_per_chunk);
> bitmap_clear(s->in_flight_bitmap, chunk_num, nb_chunks);
> if (ret >= 0) {
> if (s->cow_bitmap) {
> @@ -161,6 +161,14 @@ static void mirror_read_complete(void *opaque, int ret)
> mirror_write_complete, op);
> }
>
> +static inline void mirror_clip_sectors(MirrorBlockJob *s,
> + int64_t sector_num,
> + int *nb_sectors)
> +{
> + *nb_sectors = MIN(*nb_sectors,
> + s->bdev_length / BDRV_SECTOR_SIZE - sector_num);
> +}
> +
> /* Round sector_num and/or nb_sectors to target cluster if COW is needed, and
> * return the offset of the adjusted tail sector against original. */
> static int mirror_cow_align(MirrorBlockJob *s,
> @@ -189,6 +197,9 @@ static int mirror_cow_align(MirrorBlockJob *s,
> s->target_cluster_sectors);
> }
> }
> + /* Clipping may result in align_nb_sectors unaligned to chunk boundary, but
> + * that doesn't matter because it's already the end of source image. */
> + mirror_clip_sectors(s, align_sector_num, &align_nb_sectors);
>
> ret = align_sector_num + align_nb_sectors - (*sector_num + *nb_sectors);
> *sector_num = align_sector_num;
> @@ -231,9 +242,8 @@ static int mirror_do_read(MirrorBlockJob *s, int64_t sector_num,
> /* The sector range must meet granularity because:
> * 1) Caller passes in aligned values;
> * 2) mirror_cow_align is used only when target cluster is larger. */
> - assert(!(nb_sectors % sectors_per_chunk));
> assert(!(sector_num % sectors_per_chunk));
> - nb_chunks = nb_sectors / sectors_per_chunk;
> + nb_chunks = DIV_ROUND_UP(nb_sectors, sectors_per_chunk);
>
> while (s->buf_free_count < nb_chunks) {
> trace_mirror_yield_in_flight(s, sector_num, s->in_flight);
> @@ -384,6 +394,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
> }
> }
>
> + mirror_clip_sectors(s, sector_num, &io_sectors);
> switch (mirror_method) {
> case MIRROR_METHOD_COPY:
> io_sectors = mirror_do_read(s, sector_num, io_sectors);
> @@ -399,7 +410,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
> }
> assert(io_sectors);
> sector_num += io_sectors;
> - nb_chunks -= io_sectors / sectors_per_chunk;
> + nb_chunks -= DIV_ROUND_UP(io_sectors, sectors_per_chunk);
> delay_ns += ratelimit_calculate_delay(&s->limit, io_sectors);
> }
> return delay_ns;
> diff --git a/tests/qemu-iotests/109.out b/tests/qemu-iotests/109.out
> index b3358de..38bc073 100644
> --- a/tests/qemu-iotests/109.out
> +++ b/tests/qemu-iotests/109.out
> @@ -10,14 +10,14 @@ Automatically detecting the format is dangerous for raw images, write operations
> Specify the 'raw' format explicitly to remove the restrictions.
> {"return": {}}
> {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 1024, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> {"return": []}
> read 65536/65536 bytes at offset 0
> 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> {"return": {}}
> {"return": {}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
> -{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 1024, "offset": 1024, "speed": 0, "type": "mirror"}}
> +{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 1024, "offset": 1024, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> Warning: Image size mismatch!
> Images are identical.
>
> @@ -31,14 +31,14 @@ Automatically detecting the format is dangerous for raw images, write operations
> Specify the 'raw' format explicitly to remove the restrictions.
> {"return": {}}
> {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 262144, "offset": 65536, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 197120, "offset": 512, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> {"return": []}
> read 65536/65536 bytes at offset 0
> 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> {"return": {}}
> {"return": {}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 262144, "offset": 262144, "speed": 0, "type": "mirror"}}
> -{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 262144, "offset": 262144, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 197120, "offset": 197120, "speed": 0, "type": "mirror"}}
> +{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 197120, "offset": 197120, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> Warning: Image size mismatch!
> Images are identical.
>
> @@ -73,14 +73,14 @@ Automatically detecting the format is dangerous for raw images, write operations
> Specify the 'raw' format explicitly to remove the restrictions.
> {"return": {}}
> {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 1024, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> {"return": []}
> read 65536/65536 bytes at offset 0
> 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> {"return": {}}
> {"return": {}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
> -{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 1024, "offset": 1024, "speed": 0, "type": "mirror"}}
> +{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 1024, "offset": 1024, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> Warning: Image size mismatch!
> Images are identical.
>
> @@ -115,14 +115,14 @@ Automatically detecting the format is dangerous for raw images, write operations
> Specify the 'raw' format explicitly to remove the restrictions.
> {"return": {}}
> {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 2560, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> {"return": []}
> read 65536/65536 bytes at offset 0
> 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> {"return": {}}
> {"return": {}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
> -{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 2560, "offset": 2560, "speed": 0, "type": "mirror"}}
> +{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 2560, "offset": 2560, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> Warning: Image size mismatch!
> Images are identical.
>
> @@ -135,14 +135,14 @@ Automatically detecting the format is dangerous for raw images, write operations
> Specify the 'raw' format explicitly to remove the restrictions.
> {"return": {}}
> {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 2560, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> {"return": []}
> read 65536/65536 bytes at offset 0
> 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> {"return": {}}
> {"return": {}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
> -{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 2560, "offset": 2560, "speed": 0, "type": "mirror"}}
> +{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 2560, "offset": 2560, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> Image resized.
> Warning: Image size mismatch!
> Images are identical.
> @@ -198,14 +198,14 @@ Automatically detecting the format is dangerous for raw images, write operations
> Specify the 'raw' format explicitly to remove the restrictions.
> {"return": {}}
> {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_ERROR", "data": {"device": "src", "operation": "write", "action": "report"}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 65536, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "src", "len": 2048, "offset": 0, "speed": 0, "type": "mirror", "error": "Operation not permitted"}}
> {"return": []}
> read 65536/65536 bytes at offset 0
> 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> {"return": {}}
> {"return": {}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
> -{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 2048, "offset": 2048, "speed": 0, "type": "mirror"}}
> +{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 2048, "offset": 2048, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> Image resized.
> Warning: Image size mismatch!
> Images are identical.
> @@ -218,14 +218,14 @@ WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed
> Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
> Specify the 'raw' format explicitly to remove the restrictions.
> {"return": {}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
> -{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 512, "offset": 512, "speed": 0, "type": "mirror"}}
> +{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 512, "offset": 512, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> Warning: Image size mismatch!
> Images are identical.
> {"return": {}}
> {"return": {}}
> -{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
> -{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 65536, "offset": 65536, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 512, "offset": 512, "speed": 0, "type": "mirror"}}
> +{"return": [{"io-status": "ok", "device": "src", "busy": false, "len": 512, "offset": 512, "paused": false, "speed": 0, "ready": true, "type": "mirror"}]}
> Warning: Image size mismatch!
> Images are identical.
> *** done
> --
> 1.8.3.1
>
Reviewed-by: Jeff Cody <jcody@redhat.com>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.6 v3 2/3] iotests: Add iotests.image_size
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 2/3] iotests: Add iotests.image_size Kevin Wolf
@ 2016-04-20 14:48 ` Jeff Cody
0 siblings, 0 replies; 12+ messages in thread
From: Jeff Cody @ 2016-04-20 14:48 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-block, famz, mreitz, qemu-devel
On Wed, Apr 20, 2016 at 04:32:45PM +0200, Kevin Wolf wrote:
> From: Fam Zheng <famz@redhat.com>
>
> This retrieves the virtual size of the image out of qemu-img info.
>
> Reviewed-by: Max Reitz <mreitz@redhat.com>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> tests/qemu-iotests/iotests.py | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
> index d9ef60e..56f988a 100644
> --- a/tests/qemu-iotests/iotests.py
> +++ b/tests/qemu-iotests/iotests.py
> @@ -28,6 +28,7 @@ sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'scripts', '
> import qmp
> import qtest
> import struct
> +import json
>
>
> # This will not work if arguments contain spaces but is necessary if we
> @@ -103,6 +104,11 @@ def create_image(name, size):
> i = i + 512
> file.close()
>
> +def image_size(img):
> + '''Return image's virtual size'''
> + r = qemu_img_pipe('info', '--output=json', '-f', imgfmt, img)
> + return json.loads(r)['virtual-size']
> +
> test_dir_re = re.compile(r"%s" % test_dir)
> def filter_test_dir(msg):
> return test_dir_re.sub("TEST_DIR", msg)
> --
> 1.8.3.1
>
Reviewed-by: Jeff Cody <jcody@redhat.com>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.6 v3 3/3] iotests: Test case for drive-mirror with unaligned image size
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 3/3] iotests: Test case for drive-mirror with unaligned image size Kevin Wolf
@ 2016-04-20 14:49 ` Max Reitz
2016-04-20 14:50 ` Jeff Cody
1 sibling, 0 replies; 12+ messages in thread
From: Max Reitz @ 2016-04-20 14:49 UTC (permalink / raw)
To: Kevin Wolf, qemu-block; +Cc: famz, jcody, qemu-devel
[-- Attachment #1.1: Type: text/plain, Size: 685 bytes --]
On 20.04.2016 16:32, Kevin Wolf wrote:
> From: Fam Zheng <famz@redhat.com>
>
> This is the regression test for the virtual size mismatch issue between
> target and source images.
>
> [ kwolf: Added test_unaligned_with_update ]
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> tests/qemu-iotests/152 | 62 ++++++++++++++++++++++++++++++++++++++++++++++
> tests/qemu-iotests/152.out | 5 ++++
> tests/qemu-iotests/group | 1 +
> 3 files changed, 68 insertions(+)
> create mode 100644 tests/qemu-iotests/152
> create mode 100644 tests/qemu-iotests/152.out
Reviewed-by: Max Reitz <mreitz@redhat.com>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.6 v3 3/3] iotests: Test case for drive-mirror with unaligned image size
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 3/3] iotests: Test case for drive-mirror with unaligned image size Kevin Wolf
2016-04-20 14:49 ` Max Reitz
@ 2016-04-20 14:50 ` Jeff Cody
1 sibling, 0 replies; 12+ messages in thread
From: Jeff Cody @ 2016-04-20 14:50 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-block, famz, mreitz, qemu-devel
On Wed, Apr 20, 2016 at 04:32:46PM +0200, Kevin Wolf wrote:
> From: Fam Zheng <famz@redhat.com>
>
> This is the regression test for the virtual size mismatch issue between
> target and source images.
>
> [ kwolf: Added test_unaligned_with_update ]
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> tests/qemu-iotests/152 | 62 ++++++++++++++++++++++++++++++++++++++++++++++
> tests/qemu-iotests/152.out | 5 ++++
> tests/qemu-iotests/group | 1 +
> 3 files changed, 68 insertions(+)
> create mode 100644 tests/qemu-iotests/152
> create mode 100644 tests/qemu-iotests/152.out
>
> diff --git a/tests/qemu-iotests/152 b/tests/qemu-iotests/152
> new file mode 100644
> index 0000000..fec546d
> --- /dev/null
> +++ b/tests/qemu-iotests/152
> @@ -0,0 +1,62 @@
> +#!/usr/bin/env python
> +#
> +# Tests for drive-mirror with source size unaligned to granularity
> +#
> +# Copyright (C) 2016 Red Hat, Inc.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> +#
> +
> +import os
> +import iotests
> +from iotests import qemu_img
> +
> +test_img = os.path.join(iotests.test_dir, 'test.img')
> +target_img = os.path.join(iotests.test_dir, 'target.img')
> +
> +class TestUnaligned(iotests.QMPTestCase):
> + def setUp(self):
> + qemu_img('create', '-f', iotests.imgfmt, test_img, '512')
> + self.vm = iotests.VM().add_drive(test_img)
> + self.vm.launch()
> +
> + def tearDown(self):
> + self.vm.shutdown()
> + os.remove(test_img)
> + try:
> + os.remove(target_img)
> + except OSError:
> + pass
> +
> + def test_unaligned(self):
> + result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
> + granularity=65536, target=target_img)
> + self.complete_and_wait()
> + self.vm.shutdown()
> + self.assertEqual(iotests.image_size(test_img), iotests.image_size(target_img),
> + "Target size doesn't match source when granularity when unaligend")
> +
> + def test_unaligned_with_update(self):
> + result = self.vm.qmp('drive-mirror', device='drive0', sync='full',
> + granularity=65536, target=target_img)
> + self.wait_ready()
> + self.vm.hmp_qemu_io('drive0', 'write 0 512')
> + self.complete_and_wait(wait_ready=False)
> + self.vm.shutdown()
> + self.assertEqual(iotests.image_size(test_img), iotests.image_size(target_img),
> + "Target size doesn't match source when granularity when unaligend")
> +
> +
> +if __name__ == '__main__':
> + iotests.main(supported_fmts=['raw', 'qcow2'])
> diff --git a/tests/qemu-iotests/152.out b/tests/qemu-iotests/152.out
> new file mode 100644
> index 0000000..fbc63e6
> --- /dev/null
> +++ b/tests/qemu-iotests/152.out
> @@ -0,0 +1,5 @@
> +..
> +----------------------------------------------------------------------
> +Ran 2 tests
> +
> +OK
> diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
> index 2952b9d..822953b 100644
> --- a/tests/qemu-iotests/group
> +++ b/tests/qemu-iotests/group
> @@ -152,3 +152,4 @@
> 148 rw auto quick
> 149 rw auto sudo
> 150 rw auto quick
> +152 rw auto quick
> --
> 1.8.3.1
>
Reviewed-by: Jeff Cody <jcody@redhat.com>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity
2016-04-20 14:32 [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Kevin Wolf
` (2 preceding siblings ...)
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 3/3] iotests: Test case for drive-mirror with unaligned image size Kevin Wolf
@ 2016-04-20 14:51 ` Jeff Cody
2016-04-20 14:59 ` Jeff Cody
2016-04-21 2:12 ` Fam Zheng
4 siblings, 1 reply; 12+ messages in thread
From: Jeff Cody @ 2016-04-20 14:51 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-block, famz, mreitz, qemu-devel
On Wed, Apr 20, 2016 at 04:32:43PM +0200, Kevin Wolf wrote:
> Taking over Fam's series as we're late for -rc3. Original cover letter:
>
> This fixes the bug introduced in e5b43573e28 and lately noticed by Kevin.
>
> v2: Move the mirror_clip_sectors() to mirror_iteration. [Max]
> v3: Fix nb_clusters calculation and add a test case for it [Kevin]
>
> Fam Zheng (3):
> mirror: Don't extend the last sub-chunk
> iotests: Add iotests.image_size
> iotests: Test case for drive-mirror with unaligned image size
>
> block/mirror.c | 19 ++++++++++---
> tests/qemu-iotests/109.out | 44 +++++++++++++++---------------
> tests/qemu-iotests/152 | 62 +++++++++++++++++++++++++++++++++++++++++++
> tests/qemu-iotests/152.out | 5 ++++
> tests/qemu-iotests/group | 1 +
> tests/qemu-iotests/iotests.py | 6 +++++
> 6 files changed, 111 insertions(+), 26 deletions(-)
> create mode 100644 tests/qemu-iotests/152
> create mode 100644 tests/qemu-iotests/152.out
>
> --
> 1.8.3.1
>
Thanks,
Applied to my block branch:
git://github.com/codyprime/qemu-kvm-jtc.git block
-Jeff
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity
2016-04-20 14:51 ` [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Jeff Cody
@ 2016-04-20 14:59 ` Jeff Cody
0 siblings, 0 replies; 12+ messages in thread
From: Jeff Cody @ 2016-04-20 14:59 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-block, famz, mreitz, qemu-devel
On Wed, Apr 20, 2016 at 10:51:04AM -0400, Jeff Cody wrote:
> On Wed, Apr 20, 2016 at 04:32:43PM +0200, Kevin Wolf wrote:
> > Taking over Fam's series as we're late for -rc3. Original cover letter:
> >
> > This fixes the bug introduced in e5b43573e28 and lately noticed by Kevin.
> >
> > v2: Move the mirror_clip_sectors() to mirror_iteration. [Max]
> > v3: Fix nb_clusters calculation and add a test case for it [Kevin]
> >
> > Fam Zheng (3):
> > mirror: Don't extend the last sub-chunk
> > iotests: Add iotests.image_size
> > iotests: Test case for drive-mirror with unaligned image size
> >
> > block/mirror.c | 19 ++++++++++---
> > tests/qemu-iotests/109.out | 44 +++++++++++++++---------------
> > tests/qemu-iotests/152 | 62 +++++++++++++++++++++++++++++++++++++++++++
> > tests/qemu-iotests/152.out | 5 ++++
> > tests/qemu-iotests/group | 1 +
> > tests/qemu-iotests/iotests.py | 6 +++++
> > 6 files changed, 111 insertions(+), 26 deletions(-)
> > create mode 100644 tests/qemu-iotests/152
> > create mode 100644 tests/qemu-iotests/152.out
> >
> > --
> > 1.8.3.1
> >
>
> Thanks,
>
> Applied to my block branch:
>
> git://github.com/codyprime/qemu-kvm-jtc.git block
>
Per IRC discussion:
Since Kevin already has a pull request queued up and ready to go with this
series, that will be the faster path. De-queuing this from my branch, and
Kevin will issue the pull request through his.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity
2016-04-20 14:32 [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Kevin Wolf
` (3 preceding siblings ...)
2016-04-20 14:51 ` [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Jeff Cody
@ 2016-04-21 2:12 ` Fam Zheng
4 siblings, 0 replies; 12+ messages in thread
From: Fam Zheng @ 2016-04-21 2:12 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-block, jcody, qemu-devel, mreitz
On Wed, 04/20 16:32, Kevin Wolf wrote:
> Taking over Fam's series as we're late for -rc3.
Much appriciated! Thanks, Kevin.
Fam
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2016-04-21 2:12 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-20 14:32 [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Kevin Wolf
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 1/3] mirror: Don't extend the last sub-chunk Kevin Wolf
2016-04-20 14:46 ` Max Reitz
2016-04-20 14:47 ` Jeff Cody
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 2/3] iotests: Add iotests.image_size Kevin Wolf
2016-04-20 14:48 ` Jeff Cody
2016-04-20 14:32 ` [Qemu-devel] [PATCH for-2.6 v3 3/3] iotests: Test case for drive-mirror with unaligned image size Kevin Wolf
2016-04-20 14:49 ` Max Reitz
2016-04-20 14:50 ` Jeff Cody
2016-04-20 14:51 ` [Qemu-devel] [PATCH for-2.6 v3 0/3] block: Fix drive-mirror with image size unaligned with granularity Jeff Cody
2016-04-20 14:59 ` Jeff Cody
2016-04-21 2:12 ` Fam Zheng
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).