qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk


From: Fam Zheng
Subject: Re: [Qemu-devel] [PATCH 1/3] mirror: Don't extend the last sub-chunk
Date: Wed, 20 Apr 2016 09:13:08 +0800
User-agent: Mutt/1.5.24 (2015-08-30)

On Tue, 04/19 22:33, Max Reitz wrote:
> On 19.04.2016 12:09, Fam Zheng wrote:
> > The last sub-chunk is rounded up to the copy granularity in the target
> > image, resulting in a larger size than the source.
> > 
> > Add a function to clip the copied sectors to the end.
> > 
> > This undoes the "wrong" changes to tests/qemu-iotests/109.out in
> > e5b43573e28. The remaining two offset changes are okay.
> > 
> > Reported-by: Kevin Wolf <address@hidden>
> > Signed-off-by: Fam Zheng <address@hidden>
> > ---
> >  block/mirror.c             | 10 ++++++++++
> >  tests/qemu-iotests/109.out | 44 
> > ++++++++++++++++++++++----------------------
> >  2 files changed, 32 insertions(+), 22 deletions(-)
> > 
> > diff --git a/block/mirror.c b/block/mirror.c
> > index c2cfc1a..b6387f1 100644
> > --- a/block/mirror.c
> > +++ b/block/mirror.c
> > @@ -205,6 +205,14 @@ static inline void mirror_wait_for_io(MirrorBlockJob 
> > *s)
> >      s->waiting_for_io = false;
> >  }
> >  
> > +static inline void mirror_clip_sectors(MirrorBlockJob *s,
> > +                                       int64_t sector_num,
> > +                                       int *nb_sectors)
> > +{
> > +    *nb_sectors = MIN(*nb_sectors,
> > +                      s->bdev_length / BDRV_SECTOR_SIZE - sector_num);
> > +}
> > +
> >  /* Submit async read while handling COW.
> >   * Returns: nb_sectors if no alignment is necessary, or
> >   *          (new_end - sector_num) if tail is rounded up or down due to
> > @@ -240,6 +248,7 @@ static int mirror_do_read(MirrorBlockJob *s, int64_t 
> > sector_num,
> >          mirror_wait_for_io(s);
> >      }
> >  
> > +    mirror_clip_sectors(s, sector_num, &nb_sectors);
> >      /* Allocate a MirrorOp that is used as an AIO callback.  */
> >      op = g_new(MirrorOp, 1);
> >      op->s = s;
> 
> I think you want to adjust the ret value, too. It doesn't really matter
> in practice (the caller just overshoots the end of the image instead of
> getting precisely to its end), but I wouldn't rely on this.
> 
> > @@ -276,6 +285,7 @@ static void mirror_do_zero_or_discard(MirrorBlockJob *s,
> >  {
> >      MirrorOp *op;
> >  
> > +    mirror_clip_sectors(s, sector_num, &nb_sectors);
> >      /* Allocate a MirrorOp that is used as an AIO callback. The qiov is 
> > zeroed
> >       * so the freeing in mirror_iteration_done is nop. */
> >      op = g_new0(MirrorOp, 1);
> 
> I think it would be best to just pull out the mirror_clip_sectors() from
> these functions and put it above the "switch (mirror_method)" in
> mirror_iteration().
> 
> We'd just have to make sure that mirror_cow_align() will not increase
> nb_sectors such that it points beyond the image end. It can do that,
> because and image's size does not need to be aligned to its cluster
> size. But just putting a mirror_clip_sectors() below the
> bdrv_round_to_clusters() call in mirror_cow_align() should fix that.
> 
> Then you wouldn't need to worry about fixing the ret value in
> mirror_do_read().

Sounds good, will do this.

Thanks,
Fam



reply via email to

[Prev in Thread] Current Thread [Next in Thread]