Blame SOURCES/kvm-qcow2-Fix-qcow2_alloc_cluster_abort-for-external-dat.patch

ddf19c
From ecc4fb6e1941035e1d9def1f69b779fbea216caf Mon Sep 17 00:00:00 2001
ddf19c
From: Kevin Wolf <kwolf@redhat.com>
ddf19c
Date: Mon, 24 Feb 2020 16:13:07 +0000
ddf19c
Subject: [PATCH 7/9] qcow2: Fix qcow2_alloc_cluster_abort() for external data
ddf19c
 file
ddf19c
ddf19c
RH-Author: Kevin Wolf <kwolf@redhat.com>
ddf19c
Message-id: <20200224161307.29783-2-kwolf@redhat.com>
ddf19c
Patchwork-id: 94042
ddf19c
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/1] qcow2: Fix qcow2_alloc_cluster_abort() for external data file
ddf19c
Bugzilla: 1703907
ddf19c
RH-Acked-by: John Snow <jsnow@redhat.com>
ddf19c
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
ddf19c
RH-Acked-by: Max Reitz <mreitz@redhat.com>
ddf19c
ddf19c
For external data file, cluster allocations return an offset in the data
ddf19c
file and are not refcounted. In this case, there is nothing to do for
ddf19c
qcow2_alloc_cluster_abort(). Freeing the same offset in the qcow2 file
ddf19c
is wrong and causes crashes in the better case or image corruption in
ddf19c
the worse case.
ddf19c
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
Message-Id: <20200211094900.17315-3-kwolf@redhat.com>
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
(cherry picked from commit c3b6658c1a5a3fb24d6c27b2594cf86146f75b22)
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
ddf19c
---
ddf19c
 block/qcow2-cluster.c | 7 +++++--
ddf19c
 1 file changed, 5 insertions(+), 2 deletions(-)
ddf19c
ddf19c
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
ddf19c
index 8982b7b..dc3c270 100644
ddf19c
--- a/block/qcow2-cluster.c
ddf19c
+++ b/block/qcow2-cluster.c
ddf19c
@@ -1015,8 +1015,11 @@ err:
ddf19c
 void qcow2_alloc_cluster_abort(BlockDriverState *bs, QCowL2Meta *m)
ddf19c
 {
ddf19c
     BDRVQcow2State *s = bs->opaque;
ddf19c
-    qcow2_free_clusters(bs, m->alloc_offset, m->nb_clusters << s->cluster_bits,
ddf19c
-                        QCOW2_DISCARD_NEVER);
ddf19c
+    if (!has_data_file(bs)) {
ddf19c
+        qcow2_free_clusters(bs, m->alloc_offset,
ddf19c
+                            m->nb_clusters << s->cluster_bits,
ddf19c
+                            QCOW2_DISCARD_NEVER);
ddf19c
+    }
ddf19c
 }
ddf19c
 
ddf19c
 /*
ddf19c
-- 
ddf19c
1.8.3.1
ddf19c