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 <d...@openvz.org> Reviewed-by: Vladimir Sementsov-Ogievskiy<vsement...@virtuozzo.com> Reviewed-by: Eric Blake <ebl...@redhat.com> Reviewed-by: John Snow <js...@redhat.com> Reviewed-by: Fam Zheng <f...@redhat.com> CC: Stefan Hajnoczi <stefa...@redhat.com> CC: Kevin Wolf <kw...@redhat.com> CC: Max Reitz <mre...@redhat.com> CC: Jeff Cody <jc...@redhat.com> --- 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