]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: fix EFI nvram removal on domain undefine
authorPavel Mores <pmores@redhat.com>
Tue, 15 Oct 2019 08:31:22 +0000 (10:31 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 15 Oct 2019 11:39:54 +0000 (13:39 +0200)
When undefining a UEFI domain its nvram file has to be properly handled as
well.  It's mandatory to use one of --nvram and --keep-nvram options when
'virsh undefine <domain>' is issued for a UEFI domain.  To fix the bug as
reported, virsh should return an error message if neither option is used
and the nvram file should be removed when --nvram is given.

The cause of the problem is that when qemuDomainUndefineFlags() is invoked
on an inactive domain the path to its nvram file is empty.  This commit
aims to fix this by formatting and filling in the path in time for the
nvram removal code to run properly.

https://bugzilla.redhat.com/show_bug.cgi?id=1751596

Signed-off-by: Pavel Mores <pmores@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c

index a6c95b7208ef32277f0f32d12af45a7033f0ee25..b257db44b0ca95763b3815dadc5da47d9d2548b0 100644 (file)
@@ -15441,16 +15441,24 @@ qemuDomainDiskIsMissingLocalOptional(virDomainDiskDefPtr disk)
 }
 
 
+int
+qemuDomainNVRAMPathFormat(virQEMUDriverConfigPtr cfg,
+                            virDomainDefPtr def,
+                            char **path)
+{
+    return virAsprintf(path, "%s/%s_VARS.fd", cfg->nvramDir, def->name);
+}
+
+
 int
 qemuDomainNVRAMPathGenerate(virQEMUDriverConfigPtr cfg,
                             virDomainDefPtr def)
 {
     if (def->os.loader &&
         def->os.loader->type == VIR_DOMAIN_LOADER_TYPE_PFLASH &&
-        def->os.loader->readonly == VIR_TRISTATE_SWITCH_ON &&
+        def->os.loader->readonly == VIR_TRISTATE_BOOL_YES &&
         !def->os.loader->nvram) {
-        return virAsprintf(&def->os.loader->nvram, "%s/%s_VARS.fd",
-                           cfg->nvramDir, def->name);
+        return qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram);
     }
 
     return 0;
index 282ab2c3eccb8c7d3f92fdcf0051395b81bf6a22..9174631ad24ed249a298133c807177901fb5ec27 100644 (file)
@@ -1207,6 +1207,11 @@ qemuDomainIsUsingNoShutdown(qemuDomainObjPrivatePtr priv);
 bool
 qemuDomainDiskIsMissingLocalOptional(virDomainDiskDefPtr disk);
 
+int
+qemuDomainNVRAMPathFormat(virQEMUDriverConfigPtr cfg,
+                            virDomainDefPtr def,
+                            char **path);
+
 int
 qemuDomainNVRAMPathGenerate(virQEMUDriverConfigPtr cfg,
                             virDomainDefPtr def);
index 681b26814b94ec5f7953ab85e71764a47815388a..42866c6060db7fc9258faee958db4d7aa09f8733 100644 (file)
@@ -7828,6 +7828,7 @@ qemuDomainUndefineFlags(virDomainPtr dom,
     int nsnapshots;
     int ncheckpoints;
     virQEMUDriverConfigPtr cfg = NULL;
+    g_autofree char *nvram_path = NULL;
 
     virCheckFlags(VIR_DOMAIN_UNDEFINE_MANAGED_SAVE |
                   VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA |
@@ -7905,14 +7906,21 @@ qemuDomainUndefineFlags(virDomainPtr dom,
         }
     }
 
-    if (vm->def->os.loader &&
-        vm->def->os.loader->nvram &&
-        virFileExists(vm->def->os.loader->nvram)) {
+    if (vm->def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_EFI) {
+        if (qemuDomainNVRAMPathFormat(cfg, vm->def, &nvram_path) < 0)
+            goto endjob;
+    } else {
+        if (vm->def->os.loader &&
+            VIR_STRDUP(nvram_path, vm->def->os.loader->nvram) < 0)
+            goto endjob;
+    }
+
+    if (nvram_path && virFileExists(nvram_path)) {
         if ((flags & VIR_DOMAIN_UNDEFINE_NVRAM)) {
-            if (unlink(vm->def->os.loader->nvram) < 0) {
+            if (unlink(nvram_path) < 0) {
                 virReportSystemError(errno,
                                      _("failed to remove nvram: %s"),
-                                     vm->def->os.loader->nvram);
+                                     nvram_path);
                 goto endjob;
             }
         } else if (!(flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) {