7b4659
From b0e155481dd03971fe3d24b9abbe3cdf0e2373c4 Mon Sep 17 00:00:00 2001
7b4659
Message-Id: <b0e155481dd03971fe3d24b9abbe3cdf0e2373c4@dist-git>
7b4659
From: Jiri Denemark <jdenemar@redhat.com>
7b4659
Date: Fri, 16 Aug 2019 14:52:29 +0200
7b4659
Subject: [PATCH] qemu: Pass qemuCaps to qemuDomainSaveImageOpen
7b4659
MIME-Version: 1.0
7b4659
Content-Type: text/plain; charset=UTF-8
7b4659
Content-Transfer-Encoding: 8bit
7b4659
7b4659
Since qemuDomainDefPostParse callback requires qemuCaps, we need to make
7b4659
sure it gets the capabilities stored in the domain's private data if the
7b4659
domain is running. Passing NULL may cause QEMU capabilities probing to
7b4659
be triggered in case QEMU binary changed in the meantime. When this
7b4659
happens while a running domain object is locked, QMP event delivered to
7b4659
the domain before QEMU capabilities probing finishes will deadlock the
7b4659
event loop.
7b4659
7b4659
This patch fixes all paths leading to qemuDomainSaveImageOpen.
7b4659
7b4659
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
7b4659
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
7b4659
(cherry picked from commit fd60aefec7f49d1053efdd5119db494bb474aeec)
7b4659
7b4659
https://bugzilla.redhat.com/show_bug.cgi?id=1731783
7b4659
https://bugzilla.redhat.com/show_bug.cgi?id=1742023
7b4659
7b4659
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
7b4659
Message-Id: <6206f14c127037e0822fb6c1e04e8f2d8e6069ce.1565959866.git.jdenemar@redhat.com>
7b4659
Reviewed-by: Ján Tomko <jtomko@redhat.com>
7b4659
---
7b4659
 src/qemu/qemu_driver.c | 14 ++++++++------
7b4659
 1 file changed, 8 insertions(+), 6 deletions(-)
7b4659
7b4659
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
7b4659
index 7d87215904..04915798ab 100644
7b4659
--- a/src/qemu/qemu_driver.c
7b4659
+++ b/src/qemu/qemu_driver.c
7b4659
@@ -6368,6 +6368,7 @@ qemuDomainSaveImageUpdateDef(virQEMUDriverPtr driver,
7b4659
 /**
7b4659
  * qemuDomainSaveImageOpen:
7b4659
  * @driver: qemu driver data
7b4659
+ * @qemuCaps: pointer to qemuCaps if the domain is running or NULL
7b4659
  * @path: path of the save image
7b4659
  * @ret_def: returns domain definition created from the XML stored in the image
7b4659
  * @ret_data: returns structure filled with data from the image header
7b4659
@@ -6382,6 +6383,7 @@ qemuDomainSaveImageUpdateDef(virQEMUDriverPtr driver,
7b4659
  */
7b4659
 static int ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4)
7b4659
 qemuDomainSaveImageOpen(virQEMUDriverPtr driver,
7b4659
+                        virQEMUCapsPtr qemuCaps,
7b4659
                         const char *path,
7b4659
                         virDomainDefPtr *ret_def,
7b4659
                         virQEMUSaveDataPtr *ret_data,
7b4659
@@ -6506,7 +6508,7 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver,
7b4659
     }
7b4659
 
7b4659
     /* Create a domain from this XML */
7b4659
-    if (!(def = virDomainDefParseString(data->xml, caps, driver->xmlopt, NULL,
7b4659
+    if (!(def = virDomainDefParseString(data->xml, caps, driver->xmlopt, qemuCaps,
7b4659
                                         VIR_DOMAIN_DEF_PARSE_INACTIVE |
7b4659
                                         VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
7b4659
         goto error;
7b4659
@@ -6681,7 +6683,7 @@ qemuDomainRestoreFlags(virConnectPtr conn,
7b4659
 
7b4659
     virNWFilterReadLockFilterUpdates();
7b4659
 
7b4659
-    fd = qemuDomainSaveImageOpen(driver, path, &def, &data,
7b4659
+    fd = qemuDomainSaveImageOpen(driver, NULL, path, &def, &data,
7b4659
                                  (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != 0,
7b4659
                                  &wrapperFd, false, false);
7b4659
     if (fd < 0)
7b4659
@@ -6779,7 +6781,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *path,
7b4659
     /* We only take subset of virDomainDefFormat flags.  */
7b4659
     virCheckFlags(VIR_DOMAIN_XML_SECURE, NULL);
7b4659
 
7b4659
-    fd = qemuDomainSaveImageOpen(driver, path, &def, &data,
7b4659
+    fd = qemuDomainSaveImageOpen(driver, NULL, path, &def, &data,
7b4659
                                  false, NULL, false, false);
7b4659
 
7b4659
     if (fd < 0)
7b4659
@@ -6817,7 +6819,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, const char *path,
7b4659
     else if (flags & VIR_DOMAIN_SAVE_PAUSED)
7b4659
         state = 0;
7b4659
 
7b4659
-    fd = qemuDomainSaveImageOpen(driver, path, &def, &data,
7b4659
+    fd = qemuDomainSaveImageOpen(driver, NULL, path, &def, &data,
7b4659
                                  false, NULL, true, false);
7b4659
 
7b4659
     if (fd < 0)
7b4659
@@ -6902,7 +6904,7 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, unsigned int flags)
7b4659
         goto cleanup;
7b4659
     }
7b4659
 
7b4659
-    if ((fd = qemuDomainSaveImageOpen(driver, path, &def, &data,
7b4659
+    if ((fd = qemuDomainSaveImageOpen(driver, priv->qemuCaps, path, &def, &data,
7b4659
                                       false, NULL, false, false)) < 0)
7b4659
         goto cleanup;
7b4659
 
7b4659
@@ -6969,7 +6971,7 @@ qemuDomainObjRestore(virConnectPtr conn,
7b4659
     virQEMUSaveDataPtr data = NULL;
7b4659
     virFileWrapperFdPtr wrapperFd = NULL;
7b4659
 
7b4659
-    fd = qemuDomainSaveImageOpen(driver, path, &def, &data,
7b4659
+    fd = qemuDomainSaveImageOpen(driver, NULL, path, &def, &data,
7b4659
                                  bypass_cache, &wrapperFd, false, true);
7b4659
     if (fd < 0) {
7b4659
         if (fd == -3)
7b4659
-- 
7b4659
2.22.1
7b4659