On Thu, Feb 02, 2017 at 05:25:15PM +0300, Denis V. Lunev wrote: > From: Anton Nefedov <anton.nefe...@virtuozzo.com> > > If explicit zeroing out before mirroring is required for the target image, > it moves the block job offset counter to EOF, then offset and len counters > count the image size twice. There is no harm but stats are confusing, > specifically the progress of the operation is always reported as 99% by > management tools. > > The patch skips offset increase for the first "technical" pass over the > image. This should not cause any further harm. > > Signed-off-by: Anton Nefedov <anton.nefe...@virtuozzo.com> > Signed-off-by: Denis V. Lunev <d...@openvz.org> > CC: Jeff Cody <jc...@redhat.com> > CC: Kevin Wolf <kw...@redhat.com> > CC: Max Reitz <mre...@redhat.com> > CC: Eric Blake <ebl...@redhat.com> > --- > Changes from v1: > - changed the approach - we do not allow to increase the offset rather then > to move it back > - description rewritten > - kludges to tests are removed as not actually needed with this approach > > block/mirror.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/block/mirror.c b/block/mirror.c > index 301ba92..f100f5d 100644 > --- a/block/mirror.c > +++ b/block/mirror.c > @@ -69,6 +69,7 @@ typedef struct MirrorBlockJob { > bool waiting_for_io; > int target_cluster_sectors; > int max_iov; > + bool initial_zeroing_ongoing; > } MirrorBlockJob; > > typedef struct MirrorOp { > @@ -117,9 +118,10 @@ static void mirror_iteration_done(MirrorOp *op, int ret) > if (s->cow_bitmap) { > bitmap_set(s->cow_bitmap, chunk_num, nb_chunks); > } > - s->common.offset += (uint64_t)op->nb_sectors * BDRV_SECTOR_SIZE; > + if (!s->initial_zeroing_ongoing) { > + s->common.offset += (uint64_t)op->nb_sectors * BDRV_SECTOR_SIZE; > + } > } > - > qemu_iovec_destroy(&op->qiov); > g_free(op); > > @@ -566,6 +568,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob > *s) > return 0; > } > > + s->initial_zeroing_ongoing = true; > for (sector_num = 0; sector_num < end; ) { > int nb_sectors = MIN(end - sector_num, > QEMU_ALIGN_DOWN(INT_MAX, s->granularity) >> > BDRV_SECTOR_BITS); > @@ -573,6 +576,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob > *s) > mirror_throttle(s); > > if (block_job_is_cancelled(&s->common)) { > + s->initial_zeroing_ongoing = false; > return 0; > } > > @@ -587,6 +591,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob > *s) > } > > mirror_wait_for_all_io(s); > + s->initial_zeroing_ongoing = false; > } > > /* First part, loop on the sectors and initialize the dirty bitmap. */ > -- > 2.7.4 >
Thanks, Applied to my block branch: git://github.com/codyprime/qemu-kvm-jtc.git block -Jeff