thebeanogamer / rpms / qemu-kvm

Forked from rpms/qemu-kvm 5 months ago
Clone
97168e
From 648193b48d8aeaded90fd657e3610d8040f505fc Mon Sep 17 00:00:00 2001
97168e
From: Kevin Wolf <kwolf@redhat.com>
97168e
Date: Thu, 12 Jan 2023 20:14:53 +0100
97168e
Subject: [PATCH 3/4] qemu-img bitmap: Report errors while closing the image
97168e
MIME-Version: 1.0
97168e
Content-Type: text/plain; charset=UTF-8
97168e
Content-Transfer-Encoding: 8bit
97168e
97168e
RH-Author: Kevin Wolf <kwolf@redhat.com>
97168e
RH-MergeRequest: 251: qemu-img: Fix exit code for errors closing the image
97168e
RH-Bugzilla: 2147617
97168e
RH-Acked-by: Hanna Czenczek <hreitz@redhat.com>
97168e
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
97168e
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
97168e
RH-Commit: [3/4] 8e13e09564718a0badd03af84f036246a46a0eba
97168e
97168e
blk_unref() can't report any errors that happen while closing the image.
97168e
For example, if qcow2 hits an -ENOSPC error while writing out dirty
97168e
bitmaps when it's closed, it prints error messages to stderr, but
97168e
'qemu-img bitmap' won't see any error return value and will therefore
97168e
look successful with exit code 0.
97168e
97168e
In order to fix this, manually inactivate the image first before calling
97168e
blk_unref(). This already performs the operations that would be most
97168e
likely to fail while closing the image, but it can still return errors.
97168e
97168e
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1330
97168e
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
97168e
Message-Id: <20230112191454.169353-4-kwolf@redhat.com>
97168e
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
97168e
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
97168e
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
97168e
(cherry picked from commit c5e477110dcb8ef4642dce399777c3dee68fa96c)
97168e
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
97168e
---
97168e
 qemu-img.c | 11 +++++++++++
97168e
 1 file changed, 11 insertions(+)
97168e
97168e
diff --git a/qemu-img.c b/qemu-img.c
97168e
index 18833f7d69..7d035c0c7f 100644
97168e
--- a/qemu-img.c
97168e
+++ b/qemu-img.c
97168e
@@ -4622,6 +4622,7 @@ static int img_bitmap(int argc, char **argv)
97168e
     QSIMPLEQ_HEAD(, ImgBitmapAction) actions;
97168e
     ImgBitmapAction *act, *act_next;
97168e
     const char *op;
97168e
+    int inactivate_ret;
97168e
 
97168e
     QSIMPLEQ_INIT(&actions);
97168e
 
97168e
@@ -4806,6 +4807,16 @@ static int img_bitmap(int argc, char **argv)
97168e
     ret = 0;
97168e
 
97168e
  out:
97168e
+    /*
97168e
+     * Manually inactivate the images first because this way we can know whether
97168e
+     * an error occurred. blk_unref() doesn't tell us about failures.
97168e
+     */
97168e
+    inactivate_ret = bdrv_inactivate_all();
97168e
+    if (inactivate_ret < 0) {
97168e
+        error_report("Error while closing the image: %s", strerror(-inactivate_ret));
97168e
+        ret = 1;
97168e
+    }
97168e
+
97168e
     blk_unref(src);
97168e
     blk_unref(blk);
97168e
     qemu_opts_del(opts);
97168e
-- 
97168e
2.37.3
97168e