On Thu, 05/14 12:30, Paolo Bonzini wrote:
> 
> 
> On 12/05/2015 13:48, Fam Zheng wrote:
> > +    if (!bdrv_is_allocated_above(source, NULL, sector_num,
> > +                                 nb_sectors, &pnum)) {
> > +        op->nb_sectors = pnum;
> > +        if (s->source_may_unmap) {
> 
> Can you avoid this check by introducing bdrv_get_block_status_above?  Then:
> 
> - if BDRV_ZERO, you use bdrv_aio_write_zeroes
> 
> - if BDRV_ALLOCATED, you use bdrv_aio_readv
> 
> - else you use bdrv_aio_discard

OK, that's better.

> 
> > +            /*
> > +             * Source unallocated sectors have zero data. We can't discard
> > +             * target even if s->target_may_unmap, because the discard
> > +             * granularity may be different.
> > +             */
> > +            bdrv_aio_write_zeroes(s->target, sector_num, op->nb_sectors,
> > +                                  s->target_may_unmap ? BDRV_REQ_MAY_UNMAP 
> > : 0,
> 
> You can set the flag unconditionally.  But it's probably better to make
> this a drive-mirror argument instead of checking the target's
> BlockDriverInfo.

OK, I'll add a flag.

Fam

Reply via email to