]> git.proxmox.com Git - mirror_qemu.git/commitdiff
qemu-img: Use BDRV_REQ_NO_FALLBACK for pre-zeroing
authorKevin Wolf <kwolf@redhat.com>
Fri, 22 Mar 2019 12:49:28 +0000 (13:49 +0100)
committerKevin Wolf <kwolf@redhat.com>
Tue, 26 Mar 2019 10:37:51 +0000 (11:37 +0100)
If qemu-img convert sees that the target image isn't zero-initialised
yet, it tries to do an efficient zero write for the whole image first
to save the overhead of repeated explicit zero writes during the
conversion. Obviously, this provides only an advantage if the
pre-zeroing is actually efficient. Otherwise, we can end up writing
zeroes slowly while zeroing out the whole image, and then overwrite the
same blocks again with real data, potentially doubling the written data.

Pass BDRV_REQ_NO_FALLBACK to blk_make_zero() to avoid this case. If we
can't efficiently zero out, we'll instead write explicit zeroes only if
there is no data to be written to a block.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Eric Blake <eblake@redhat.com>
qemu-img.c

index 5fac84074289f564929f0f42e6cb7ed1b6172198..8ee63daeaeb4f897b2da639983ee82980c5b12a5 100644 (file)
@@ -1932,7 +1932,7 @@ static int convert_do_copy(ImgConvertState *s)
     if (!s->has_zero_init && !s->target_has_backing &&
         bdrv_can_write_zeroes_with_unmap(blk_bs(s->target)))
     {
-        ret = blk_make_zero(s->target, BDRV_REQ_MAY_UNMAP);
+        ret = blk_make_zero(s->target, BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK);
         if (ret == 0) {
             s->has_zero_init = true;
         }