conf: Convert def->os.loader->nvram a virStorageSource

Currently, libvirt allows only local filepaths to specify the location
of the 'nvram' image. Changing it to virStorageSource type will allow
supporting remote storage for nvram.

Signed-off-by: Prerna Saxena <prerna.saxena@nutanix.com>
Signed-off-by: Florian Schmidt <flosch@nutanix.com>
Signed-off-by: Rohit Kumar <rohit.kumar3@nutanix.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Tested-by: Rohit Kumar <rohit.kumar3@nutanix.com>
This commit is contained in:
Rohit Kumar 2022-05-04 09:51:11 -07:00 committed by Peter Krempa
parent c3cf2a2b60
commit 911c3cb2f0
13 changed files with 59 additions and 27 deletions

View File

@ -3590,7 +3590,7 @@ virDomainLoaderDefFree(virDomainLoaderDef *loader)
return;
g_free(loader->path);
g_free(loader->nvram);
virObjectUnref(loader->nvram);
g_free(loader->nvramTemplate);
g_free(loader);
}
@ -18402,6 +18402,7 @@ virDomainDefParseBootLoaderOptions(virDomainDef *def,
{
xmlNodePtr loader_node = virXPathNode("./os/loader[1]", ctxt);
const bool fwAutoSelect = def->os.firmware != VIR_DOMAIN_OS_DEF_FIRMWARE_NONE;
g_autofree char *nvramPath = NULL;
if (!loader_node)
return 0;
@ -18413,7 +18414,13 @@ virDomainDefParseBootLoaderOptions(virDomainDef *def,
fwAutoSelect) < 0)
return -1;
def->os.loader->nvram = virXPathString("string(./os/nvram[1])", ctxt);
if ((nvramPath = virXPathString("string(./os/nvram[1])", ctxt))) {
def->os.loader->nvram = virStorageSourceNew();
def->os.loader->nvram->path = g_steal_pointer(&nvramPath);
def->os.loader->nvram->type = VIR_STORAGE_TYPE_FILE;
def->os.loader->nvram->format = VIR_STORAGE_FILE_RAW;
}
if (!fwAutoSelect)
def->os.loader->nvramTemplate = virXPathString("string(./os/nvram[1]/@template)", ctxt);
@ -27179,7 +27186,10 @@ virDomainLoaderDefFormat(virBuffer *buf,
virXMLFormatElementInternal(buf, "loader", &loaderAttrBuf, &loaderChildBuf, false, false);
virBufferEscapeString(&nvramAttrBuf, " template='%s'", loader->nvramTemplate);
virBufferEscapeString(&nvramChildBuf, "%s", loader->nvram);
if (loader->nvram) {
if (loader->nvram->type == VIR_STORAGE_TYPE_FILE)
virBufferEscapeString(&nvramChildBuf, "%s", loader->nvram->path);
}
virXMLFormatElementInternal(buf, "nvram", &nvramAttrBuf, &nvramChildBuf, false, false);
}

View File

@ -2253,7 +2253,7 @@ struct _virDomainLoaderDef {
virTristateBool readonly;
virDomainLoader type;
virTristateBool secure;
char *nvram; /* path to non-volatile RAM */
virStorageSource *nvram;
char *nvramTemplate; /* user override of path to master nvram */
};

View File

@ -581,7 +581,8 @@ qemuSetupFirmwareCgroup(virDomainObj *vm)
return -1;
if (vm->def->os.loader->nvram &&
qemuSetupImagePathCgroup(vm, vm->def->os.loader->nvram, false) < 0)
virStorageSourceIsLocalStorage(vm->def->os.loader->nvram) &&
qemuSetupImagePathCgroup(vm, vm->def->os.loader->nvram->path, false) < 0)
return -1;
return 0;

View File

