render / rpms / libvirt

Forked from rpms/libvirt 11 months ago
Clone
2ba5aa
From 1824bb0b44b47af95f50afd626776acfba91174d Mon Sep 17 00:00:00 2001
2ba5aa
Message-Id: <1824bb0b44b47af95f50afd626776acfba91174d@dist-git>
2ba5aa
From: Michal Privoznik <mprivozn@redhat.com>
2ba5aa
Date: Wed, 7 Oct 2020 13:20:04 +0200
2ba5aa
Subject: [PATCH] qemuFirmwareFillDomain: Fill NVRAM template on migration too
2ba5aa
2ba5aa
In 8e1804f9f66 I've tried to fix the following use case: domain
2ba5aa
is started with path to UEFI only and relies on libvirt to figure
2ba5aa
out corresponding NVRAM template to create a per-domain copy
2ba5aa
from. The fix consisted of having a check tailored exactly for
2ba5aa
this use case and if it's hit then using FW autoselection to
2ba5aa
figure it out. Unfortunately, the NVRAM template is not saved in
2ba5aa
the inactive XML (well, the domain might be transient anyway).
2ba5aa
Then, as a part of that check we see whether the per-domain copy
2ba5aa
doesn't exist already and if it does then no template is looked
2ba5aa
up hence no template will appear in the live XML.
2ba5aa
2ba5aa
This works, until the domain is migrated. At the destination, the
2ba5aa
per-domain copy will not exist so we need to know the template to
2ba5aa
create the per-domain copy from. But we don't even get to the
2ba5aa
check because we are not starting a fresh new domain and thus the
2ba5aa
qemuFirmwareFillDomain() function quits early.
2ba5aa
2ba5aa
The solution is to switch order of these two checks. That is
2ba5aa
evaluate the check for the old style before checking flags.
2ba5aa
2ba5aa
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1852910
2ba5aa
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
2ba5aa
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
2ba5aa
(cherry picked from commit c43622f06e295edcb9cedf33583f0bd18fb04b10)
2ba5aa
2ba5aa
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1880418
2ba5aa
2ba5aa
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
2ba5aa
Message-Id: <9b91110a238eba22f4b876e7b15a25d5113ee91e.1602069592.git.mprivozn@redhat.com>
2ba5aa
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
2ba5aa
---
2ba5aa
 src/qemu/qemu_firmware.c | 8 +++++---
2ba5aa
 1 file changed, 5 insertions(+), 3 deletions(-)
2ba5aa
2ba5aa
diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
2ba5aa
index 68e2c6b40f..c84d03f0a8 100644
2ba5aa
--- a/src/qemu/qemu_firmware.c
2ba5aa
+++ b/src/qemu/qemu_firmware.c
2ba5aa
@@ -1241,9 +1241,6 @@ qemuFirmwareFillDomain(virQEMUDriverPtr driver,
2ba5aa
     size_t i;
2ba5aa
     int ret = -1;
2ba5aa
 
2ba5aa
-    if (!(flags & VIR_QEMU_PROCESS_START_NEW))
2ba5aa
-        return 0;
2ba5aa
-
2ba5aa
     /* Fill in FW paths if either os.firmware is enabled, or
2ba5aa
      * loader path was provided with no nvram varstore. */
2ba5aa
     if (def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_NONE) {
2ba5aa
@@ -1259,6 +1256,11 @@ qemuFirmwareFillDomain(virQEMUDriverPtr driver,
2ba5aa
         /* ... then we want to consult JSON FW descriptors first,
2ba5aa
          * but we don't want to fail if we haven't found a match. */
2ba5aa
         needResult = false;
2ba5aa
+    } else {
2ba5aa
+        /* Domain has FW autoselection enabled => do nothing if
2ba5aa
+         * we are not starting it from scratch. */
2ba5aa
+        if (!(flags & VIR_QEMU_PROCESS_START_NEW))
2ba5aa
+            return 0;
2ba5aa
     }
2ba5aa
 
2ba5aa
     if ((nfirmwares = qemuFirmwareFetchParsedConfigs(driver->privileged,
2ba5aa
-- 
2ba5aa
2.28.0
2ba5aa