qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/3] block: Fix drive-mirror with image size unaligned with granularity
@ 2016-04-19 10:09 Fam Zheng
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk Fam Zheng
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Fam Zheng @ 2016-04-19 10:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jeff Cody, Kevin Wolf, Max Reitz, qemu-block

This fixes the bug introduced in e5b43573e28 and lately noticed by 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                | 10 +++++++++
 tests/qemu-iotests/109.out    | 44 ++++++++++++++++++-------------------
 tests/qemu-iotests/152        | 51 +++++++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/152.out    |  5 +++++
 tests/qemu-iotests/group      |  1 +
 tests/qemu-iotests/iotests.py |  6 +++++
 6 files changed, 95 insertions(+), 22 deletions(-)
 create mode 100644 tests/qemu-iotests/152
 create mode 100644 tests/qemu-iotests/152.out

-- 
2.8.0

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk
  2016-04-19 10:09 [Qemu-devel] [PATCH 0/3] block: Fix drive-mirror with image size unaligned with granularity Fam Zheng
@ 2016-04-19 10:09 ` Fam Zheng
  2016-04-19 20:33   ` Max Reitz
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 2/3] iotests: Add iotests.image_size Fam Zheng
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 3/3] iotests: Test case for drive-mirror with unaligned image size Fam Zheng
  2 siblings, 1 reply; 8+ messages in thread
From: Fam Zheng @ 2016-04-19 10:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jeff Cody, Kevin Wolf, Max Reitz, qemu-block

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.

Reported-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
 block/mirror.c             | 10 ++++++++++
 tests/qemu-iotests/109.out | 44 ++++++++++++++++++++++----------------------
 2 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/block/mirror.c b/block/mirror.c
index c2cfc1a..b6387f1 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -205,6 +205,14 @@ static inline void mirror_wait_for_io(MirrorBlockJob *s)
     s->waiting_for_io = false;
 }
 
+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);
+}
+
 /* Submit async read while handling COW.
  * Returns: nb_sectors if no alignment is necessary, or
  *          (new_end - sector_num) if tail is rounded up or down due to
@@ -240,6 +248,7 @@ static int mirror_do_read(MirrorBlockJob *s, int64_t sector_num,
         mirror_wait_for_io(s);
     }
 
+    mirror_clip_sectors(s, sector_num, &nb_sectors);
     /* Allocate a MirrorOp that is used as an AIO callback.  */
     op = g_new(MirrorOp, 1);
     op->s = s;
@@ -276,6 +285,7 @@ static void mirror_do_zero_or_discard(MirrorBlockJob *s,
 {
     MirrorOp *op;
 
+    mirror_clip_sectors(s, sector_num, &nb_sectors);
     /* Allocate a MirrorOp that is used as an AIO callback. The qiov is zeroed
      * so the freeing in mirror_iteration_done is nop. */
     op = g_new0(MirrorOp, 1);
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
-- 
2.8.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 2/3] iotests: Add iotests.image_size
  2016-04-19 10:09 [Qemu-devel] [PATCH 0/3] block: Fix drive-mirror with image size unaligned with granularity Fam Zheng
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk Fam Zheng
@ 2016-04-19 10:09 ` Fam Zheng
  2016-04-19 20:56   ` Max Reitz
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 3/3] iotests: Test case for drive-mirror with unaligned image size Fam Zheng
  2 siblings, 1 reply; 8+ messages in thread
From: Fam Zheng @ 2016-04-19 10:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jeff Cody, Kevin Wolf, Max Reitz, qemu-block

This retrieves the virtual size of the image out of qemu-img info.

Signed-off-by: Fam Zheng <famz@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)
-- 
2.8.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 3/3] iotests: Test case for drive-mirror with unaligned image size
  2016-04-19 10:09 [Qemu-devel] [PATCH 0/3] block: Fix drive-mirror with image size unaligned with granularity Fam Zheng
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk Fam Zheng
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 2/3] iotests: Add iotests.image_size Fam Zheng
@ 2016-04-19 10:09 ` Fam Zheng
  2016-04-19 21:00   ` Max Reitz
  2 siblings, 1 reply; 8+ messages in thread
From: Fam Zheng @ 2016-04-19 10:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jeff Cody, Kevin Wolf, Max Reitz, qemu-block

