cryptospore / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/0027-blockdev-ignore-cache-options-for-empty-CDROM-drives.patch

76daa3
From 89b162019bfd202bbbd00563d03a030c2f7c1395 Mon Sep 17 00:00:00 2001
76daa3
From: John Snow <jsnow@redhat.com>
76daa3
Date: Fri, 16 Sep 2016 22:06:28 +0200
76daa3
Subject: blockdev: ignore cache options for empty CDROM drives
76daa3
76daa3
RH-Author: John Snow <jsnow@redhat.com>
76daa3
Message-id: <1474063588-6370-2-git-send-email-jsnow@redhat.com>
76daa3
Patchwork-id: 72377
76daa3
O-Subject: [RHEV-7.3 qemu-kvm-rhev PATCH 1/1] blockdev: ignore cache options for empty CDROM drives
76daa3
Bugzilla: 1342999
76daa3
RH-Acked-by: Max Reitz <mreitz@redhat.com>
76daa3
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
76daa3
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
76daa3
76daa3
In qemu-kvm-rhev-2.3.0, QEMU will accept cache options for empty CDROM
76daa3
devices, but silently ignore them as they will be overwritten when the
76daa3
next CDROM is inserted.
76daa3
76daa3
Libvirt and VMM are capable of generating XML configurations which
76daa3
attempt to specify these cache options to QEMU, though they don't have
76daa3
any effect.
76daa3
76daa3
Upstream, a refactoring of cache option mechanisms means that we have
76daa3
started rejecting invalid configurations where cache options are supplied
76daa3
without any target to actually apply them to.
76daa3
76daa3
This means that there are combinations of QEMU and libvirt that will fail
76daa3
to start a VM if a user selects a cache option.
76daa3
76daa3
This patch is a downstream-only workaround until libvirt can stop
76daa3
supplying cache settings for empty CDROMs and/or until libvirt can take
76daa3
advantage of the new QMP tray/medium manipulation mechanisms that will
76daa3
allow proper cache specification for removable media.
76daa3
76daa3
Signed-off-by: John Snow <jsnow@redhat.com>
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
(cherry picked from commit f9bc62a9e433fb67845477fd76e0c2b8d6685b93)
76daa3
(cherry picked from commit 018339d32a9393371c1a49ff52e83de7d2ec4910)
76daa3
---
76daa3
 blockdev.c | 28 +++++++++++++++++++++++++++-
76daa3
 1 file changed, 27 insertions(+), 1 deletion(-)
76daa3
76daa3
diff --git a/blockdev.c b/blockdev.c
76daa3
index dddf2e1..a52e035 100644
76daa3
--- a/blockdev.c
76daa3
+++ b/blockdev.c
76daa3
@@ -448,6 +448,32 @@ static void extract_common_blockdev_options(QemuOpts *opts, int *bdrv_flags,
76daa3
     }
76daa3
 }
76daa3
 
76daa3
+/**
76daa3
+ * libvirt expects to be able to pass cache options for CDROM drives without
76daa3
+ * inserted media. Historically, QEMU eventually ignores these cache options as
76daa3
+ * they are lost when media is inserted. Recently, QEMU started rejecting these
76daa3
+ * configurations. Libvirt however still generates such configurations.
76daa3
+ *
76daa3
+ * To prevent QEMU from being unable to start, pretend there are no options
76daa3
+ * present if the only options present are cache options for the BDS.
76daa3
+ */
76daa3
+static bool __redhat_com_has_bs_opts(QDict *bs_opts)
76daa3
+{
76daa3
+    size_t n, s;
76daa3
+    s = qdict_size(bs_opts);
76daa3
+
76daa3
+    if (s == 0) {
76daa3
+        return false;
76daa3
+    } else if (s > 2) {
76daa3
+        return true;
76daa3
+    }
76daa3
+
76daa3
+    n = qdict_haskey(bs_opts, BDRV_OPT_CACHE_DIRECT);
76daa3
+    n += qdict_haskey(bs_opts, BDRV_OPT_CACHE_NO_FLUSH);
76daa3
+
76daa3
+    return s != n;
76daa3
+}
76daa3
+
76daa3
 /* Takes the ownership of bs_opts */
76daa3
 static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
76daa3
                                    Error **errp)
76daa3
@@ -555,7 +581,7 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
76daa3
     read_only = qemu_opt_get_bool(opts, BDRV_OPT_READ_ONLY, false);
76daa3
 
76daa3
     /* init */
76daa3
-    if ((!file || !*file) && !qdict_size(bs_opts)) {
76daa3
+    if ((!file || !*file) && !__redhat_com_has_bs_opts(bs_opts)) {
76daa3
         BlockBackendRootState *blk_rs;
76daa3
 
76daa3
         blk = blk_new(0, BLK_PERM_ALL);
76daa3
-- 
76daa3
1.8.3.1
76daa3