Allow use existent copy-bitmap to make it possible to synchronize with externally created fleecing-hook filter which will be introduced soon.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- block/backup.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/block/backup.c b/block/backup.c index ad143ea735..11aa31a323 100644 --- a/block/backup.c +++ b/block/backup.c @@ -53,6 +53,7 @@ typedef struct BackupBlockJob { QLIST_HEAD(, CowRequest) inflight_reqs; BdrvDirtyBitmap *copy_bitmap; + bool copy_bitmap_created; bool use_copy_range; int64_t copy_range_size; @@ -307,7 +308,7 @@ static void backup_clean(Job *job) blk_unref(s->target); s->target = NULL; - if (s->copy_bitmap) { + if (s->copy_bitmap_created) { bdrv_release_dirty_bitmap(blk_bs(s->common.blk), s->copy_bitmap); s->copy_bitmap = NULL; } @@ -686,11 +687,16 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs, job->cluster_size = MAX(BACKUP_CLUSTER_SIZE_DEFAULT, bdi.cluster_size); } - if (!x_copy_bitmap) { + if (x_copy_bitmap) { + job->copy_bitmap = bdrv_find_dirty_bitmap(bs, x_copy_bitmap); + } else { x_copy_bitmap = gen_bitmap_name = id_generate(ID_BLOCK_BITMAP); } - job->copy_bitmap = bdrv_create_dirty_bitmap(bs, job->cluster_size, - x_copy_bitmap, errp); + if (!job->copy_bitmap) { + job->copy_bitmap = bdrv_create_dirty_bitmap(bs, job->cluster_size, + x_copy_bitmap, errp); + job->copy_bitmap_created = !!job->copy_bitmap; + } g_free(gen_bitmap_name); if (!job->copy_bitmap) { goto error; -- 2.18.0