diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a6c95b7208ef32277f0f32d12af45a7033f0ee25..b257db44b0ca95763b3815dadc5da47d9d2548b0 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 282ab2c3eccb8c7d3f92fdcf0051395b81bf6a22..9174631ad24ed249a298133c807177901fb5ec27 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 681b26814b94ec5f7953ab85e71764a47815388a..42866c6060db7fc9258faee958db4d7aa09f8733 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)) {