This will be used in the following commit to bring "incremental" mode to copy-before-write filter.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- include/block/block-copy.h | 2 +- block/block-copy.c | 16 +++++++++++++--- block/copy-before-write.c | 3 ++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/block/block-copy.h b/include/block/block-copy.h index 9c24e8f38e..7d40bf2ac2 100644 --- a/include/block/block-copy.h +++ b/include/block/block-copy.h @@ -26,7 +26,7 @@ typedef struct BlockCopyCallState BlockCopyCallState; BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target, bool use_copy_range, bool compress, - Error **errp); + BdrvDirtyBitmap *bitmap, Error **errp); void block_copy_set_copy_opts(BlockCopyState *s, bool use_copy_range, bool compress); diff --git a/block/block-copy.c b/block/block-copy.c index 307045a59f..ec6a39b2ed 100644 --- a/block/block-copy.c +++ b/block/block-copy.c @@ -400,9 +400,10 @@ static int64_t block_copy_calculate_cluster_size(BlockDriverState *target, } BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target, - bool use_copy_range, - bool compress, Error **errp) + bool use_copy_range, bool compress, + BdrvDirtyBitmap *bitmap, Error **errp) { + ERRP_GUARD(); BlockCopyState *s; int64_t cluster_size; BdrvDirtyBitmap *copy_bitmap; @@ -418,7 +419,16 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target, return NULL; } bdrv_disable_dirty_bitmap(copy_bitmap); - bdrv_set_dirty_bitmap(copy_bitmap, 0, bdrv_dirty_bitmap_size(copy_bitmap)); + if (bitmap) { + if (!bdrv_merge_dirty_bitmap(copy_bitmap, bitmap, NULL, errp)) { + error_prepend(errp, "Failed to merge bitmap '%s' to internal " + "copy-bitmap: ", bdrv_dirty_bitmap_name(bitmap)); + return NULL; + } + } else { + bdrv_set_dirty_bitmap(copy_bitmap, 0, + bdrv_dirty_bitmap_size(copy_bitmap)); + } s = g_new(BlockCopyState, 1); *s = (BlockCopyState) { diff --git a/block/copy-before-write.c b/block/copy-before-write.c index b36ede3186..dbafee1f03 100644 --- a/block/copy-before-write.c +++ b/block/copy-before-write.c @@ -169,7 +169,8 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags, ((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK) & bs->file->bs->supported_zero_flags); - s->bcs = block_copy_state_new(bs->file, s->target, false, false, errp); + s->bcs = block_copy_state_new(bs->file, s->target, false, false, NULL, + errp); if (!s->bcs) { error_prepend(errp, "Cannot create block-copy-state: "); return -EINVAL; -- 2.29.2