|
|
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 |
|