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> CC: Stefan Hajnoczi <stefa...@redhat.com> CC: Fam Zheng <f...@redhat.com> CC: Kevin Wolf <kw...@redhat.com> CC: Max Reitz <mre...@redhat.com> CC: Jeff Cody <jc...@redhat.com> CC: Eric Blake <ebl...@redhat.com> --- block/mirror.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index 797659d..c7b3639 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -507,12 +507,16 @@ static int 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); uint64_t last_pause_ns; 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; + } + last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); /* First part, loop on the sectors and initialize the dirty bitmap. */ @@ -537,7 +541,7 @@ static int 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