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