This is the regression test for the virtual size mismatch issue between
target and source images.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 tests/qemu-iotests/152     | 51 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/qemu-iotests/152.out |  5 +++++
 tests/qemu-iotests/group   |  1 +
 3 files changed, 57 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..923beb5
--- /dev/null
+++ b/tests/qemu-iotests/152
@@ -0,0 +1,51 @@
+#!/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")
+
+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..ae1213e
--- /dev/null
+++ b/tests/qemu-iotests/152.out
@@ -0,0 +1,5 @@
+.
+----------------------------------------------------------------------
+Ran 1 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
-- 
2.8.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk Fam Zheng
@ 2016-04-19 20:33   ` Max Reitz
  2016-04-20  1:13     ` Fam Zheng
  0 siblings, 1 reply; 8+ messages in thread
From: Max Reitz @ 2016-04-19 20:33 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel; +Cc: Jeff Cody, Kevin Wolf, qemu-block


[-- Attachment #1.1: Type: text/plain, Size: 2873 bytes --]

On 19.04.2016 12:09, Fam Zheng wrote:
> 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.
> 
> Reported-by: Kevin Wolf <kwolf@redhat.com>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  block/mirror.c             | 10 ++++++++++
>  tests/qemu-iotests/109.out | 44 ++++++++++++++++++++++----------------------
>  2 files changed, 32 insertions(+), 22 deletions(-)
> 
> diff --git a/block/mirror.c b/block/mirror.c
> index c2cfc1a..b6387f1 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -205,6 +205,14 @@ static inline void mirror_wait_for_io(MirrorBlockJob *s)
>      s->waiting_for_io = false;
>  }
>  
> +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);
> +}
> +
>  /* Submit async read while handling COW.
>   * Returns: nb_sectors if no alignment is necessary, or
>   *          (new_end - sector_num) if tail is rounded up or down due to
> @@ -240,6 +248,7 @@ static int mirror_do_read(MirrorBlockJob *s, int64_t sector_num,
>          mirror_wait_for_io(s);
>      }
>  
> +    mirror_clip_sectors(s, sector_num, &nb_sectors);
>      /* Allocate a MirrorOp that is used as an AIO callback.  */
>      op = g_new(MirrorOp, 1);
>      op->s = s;

I think you want to adjust the ret value, too. It doesn't really matter
in practice (the caller just overshoots the end of the image instead of
getting precisely to its end), but I wouldn't rely on this.

> @@ -276,6 +285,7 @@ static void mirror_do_zero_or_discard(MirrorBlockJob *s,
>  {
>      MirrorOp *op;
>  
> +    mirror_clip_sectors(s, sector_num, &nb_sectors);
>      /* Allocate a MirrorOp that is used as an AIO callback. The qiov is zeroed
>       * so the freeing in mirror_iteration_done is nop. */
>      op = g_new0(MirrorOp, 1);

I think it would be best to just pull out the mirror_clip_sectors() from
these functions and put it above the "switch (mirror_method)" in
mirror_iteration().

We'd just have to make sure that mirror_cow_align() will not increase
nb_sectors such that it points beyond the image end. It can do that,
because and image's size does not need to be aligned to its cluster
size. But just putting a mirror_clip_sectors() below the
bdrv_round_to_clusters() call in mirror_cow_align() should fix that.

Then you wouldn't need to worry about fixing the ret value in
mirror_do_read().

Max


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 2/3] iotests: Add iotests.image_size
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 2/3] iotests: Add iotests.image_size Fam Zheng
@ 2016-04-19 20:56   ` Max Reitz
  0 siblings, 0 replies; 8+ messages in thread
From: Max Reitz @ 2016-04-19 20:56 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel; +Cc: Jeff Cody, Kevin Wolf, qemu-block


[-- Attachment #1.1: Type: text/plain, Size: 295 bytes --]

On 19.04.2016 12:09, Fam Zheng wrote:
> This retrieves the virtual size of the image out of qemu-img info.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  tests/qemu-iotests/iotests.py | 6 ++++++
>  1 file changed, 6 insertions(+)

Reviewed-by: Max Reitz <mreitz@redhat.com>


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 3/3] iotests: Test case for drive-mirror with unaligned image size
  2016-04-19 10:09 ` [Qemu-devel] [PATCH 3/3] iotests: Test case for drive-mirror with unaligned image size Fam Zheng
