diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a6c95b7208..b257db44b0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -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; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 282ab2c3ec..9174631ad2 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -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); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 681b26814b..42866c6060 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -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)) {