There is no need to scan allocation tables if we have mark_all_dirty flag set. Just mark it all dirty.
Signed-off-by: Denis V. Lunev <[email protected]> Reviewed-by: Vladimir Sementsov-Ogievskiy<[email protected]> Reviewed-by: Eric Blake <[email protected]> Reviewed-by: John Snow <[email protected]> Reviewed-by: Fam Zheng <[email protected]> CC: Stefan Hajnoczi <[email protected]> CC: Kevin Wolf <[email protected]> CC: Max Reitz <[email protected]> CC: Jeff Cody <[email protected]> --- block/mirror.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index 3185ccb..d0fa457 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -531,11 +531,15 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s) BlockDriverState *base = s->base; BlockDriverState *bs = blk_bs(s->common.blk); BlockDriverState *target_bs = blk_bs(s->target); - bool mark_all_dirty = base == NULL && !bdrv_has_zero_init(target_bs); int ret, n; end = s->bdev_length / BDRV_SECTOR_SIZE; + if (base == NULL && !bdrv_has_zero_init(target_bs)) { + bdrv_set_dirty_bitmap(s->dirty_bitmap, 0, end); + return 0; + } + /* First part, loop on the sectors and initialize the dirty bitmap. */ for (sector_num = 0; sector_num < end; ) { /* Just to make sure we are not exceeding int limit. */ @@ -554,7 +558,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s) } assert(n > 0); - if (ret == 1 || mark_all_dirty) { + if (ret == 1) { bdrv_set_dirty_bitmap(s->dirty_bitmap, sector_num, n); } sector_num += n; -- 2.5.0
