aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Reiter <s.reiter@proxmox.com>2020-08-10 11:55:22 +0200
committerMax Reitz <mreitz@redhat.com>2020-08-10 17:12:46 +0200
commit7661a886a17ccf3aff398b124baad9dd95f64bed (patch)
tree795ea6454efbbc7bd66c621be4c42a78ebe2dc88
parente1d322c40524d2c544d1fcd37b267d106d16d328 (diff)
block/block-copy: always align copied region to cluster size
Since commit 42ac214406e0 (block/block-copy: refactor task creation) block_copy_task_create calculates the area to be copied via bdrv_dirty_bitmap_next_dirty_area, but that can return an unaligned byte count if the image's last cluster end is not aligned to the bitmap's granularity. Always ALIGN_UP the resulting bytes value to satisfy block_copy_do_copy, which requires the 'bytes' parameter to be aligned to cluster size. Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Signed-off-by: Stefan Reiter <s.reiter@proxmox.com> Message-Id: <20200810095523.15071-1-s.reiter@proxmox.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
-rw-r--r--block/block-copy.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/block/block-copy.c b/block/block-copy.c
index f7428a7c08..a30b9097ef 100644
--- a/block/block-copy.c
+++ b/block/block-copy.c
@@ -142,6 +142,9 @@ static BlockCopyTask *block_copy_task_create(BlockCopyState *s,
return NULL;
}
+ assert(QEMU_IS_ALIGNED(offset, s->cluster_size));
+ bytes = QEMU_ALIGN_UP(bytes, s->cluster_size);
+
/* region is dirty, so no existent tasks possible in it */
assert(!find_conflicting_task(s, offset, bytes));