218e99
From 76196ca1133605fa60365b6d00eff5b97fa758ea Mon Sep 17 00:00:00 2001
218e99
From: Paolo Bonzini <pbonzini@redhat.com>
218e99
Date: Fri, 18 Oct 2013 08:14:35 +0200
218e99
Subject: [PATCH 10/81] qemu-img: always probe the input image for allocated sectors
218e99
218e99
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
218e99
Message-id: <1382084091-16636-11-git-send-email-pbonzini@redhat.com>
218e99
Patchwork-id: 54993
218e99
O-Subject: [RHEL 7.0 qemu-kvm PATCH 10/26] qemu-img: always probe the input image for allocated sectors
218e99
Bugzilla: 989646
218e99
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
218e99
RH-Acked-by: Max Reitz <mreitz@redhat.com>
218e99
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
218e99
218e99
qemu-img convert can assume "that sectors which are unallocated in the
218e99
input image are present in both the output's and input's base images".
218e99
218e99
However it is only doing this if the output image returns true for
218e99
bdrv_has_zero_init().  Testing bdrv_has_zero_init() does not make much
218e99
sense if the output image is copy-on-write, because a copy-on-write
218e99
image is never initialized to zero (it is initialized to the content
218e99
of the backing file).
218e99
218e99
There is nothing here that makes has_zero_init images special.  The
218e99
input and output must be equal for the operation to make sense, and
218e99
that's it.
218e99
218e99
Reviewed-by: Eric Blake <eblake@redhat.com>
218e99
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
218e99
(cherry picked from commit e4a86f88cc6b214c37b4abe9160e41f0338ce4cd)
218e99
---
218e99
 qemu-img.c | 40 +++++++++++++++++++---------------------
218e99
 1 file changed, 19 insertions(+), 21 deletions(-)
218e99
218e99
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
---
218e99
 qemu-img.c |   40 +++++++++++++++++++---------------------
218e99
 1 files changed, 19 insertions(+), 21 deletions(-)
218e99
218e99
diff --git a/qemu-img.c b/qemu-img.c
218e99
index 28efb4f..71cbc59 100644
218e99
--- a/qemu-img.c
218e99
+++ b/qemu-img.c
218e99
@@ -1476,28 +1476,26 @@ static int img_convert(int argc, char **argv)
218e99
                 n = bs_offset + bs_sectors - sector_num;
218e99
             }
218e99
 
218e99
-            if (has_zero_init) {
218e99
-                /* If the output image is being created as a copy on write image,
218e99
-                   assume that sectors which are unallocated in the input image
218e99
-                   are present in both the output's and input's base images (no
218e99
-                   need to copy them). */
218e99
-                if (out_baseimg) {
218e99
-                    ret = bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
218e99
-                                            n, &n1;;
218e99
-                    if (ret < 0) {
218e99
-                        error_report("error while reading metadata for sector "
218e99
-                                     "%" PRId64 ": %s",
218e99
-                                     sector_num - bs_offset, strerror(-ret));
218e99
-                        goto out;
218e99
-                    }
218e99
-                    if (!ret) {
218e99
-                        sector_num += n1;
218e99
-                        continue;
218e99
-                    }
218e99
-                    /* The next 'n1' sectors are allocated in the input image. Copy
218e99
-                       only those as they may be followed by unallocated sectors. */
218e99
-                    n = n1;
218e99
+            /* If the output image is being created as a copy on write image,
218e99
+               assume that sectors which are unallocated in the input image
218e99
+               are present in both the output's and input's base images (no
218e99
+               need to copy them). */
218e99
+            if (out_baseimg) {
218e99
+                ret = bdrv_is_allocated(bs[bs_i], sector_num - bs_offset,
218e99
+                                        n, &n1;;
218e99
+                if (ret < 0) {
218e99
+                    error_report("error while reading metadata for sector "
218e99
+                                 "%" PRId64 ": %s",
218e99
+                                 sector_num - bs_offset, strerror(-ret));
218e99
+                    goto out;
218e99
+                }
218e99
+                if (!ret) {
218e99
+                    sector_num += n1;
218e99
+                    continue;
218e99
                 }
218e99
+                /* The next 'n1' sectors are allocated in the input image. Copy
218e99
+                   only those as they may be followed by unallocated sectors. */
218e99
+                n = n1;
218e99
             } else {
218e99
                 n1 = n;
218e99
             }
218e99
-- 
218e99
1.7.1
218e99