@ 2016-04-19 21:00   ` Max Reitz
  0 siblings, 0 replies; 8+ messages in thread
From: Max Reitz @ 2016-04-19 21:00 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel; +Cc: Jeff Cody, Kevin Wolf, qemu-block


[-- Attachment #1.1: Type: text/plain, Size: 545 bytes --]

On 19.04.2016 12:09, Fam Zheng wrote:
> This is the regression test for the virtual size mismatch issue between
> target and source images.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  tests/qemu-iotests/152     | 51 ++++++++++++++++++++++++++++++++++++++++++++++
>  tests/qemu-iotests/152.out |  5 +++++
>  tests/qemu-iotests/group   |  1 +
>  3 files changed, 57 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] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk
  2016-04-19 20:33   ` Max Reitz
@ 2016-04-20  1:13     ` Fam Zheng
  0 siblings, 0 replies; 8+ messages in thread
From: Fam Zheng @ 2016-04-20  1:13 UTC (permalink / raw)
  To: Max Reitz; +Cc: qemu-devel, Jeff Cody, Kevin Wolf, qemu-block

On Tue, 04/19 22:33, Max Reitz wrote:
> On 19.04.2016 12:09, Fam Zheng wrote:
> > 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.
> > 
> > Reported-by: Kevin Wolf <kwolf@redhat.com>
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  block/mirror.c             | 10 ++++++++++
> >  tests/qemu-iotests/109.out | 44 ++++++++++++++++++++++----------------------
> >  2 files changed, 32 insertions(+), 22 deletions(-)
> > 
> > diff --git a/block/mirror.c b/block/mirror.c
> > index c2cfc1a..b6387f1 100644
> > --- a/block/mirror.c
> > +++ b/block/mirror.c
> > @@ -205,6 +205,14 @@ static inline void mirror_wait_for_io(MirrorBlockJob *s)
> >      s->waiting_for_io = false;
> >  }
> >  
> > +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);
> > +}
> > +
> >  /* Submit async read while handling COW.
> >   * Returns: nb_sectors if no alignment is necessary, or
> >   *          (new_end - sector_num) if tail is rounded up or down due to
> > @@ -240,6 +248,7 @@ static int mirror_do_read(MirrorBlockJob *s, int64_t sector_num,
> >          mirror_wait_for_io(s);
> >      }
> >  
> > +    mirror_clip_sectors(s, sector_num, &nb_sectors);
> >      /* Allocate a MirrorOp that is used as an AIO callback.  */
> >      op = g_new(MirrorOp, 1);
> >      op->s = s;
> 
> I think you want to adjust the ret value, too. It doesn't really matter
> in practice (the caller just overshoots the end of the image instead of
> getting precisely to its end), but I wouldn't rely on this.
> 
> > @@ -276,6 +285,7 @@ static void mirror_do_zero_or_discard(MirrorBlockJob *s,
> >  {
> >      MirrorOp *op;
> >  
> > +    mirror_clip_sectors(s, sector_num, &nb_sectors);
> >      /* Allocate a MirrorOp that is used as an AIO callback. The qiov is zeroed
> >       * so the freeing in mirror_iteration_done is nop. */
> >      op = g_new0(MirrorOp, 1);
> 
> I think it would be best to just pull out the mirror_clip_sectors() from
> these functions and put it above the "switch (mirror_method)" in
> mirror_iteration().
> 
> We'd just have to make sure that mirror_cow_align() will not increase
> nb_sectors such that it points beyond the image end. It can do that,
> because and image's size does not need to be aligned to its cluster
> size. But just putting a mirror_clip_sectors() below the
> bdrv_round_to_clusters() call in mirror_cow_align() should fix that.
> 
> Then you wouldn't need to worry about fixing the ret value in
> mirror_do_read().

Sounds good, will do this.

Thanks,
Fam

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-04-20  1:20 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-19 10:09 [Qemu-devel] [PATCH 0/3] block: Fix drive-mirror with image size unaligned with granularity Fam Zheng
2016-04-19 10:09 ` [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk Fam Zheng
2016-04-19 20:33   ` Max Reitz
2016-04-20  1:13     ` Fam Zheng
2016-04-19 10:09 ` [Qemu-devel] [PATCH 2/3] iotests: Add iotests.image_size Fam Zheng
2016-04-19 20:56   ` Max Reitz
2016-04-19 10:09 ` [Qemu-devel] [PATCH 3/3] iotests: Test case for drive-mirror with unaligned image size Fam Zheng
2016-04-19 21:00   ` Max Reitz

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).