On 06/14/2016 09:25 AM, Denis V. Lunev wrote:
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 <address@hidden>
Reviewed-by: Vladimir Sementsov-Ogievskiy<address@hidden>
CC: Stefan Hajnoczi <address@hidden>
CC: Fam Zheng <address@hidden>
CC: Kevin Wolf <address@hidden>
CC: Max Reitz <address@hidden>
CC: Jeff Cody <address@hidden>
CC: Eric Blake <address@hidden>
---
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);
Won't work as written. 'end' is 64 bits, but bdrv_set_dirty_bitmap() is
limited to a 32-bit sector count. Might be first worth updating
bdrv_set_dirty_bitmap() and friends to be byte-based rather than
sector-based (but still tracking a sector per bit, obviously), as well
as expand it to operate on 64-bit sizes rather than 32-bit.