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