99cbc7
From 6390ac69fb3686455e81c562c5cd319ed02ac2aa Mon Sep 17 00:00:00 2001
99cbc7
Message-Id: <6390ac69fb3686455e81c562c5cd319ed02ac2aa@dist-git>
99cbc7
From: Jiri Denemark <jdenemar@redhat.com>
99cbc7
Date: Fri, 16 Aug 2019 14:52:31 +0200
99cbc7
Subject: [PATCH] qemu: Pass correct qemuCaps to virDomainDefParseString
99cbc7
MIME-Version: 1.0
99cbc7
Content-Type: text/plain; charset=UTF-8
99cbc7
Content-Transfer-Encoding: 8bit
99cbc7
99cbc7
Since qemuDomainDefPostParse callback requires qemuCaps, we need to make
99cbc7
sure it gets the capabilities stored in the domain's private data if the
99cbc7
domain is running. Passing NULL may cause QEMU capabilities probing to
99cbc7
be triggered in case QEMU binary changed in the meantime. When this
99cbc7
happens while a running domain object is locked, QMP event delivered to
99cbc7
the domain before QEMU capabilities probing finishes will deadlock the
99cbc7
event loop.
99cbc7
99cbc7
This patch fixes all paths leading to virDomainDefParseString.
99cbc7
99cbc7
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
99cbc7
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
99cbc7
(cherry picked from commit 6e7c33dad7f2f90182c452917f3a555e2c878d42)
99cbc7
99cbc7
Conflicts:
99cbc7
	src/qemu/qemu_driver.c
99cbc7
            - snapshots are not based on virDomainMomentDef
99cbc7
            - no checkpoint APIs
99cbc7
99cbc7
https://bugzilla.redhat.com/show_bug.cgi?id=1731783
99cbc7
99cbc7
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
99cbc7
Message-Id: <2728b24106e1e361cf9766ea8f9eeec782df6b20.1565959866.git.jdenemar@redhat.com>
99cbc7
Reviewed-by: Ján Tomko <jtomko@redhat.com>
99cbc7
---
99cbc7
 src/qemu/qemu_driver.c | 6 ++++--
99cbc7
 1 file changed, 4 insertions(+), 2 deletions(-)
99cbc7
99cbc7
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
99cbc7
index 590596a421..3f8530eb0e 100644
99cbc7
--- a/src/qemu/qemu_driver.c
99cbc7
+++ b/src/qemu/qemu_driver.c
99cbc7
@@ -3307,7 +3307,8 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver,
99cbc7
     if (xmlin) {
99cbc7
         virDomainDefPtr def = NULL;
99cbc7
 
99cbc7
-        if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, NULL,
99cbc7
+        if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt,
99cbc7
+                                            priv->qemuCaps,
99cbc7
                                             VIR_DOMAIN_DEF_PARSE_INACTIVE |
99cbc7
                                             VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) {
99cbc7
             goto endjob;
99cbc7
@@ -15405,7 +15406,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
99cbc7
         if (!(xml = qemuDomainDefFormatLive(driver, priv->qemuCaps,
99cbc7
                                             vm->def, priv->origCPU,
99cbc7
                                             true, true)) ||
99cbc7
-            !(def->dom = virDomainDefParseString(xml, caps, driver->xmlopt, NULL,
99cbc7
+            !(def->dom = virDomainDefParseString(xml, caps, driver->xmlopt,
99cbc7
+                                                 priv->qemuCaps,
99cbc7
                                                  VIR_DOMAIN_DEF_PARSE_INACTIVE |
99cbc7
                                                  VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
99cbc7
             goto endjob;
99cbc7
-- 
99cbc7
2.22.1
99cbc7