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 backing 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. Signed-off-by: Stefan Reiter <[email protected]> --- This causes backups with unaligned image sizes to fail on the last block in my testing (e.g. a backup job with 4k cluster size fails on a drive with 4097 bytes). Alternatively one could remove the assert(QEMU_IS_ALIGNED(bytes, s->cluster_size)); from block_copy_do_copy, but I'd wager that's there for a reason? block/block-copy.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/block/block-copy.c b/block/block-copy.c index f7428a7c08..023cb03200 100644 --- a/block/block-copy.c +++ b/block/block-copy.c @@ -142,6 +142,8 @@ static BlockCopyTask *block_copy_task_create(BlockCopyState *s, return NULL; } + 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)); -- 2.20.1
