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