From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50198) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YsqPn-0007hB-QG for qemu-devel@nongnu.org; Thu, 14 May 2015 06:30:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YsqPm-0004w3-V4 for qemu-devel@nongnu.org; Thu, 14 May 2015 06:30:55 -0400 Sender: Paolo Bonzini Message-ID: <55547956.1050701@redhat.com> Date: Thu, 14 May 2015 12:30:46 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1431431315-32079-1-git-send-email-famz@redhat.com> <1431431315-32079-2-git-send-email-famz@redhat.com> In-Reply-To: <1431431315-32079-2-git-send-email-famz@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v3 1/6] mirror: Do zero write on target if sectors not allocated List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng , qemu-devel@nongnu.org Cc: Stefan Hajnoczi , qemu-block@nongnu.org, wangxiaolong@ucloud.cn 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 > + /* > + * 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. Paolo > + mirror_write_complete, > + op); > + } else { > + /* > + * Source has irrelevant data in unmapped sectors, it's safe to > + * discard target. > + * */ > + bdrv_aio_discard(s->target, sector_num, op->nb_sectors, > + mirror_write_complete, op); > + } > + } else { > + bdrv_aio_readv(source, sector_num, &op->qiov, nb_sectors, > + mirror_read_complete, op); > + } > return delay_ns; > } > > @@ -399,6 +428,22 @@ static void coroutine_fn mirror_run(void *opaque) > length = DIV_ROUND_UP(s->bdev_length, s->granularity); > s->in_flight_bitmap = bitmap_new(length); > > + ret = bdrv_get_info(bs, &bdi); > + if (ret < 0) { > + /* Safe side. */ > + s->source_may_unmap = true; > + } else { > + s->source_may_unmap = bdi.can_write_zeroes_with_unmap; > + } > + > + ret = bdrv_get_info(s->target, &bdi); > + if (ret < 0) { > + /* Safe side. */ > + s->target_may_unmap = false; > + } else { > + s->target_may_unmap = bdi.can_write_zeroes_with_unmap; > + } > +