Blame SOURCES/kvm-qcow2-Free-allocated-clusters-on-write-error.patch

1bdc94
From d53f85c0fbaf3b7936e7a4b0f019be986a39fe7a Mon Sep 17 00:00:00 2001
1bdc94
From: Kevin Wolf <kwolf@redhat.com>
1bdc94
Date: Mon, 2 Jul 2018 15:40:07 +0200
1bdc94
Subject: [PATCH 54/57] qcow2: Free allocated clusters on write error
1bdc94
1bdc94
RH-Author: Kevin Wolf <kwolf@redhat.com>
1bdc94
Message-id: <20180702154008.15533-3-kwolf@redhat.com>
1bdc94
Patchwork-id: 81185
1bdc94
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH 2/3] qcow2: Free allocated clusters on write error
1bdc94
Bugzilla: 1528541
1bdc94
RH-Acked-by: Max Reitz <mreitz@redhat.com>
1bdc94
RH-Acked-by: Fam Zheng <famz@redhat.com>
1bdc94
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
1bdc94
1bdc94
If we managed to allocate the clusters, but then failed to write the
1bdc94
data, there's a good chance that we'll still be able to free the
1bdc94
clusters again in order to avoid cluster leaks (the refcounts are
1bdc94
cached, so even if we can't write them out right now, we may be able to
1bdc94
do so when the VM is resumed after a werror=stop/enospc pause).
1bdc94
1bdc94
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
Reviewed-by: Max Reitz <mreitz@redhat.com>
1bdc94
Reviewed-by: Eric Blake <eblake@redhat.com>
1bdc94
Tested-by: Eric Blake <eblake@redhat.com>
1bdc94
(cherry picked from commit 8b24cd141549b5b264baeddd4e72902cfb5de23b)
1bdc94
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
---
1bdc94
 block/qcow2-cluster.c | 11 +++++++++++
1bdc94
 block/qcow2.c         |  2 ++
1bdc94
 block/qcow2.h         |  1 +
1bdc94
 3 files changed, 14 insertions(+)
1bdc94
1bdc94
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
1bdc94
index 1aee726..c90e2ec 100644
1bdc94
--- a/block/qcow2-cluster.c
1bdc94
+++ b/block/qcow2-cluster.c
1bdc94
@@ -994,6 +994,17 @@ err:
1bdc94
     return ret;
1bdc94
  }
1bdc94
 
1bdc94
+/**
1bdc94
+ * Frees the allocated clusters because the request failed and they won't
1bdc94
+ * actually be linked.
1bdc94
+ */
1bdc94
+void qcow2_alloc_cluster_abort(BlockDriverState *bs, QCowL2Meta *m)
1bdc94
+{
1bdc94
+    BDRVQcow2State *s = bs->opaque;
1bdc94
+    qcow2_free_clusters(bs, m->alloc_offset, m->nb_clusters << s->cluster_bits,
1bdc94
+                        QCOW2_DISCARD_NEVER);
1bdc94
+}
1bdc94
+
1bdc94
 /*
1bdc94
  * Returns the number of contiguous clusters that can be used for an allocating
1bdc94
  * write, but require COW to be performed (this includes yet unallocated space,
1bdc94
diff --git a/block/qcow2.c b/block/qcow2.c
1bdc94
index 4404dc7..da74e2a 100644
1bdc94
--- a/block/qcow2.c
1bdc94
+++ b/block/qcow2.c
1bdc94
@@ -1771,6 +1771,8 @@ static coroutine_fn int qcow2_handle_l2meta(BlockDriverState *bs,
1bdc94
             if (ret) {
1bdc94
                 goto out;
1bdc94
             }
1bdc94
+        } else {
1bdc94
+            qcow2_alloc_cluster_abort(bs, l2meta);
1bdc94
         }
1bdc94
 
1bdc94
         /* Take the request off the list of running requests */
1bdc94
diff --git a/block/qcow2.h b/block/qcow2.h
1bdc94
index adf5c39..b5e2aa3 100644
1bdc94
--- a/block/qcow2.h
1bdc94
+++ b/block/qcow2.h
1bdc94
@@ -618,6 +618,7 @@ uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
1bdc94
                                          int compressed_size);
1bdc94
 
1bdc94
 int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
1bdc94
+void qcow2_alloc_cluster_abort(BlockDriverState *bs, QCowL2Meta *m);
1bdc94
 int qcow2_cluster_discard(BlockDriverState *bs, uint64_t offset,
1bdc94
                           uint64_t bytes, enum qcow2_discard_type type,
1bdc94
                           bool full_discard);
1bdc94
-- 
1bdc94
1.8.3.1
1bdc94