dc7afb
From eea45924903f03dc6d8f20576be0a4a84d5acce4 Mon Sep 17 00:00:00 2001
dc7afb
From: Kevin Wolf <kwolf@redhat.com>
dc7afb
Date: Wed, 10 Feb 2021 10:16:11 -0500
dc7afb
Subject: [PATCH 4/5] qemu-img convert: Don't pre-zero images
dc7afb
dc7afb
RH-Author: Kevin Wolf <kwolf@redhat.com>
dc7afb
Message-id: <20210210101611.137928-2-kwolf@redhat.com>
dc7afb
Patchwork-id: 101030
dc7afb
O-Subject: [RHEL-8.4.0 qemu-kvm PATCH 1/1] qemu-img convert: Don't pre-zero images
dc7afb
Bugzilla: 1855250
dc7afb
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
dc7afb
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
dc7afb
RH-Acked-by: Max Reitz <mreitz@redhat.com>
dc7afb
dc7afb
Since commit 5a37b60a61c, qemu-img create will pre-zero the target image
dc7afb
if it isn't already zero-initialised (most importantly, for host block
dc7afb
devices, but also iscsi etc.), so that writing explicit zeros wouldn't
dc7afb
be necessary later.
dc7afb
dc7afb
This could speed up the operation significantly, in particular when the
dc7afb
source image file was only sparsely populated. However, it also means
dc7afb
that some block are written twice: Once when pre-zeroing them, and then
dc7afb
when they are overwritten with actual data. On a full image, the
dc7afb
pre-zeroing is wasted work because everything will be overwritten.
dc7afb
dc7afb
In practice, write_zeroes typically turns out faster than writing
dc7afb
explicit zero buffers, but slow enough that first zeroing everything and
dc7afb
then overwriting parts can be a significant net loss.
dc7afb
dc7afb
Meanwhile, qemu-img convert was rewritten in 690c7301600 and zero blocks
dc7afb
are now written to the target using bdrv_co_pwrite_zeroes() if the
dc7afb
target could be pre-zeroed. This way we already make use of the faster
dc7afb
write_zeroes operation, but avoid writing any blocks twice.
dc7afb
dc7afb
Remove the pre-zeroing because these days this former optimisation has
dc7afb
actually turned into a pessimisation in the common case.
dc7afb
dc7afb
Reported-by: Nir Soffer <nsoffer@redhat.com>
dc7afb
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
dc7afb
Message-Id: <20200622151203.35624-1-kwolf@redhat.com>
dc7afb
Tested-by:  Nir Soffer <nsoffer@redhat.com>
dc7afb
Reviewed-by: Eric Blake <eblake@redhat.com>
dc7afb
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
dc7afb
(cherry picked from commit edafc70c0c8510862f2f213a3acf7067113bcd08)
dc7afb
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
dc7afb
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
dc7afb
---
dc7afb
 qemu-img.c | 9 ---------
dc7afb
 1 file changed, 9 deletions(-)
dc7afb
dc7afb
diff --git a/qemu-img.c b/qemu-img.c
dc7afb
index a27ad70851..b10dc5129b 100644
dc7afb
--- a/qemu-img.c
dc7afb
+++ b/qemu-img.c
dc7afb
@@ -2029,15 +2029,6 @@ static int convert_do_copy(ImgConvertState *s)
dc7afb
         s->has_zero_init = false;
dc7afb
     }
dc7afb
 
dc7afb
-    if (!s->has_zero_init && !s->target_has_backing &&
dc7afb
-        bdrv_can_write_zeroes_with_unmap(blk_bs(s->target)))
dc7afb
-    {
dc7afb
-        ret = blk_make_zero(s->target, BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK);
dc7afb
-        if (ret == 0) {
dc7afb
-            s->has_zero_init = true;
dc7afb
-        }
dc7afb
-    }
dc7afb
-
dc7afb
     /* Allocate buffer for copied data. For compressed images, only one cluster
dc7afb
      * can be copied at a time. */
dc7afb
     if (s->compressed) {
dc7afb
-- 
dc7afb
2.27.0
dc7afb