diff options
| -rw-r--r-- | block/mirror.c | 9 | ||||
| -rwxr-xr-x | tests/qemu-iotests/151 | 20 | ||||
| -rw-r--r-- | tests/qemu-iotests/151.out | 4 |
3 files changed, 28 insertions, 5 deletions
diff --git a/block/mirror.c b/block/mirror.c index b344182..bc982cb 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1514,9 +1514,12 @@ do_sync_target_write(MirrorBlockJob *job, MirrorMethod method, assert(!qiov); ret = blk_co_pwrite_zeroes(job->target, offset, bytes, flags); if (job->zero_bitmap && ret >= 0) { - bitmap_set(job->zero_bitmap, dirty_bitmap_offset / job->granularity, - (dirty_bitmap_end - dirty_bitmap_offset) / - job->granularity); + if (dirty_bitmap_offset < dirty_bitmap_end) { + bitmap_set(job->zero_bitmap, + dirty_bitmap_offset / job->granularity, + (dirty_bitmap_end - dirty_bitmap_offset) / + job->granularity); + } } break; diff --git a/tests/qemu-iotests/151 b/tests/qemu-iotests/151 index 06ee358..9b9c815 100755 --- a/tests/qemu-iotests/151 +++ b/tests/qemu-iotests/151 @@ -191,6 +191,26 @@ class TestActiveMirror(iotests.QMPTestCase): self.potential_writes_in_flight = False + def testUnalignedSmallerThanGranularityWriteZeroes(self): + # Fill the source image + self.vm.hmp_qemu_io('source', 'write -P 1 0 %i' % self.image_len); + + # Start the block job + self.vm.cmd('blockdev-mirror', + job_id='mirror', + filter_node_name='mirror-node', + device='source-node', + target='target-node', + sync='full', + copy_mode='write-blocking') + + # Wait for the READY event + self.wait_ready(drive='mirror') + + for offset in range(6 * self.image_len // 8, 7 * self.image_len // 8, 1024 * 1024): + self.vm.hmp_qemu_io('source', 'aio_write -z %i 512' % (offset + 512)) + + self.complete_and_wait(drive='mirror', wait_ready=False) class TestThrottledWithNbdExportBase(iotests.QMPTestCase): image_len = 128 * 1024 * 1024 # MB diff --git a/tests/qemu-iotests/151.out b/tests/qemu-iotests/151.out index 3f8a935..2f7d390 100644 --- a/tests/qemu-iotests/151.out +++ b/tests/qemu-iotests/151.out @@ -1,5 +1,5 @@ -...... +....... ---------------------------------------------------------------------- -Ran 6 tests +Ran 7 tests OK |
