From 87e2654e4328ebf61e47f306acc5cf2cfbc2f26a Mon Sep 17 00:00:00 2001 Message-Id: <87e2654e4328ebf61e47f306acc5cf2cfbc2f26a.1430330503.git.jen@redhat.com> In-Reply-To: References: From: Jeffrey Cody Date: Tue, 28 Apr 2015 16:25:41 -0500 Subject: [CHANGE 29/29] qcow2: Zero write support To: rhvirt-patches@redhat.com, jen@redhat.com RH-Author: Jeffrey Cody Message-id: <607c604ce4e92269b7a466113cce411efdbbf389.1430235071.git.jcody@redhat.com> Patchwork-id: 64947 O-Subject: [RHEL-6.7 qemu-kvm PATCH v2] qcow2: Zero write support Bugzilla: 1130014 RH-Acked-by: Stefan Hajnoczi RH-Acked-by: Max Reitz RH-Acked-by: Kevin Wolf RH-Acked-by: Fam Zheng Signed-off-by: Kevin Wolf (cherry picked from commit 621f058940ea9f1ef3d8774ef3203544f1228df1) RHEL6 Notes: QCOW2 changes not applied, we are interested only in the block.c parts. Signed-off-by: Jeff Cody --- Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1130014 Brew: http://brewweb.devel.redhat.com/brew/taskinfo?taskID=9061391 block.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) Signed-off-by: Jeff E. Nelson --- block.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/block.c b/block.c index 628eb50..d77ccd8 100644 --- a/block.c +++ b/block.c @@ -80,6 +80,8 @@ static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs, void *opaque, bool is_write); static void coroutine_fn bdrv_co_do_rw(void *opaque); +static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs, + int64_t sector_num, int nb_sectors); static QTAILQ_HEAD(, BlockDriverState) bdrv_states = QTAILQ_HEAD_INITIALIZER(bdrv_states); @@ -2182,8 +2184,8 @@ static int coroutine_fn bdrv_co_do_copy_on_readv(BlockDriverState *bs, if (drv->bdrv_co_write_zeroes && buffer_is_zero(bounce_buffer, iov.iov_len)) { - ret = drv->bdrv_co_write_zeroes(bs, cluster_sector_num, - cluster_nb_sectors); + ret = bdrv_co_do_write_zeroes(bs, cluster_sector_num, + cluster_nb_sectors); } else { ret = drv->bdrv_co_writev(bs, cluster_sector_num, cluster_nb_sectors, &bounce_qiov); @@ -2321,9 +2323,15 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs, struct iovec iov; int ret; + /* TODO Emulate only part of misaligned requests instead of letting block + * drivers return -ENOTSUP and emulate everything */ + /* First try the efficient write zeroes operation */ if (drv->bdrv_co_write_zeroes) { - return drv->bdrv_co_write_zeroes(bs, sector_num, nb_sectors); + ret = drv->bdrv_co_write_zeroes(bs, sector_num, nb_sectors); + if (ret != -ENOTSUP) { + return ret; + } } /* Fall back to bounce buffer if write zeroes is unsupported */ -- 2.1.0