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

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