@ -9690,7 +9690,7 @@ qemuBuildDomainLoaderPflashCommandLine(virCommand *cmd,
if (loader->nvram) {
virBufferAddLit(&buf, "file=");
virQEMUBuildBufferEscapeComma(&buf, loader->nvram);
virQEMUBuildBufferEscapeComma(&buf, loader->nvram->path);
virBufferAsprintf(&buf, ",if=pflash,format=raw,unit=%d", unit);
virCommandAddArg(cmd, "-drive");

View File

@ -4678,8 +4678,12 @@ qemuDomainDefPostParse(virDomainDef *def,
}
if (virDomainDefHasOldStyleROUEFI(def) &&
!def->os.loader->nvram)
qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram);
!def->os.loader->nvram) {
def->os.loader->nvram = virStorageSourceNew();
def->os.loader->nvram->type = VIR_STORAGE_TYPE_FILE;
def->os.loader->nvram->format = VIR_STORAGE_FILE_RAW;
qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram->path);
}
if (qemuDomainDefAddDefaultDevices(driver, def, qemuCaps) < 0)
return -1;
@ -11335,7 +11339,7 @@ qemuDomainInitializePflashStorageSource(virDomainObj *vm)
pflash1 = virStorageSourceNew();
pflash1->type = VIR_STORAGE_TYPE_FILE;
pflash1->format = VIR_STORAGE_FILE_RAW;
pflash1->path = g_strdup(def->os.loader->nvram);
pflash1->path = g_strdup(def->os.loader->nvram->path);
pflash1->readonly = false;
pflash1->nodeformat = g_strdup("libvirt-pflash1-format");
pflash1->nodestorage = g_strdup("libvirt-pflash1-storage");

View File

