From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40594) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c90sY-0001Oi-ET for qemu-devel@nongnu.org; Mon, 21 Nov 2016 21:32:15 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c90sX-0003Ij-Aj for qemu-devel@nongnu.org; Mon, 21 Nov 2016 21:32:14 -0500 References: <20161121012439.2394-1-w90p710@gmail.com> From: wyang Message-ID: <5833AE1C.2050708@gmail.com> Date: Tue, 22 Nov 2016 10:31:56 +0800 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH] block/mirror: enable detect zeroes when driving mirror List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Vasiliy Tolstov Cc: qemu-devel@nongnu.org, jcody@redhat.com, qemu-block@nongnu.org On 2016年11月21日 14:51, Vasiliy Tolstov wrote: > > 21 Ноя 2016 г. 4:27 пользователь "Yang Wei" > написал: > > > > In order to preserve sparse disk image, detect_zeroes > > should also be enabled when bdrv_get_block_status_above() > > returns BDRV_BLOCK_DATA > > > > Signed-off-by: Yang Wei > > > --- > > Hi, does this patch fixes bug > https://bugzilla.redhat.com/show_bug.cgi?id=1219541 ? Or it unrelated > to this issue? > yes, you also need to backport the functionality of NBD's write zeroes( fa778f and 1f4d6d) Thanks Wei > > > > block/mirror.c | 7 +++++++ > > 1 file changed, 7 insertions(+) > > > > diff --git a/block/mirror.c b/block/mirror.c > > index b2c1fb8..8b20b7a 100644 > > --- a/block/mirror.c > > +++ b/block/mirror.c > > @@ -76,6 +76,7 @@ typedef struct MirrorOp { > > QEMUIOVector qiov; > > int64_t sector_num; > > int nb_sectors; > > + BlockdevDetectZeroesOptions backup_detect_zeroes; > > } MirrorOp; > > > > static BlockErrorAction mirror_error_action(MirrorBlockJob *s, bool > read, > > @@ -132,6 +133,8 @@ static void mirror_write_complete(void *opaque, > int ret) > > { > > MirrorOp *op = opaque; > > MirrorBlockJob *s = op->s; > > + BlockDriverState *target = s->target; > > + target->detect_zeroes = op->backup_detect_zeroes; > > if (ret < 0) { > > BlockErrorAction action; > > > > @@ -148,6 +151,7 @@ static void mirror_read_complete(void *opaque, > int ret) > > { > > MirrorOp *op = opaque; > > MirrorBlockJob *s = op->s; > > + BlockDriverState *target = s->target; > > if (ret < 0) { > > BlockErrorAction action; > > > > @@ -160,6 +164,9 @@ static void mirror_read_complete(void *opaque, > int ret) > > mirror_iteration_done(op, ret); > > return; > > } > > + op->backup_detect_zeroes = target->detect_zeroes; > > + target->detect_zeroes = s->unmap ? > BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP : > > + BLOCKDEV_DETECT_ZEROES_OPTIONS_ON; > > blk_aio_pwritev(s->target, op->sector_num * BDRV_SECTOR_SIZE, > &op->qiov, > > 0, mirror_write_complete, op); > > } > > -- > > 2.10.2 > > > > >