On Fri, Dec 23, 2016 at 05:28:51PM +0300, Vladimir Sementsov-Ogievskiy wrote: > In case of full backup we can skip unallocated clusters if the target > disk is already zero-initialized. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> > --- > block/backup.c | 8 ++++++-- > tests/qemu-iotests/055 | 2 ++ > 2 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/block/backup.c b/block/backup.c > index 2afd1b6..4ef8daf 100644 > --- a/block/backup.c > +++ b/block/backup.c > @@ -562,9 +562,13 @@ static void coroutine_fn backup_run(void *opaque) > if (job->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) { > backup_incremental_init_copy_bitmap(job); > } else { > + /* top or full mode */ > + bool is_top = job->sync_mode == MIRROR_SYNC_MODE_TOP; > + BlockDriverState *base = > + is_top ? backing_bs(blk_bs(job->common.blk)) : NULL; > hbitmap_set(job->copy_bitmap, 0, end); > - if (job->sync_mode == MIRROR_SYNC_MODE_TOP) { > - backup_skip_loop(job, backing_bs(blk_bs(job->common.blk))); > + if (is_top || bdrv_has_zero_init(blk_bs(job->target))) { > + backup_skip_loop(job, base); > }
An alternative that I find easier to read:
hbitmap_set(job->copy_bitmap, 0, end);
if (job->sync_mode == MIRROR_SYNC_MODE_TOP) {
backup_skip_loop(job, backing_bs(blk_bs(job->common.blk)));
} else if (bdrv_has_zero_init(blk_bs(job->target))) {
backup_skip_loop(job, NULL);
}
signature.asc
Description: PGP signature