@ -6866,8 +6866,9 @@ qemuDomainUndefineFlags(virDomainPtr dom,
}
}
if (vm->def->os.loader && vm->def->os.loader->nvram) {
nvram_path = g_strdup(vm->def->os.loader->nvram);
if (vm->def->os.loader && vm->def->os.loader->nvram &&
virStorageSourceIsLocalStorage(vm->def->os.loader->nvram)) {
nvram_path = g_strdup(vm->def->os.loader->nvram->path);
} else if (vm->def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_EFI) {
qemuDomainNVRAMPathFormat(cfg, vm->def, &nvram_path);
}

View File

@ -1192,13 +1192,17 @@ qemuFirmwareEnableFeatures(virQEMUDriver *driver,
VIR_FREE(def->os.loader->nvramTemplate);
def->os.loader->nvramTemplate = g_strdup(flash->nvram_template.filename);
if (!def->os.loader->nvram)
qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram);
if (!def->os.loader->nvram) {
def->os.loader->nvram = virStorageSourceNew();
def->os.loader->nvram->type = VIR_STORAGE_TYPE_FILE;
def->os.loader->nvram->format = VIR_STORAGE_FILE_RAW;
qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram->path);
}
VIR_DEBUG("decided on firmware '%s' template '%s' NVRAM '%s'",
def->os.loader->path,
def->os.loader->nvramTemplate,
def->os.loader->nvram);
def->os.loader->nvram->path);
break;
case QEMU_FIRMWARE_DEVICE_KERNEL:
@ -1364,8 +1368,12 @@ qemuFirmwareFillDomain(virQEMUDriver *driver,
* its path in domain XML) but no template for NVRAM was
* specified and the varstore doesn't exist ... */
if (!virDomainDefHasOldStyleROUEFI(def) ||
def->os.loader->nvramTemplate ||
(!reset_nvram && virFileExists(def->os.loader->nvram)))
def->os.loader->nvramTemplate)
return 0;
if (!reset_nvram && def->os.loader->nvram &&
virStorageSourceIsLocalStorage(def->os.loader->nvram) &&
virFileExists(def->os.loader->nvram->path))
return 0;
/* ... then we want to consult JSON FW descriptors first,

View File

@ -572,8 +572,9 @@ qemuDomainSetupLoader(virDomainObj *vm,
case VIR_DOMAIN_LOADER_TYPE_PFLASH:
*paths = g_slist_prepend(*paths, g_strdup(loader->path));
if (loader->nvram)
*paths = g_slist_prepend(*paths, g_strdup(loader->nvram));
if (loader->nvram &&
virStorageSourceIsLocalStorage(loader->nvram))
*paths = g_slist_prepend(*paths, g_strdup(loader->nvram->path));
break;
case VIR_DOMAIN_LOADER_TYPE_NONE:

View File

@ -4609,7 +4609,8 @@ qemuPrepareNVRAM(virQEMUDriver *driver,
struct qemuPrepareNVRAMHelperData data;
if (!loader || !loader->nvram ||
(virFileExists(loader->nvram) && !reset_nvram))
!virStorageSourceIsLocalStorage(loader->nvram) ||
(virFileExists(loader->nvram->path) && !reset_nvram))
return 0;
master_nvram_path = loader->nvramTemplate;
@ -4641,7 +4642,7 @@ qemuPrepareNVRAM(virQEMUDriver *driver,
data.srcFD = srcFD;
data.srcPath = master_nvram_path;
if (virFileRewrite(loader->nvram,
if (virFileRewrite(loader->nvram->path,
S_IRUSR | S_IWUSR,
cfg->user, cfg->group,
qemuPrepareNVRAMHelper,

View File

@ -1974,7 +1974,8 @@ virSecurityDACRestoreAllLabel(virSecurityManager *mgr,
}
if (def->os.loader && def->os.loader->nvram &&
virSecurityDACRestoreFileLabel(mgr, def->os.loader->nvram) < 0)
virStorageSourceIsLocalStorage(def->os.loader->nvram) &&
virSecurityDACRestoreFileLabel(mgr, def->os.loader->nvram->path) < 0)
rc = -1;
if (def->os.kernel &&
@ -2185,8 +2186,9 @@ virSecurityDACSetAllLabel(virSecurityManager *mgr,
}
if (def->os.loader && def->os.loader->nvram &&
virStorageSourceIsLocalStorage(def->os.loader->nvram) &&
virSecurityDACSetOwnership(mgr, NULL,
def->os.loader->nvram,
def->os.loader->nvram->path,
user, group, true) < 0)
return -1;

View File

@ -2804,7 +2804,8 @@ virSecuritySELinuxRestoreAllLabel(virSecurityManager *mgr,
}
if (def->os.loader && def->os.loader->nvram &&
virSecuritySELinuxRestoreFileLabel(mgr, def->os.loader->nvram, true) < 0)
virStorageSourceIsLocalStorage(def->os.loader->nvram) &&
virSecuritySELinuxRestoreFileLabel(mgr, def->os.loader->nvram->path, true) < 0)
rc = -1;
if (def->os.kernel &&
@ -3210,8 +3211,9 @@ virSecuritySELinuxSetAllLabel(virSecurityManager *mgr,
/* This is different than kernel or initrd. The nvram store
* is really a disk, qemu can read and write to it. */
if (def->os.loader && def->os.loader->nvram &&
virStorageSourceIsLocalStorage(def->os.loader->nvram) &&
secdef && secdef->imagelabel &&
virSecuritySELinuxSetFilecon(mgr, def->os.loader->nvram,
virSecuritySELinuxSetFilecon(mgr, def->os.loader->nvram->path,
secdef->imagelabel, true) < 0)
return -1;

View File

@ -1006,8 +1006,9 @@ get_files(vahControl * ctl)
if (vah_add_file(&buf, ctl->def->os.loader->path, "rk") != 0)
goto cleanup;
if (ctl->def->os.loader && ctl->def->os.loader->nvram)
if (vah_add_file(&buf, ctl->def->os.loader->nvram, "rwk") != 0)
if (ctl->def->os.loader && ctl->def->os.loader->nvram &&
virStorageSourceIsLocalStorage(ctl->def->os.loader->nvram))
if (vah_add_file(&buf, ctl->def->os.loader->nvram->path, "rwk") != 0)
goto cleanup;
for (i = 0; i < ctl->def->ngraphics; i++) {

View File

@ -992,7 +992,8 @@ vboxSetBootDeviceOrder(virDomainDef *def, struct _vboxDriver *data,
VIR_DEBUG("def->os.loader->path %s", def->os.loader->path);
VIR_DEBUG("def->os.loader->readonly %d", def->os.loader->readonly);
VIR_DEBUG("def->os.loader->type %d", def->os.loader->type);
VIR_DEBUG("def->os.loader->nvram %s", def->os.loader->nvram);
if (def->os.loader->nvram)
VIR_DEBUG("def->os.loader->nvram->path %s", def->os.loader->nvram->path);
}
VIR_DEBUG("def->os.bootloader %s", def->os.bootloader);
VIR_DEBUG("def->os.bootloaderArgs %s", def->os.bootloaderArgs);