On Wed, Feb 18, 2026 at 01:05:30PM +0100, Andrea Bolognani via Devel wrote:
> Dealing with the element itself is trivial, however we have to
> refactor the existing code which deals with the loader and nvram
> elements slightly: in particular, we can no longer perform an
> early exit if those elements are absent.
>
> Signed-off-by: Andrea Bolognani <[email protected]>
> ---
> src/conf/domain_conf.c | 79 ++++++++++++++++++++++++++++++++++++----
> src/conf/domain_conf.h | 9 +++++
> src/conf/virconftypes.h | 2 +
> src/libvirt_private.syms | 2 +
> 4 files changed, 85 insertions(+), 7 deletions(-)
Include the RNG change here, along with the new docs.
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 453e301041..1384e9f3ab 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -3960,6 +3960,27 @@ virDomainLoaderDefFree(virDomainLoaderDef *loader)
> g_free(loader);
> }
>
> +virDomainVarstoreDef *
> +virDomainVarstoreDefNew(void)
> +{
> + virDomainVarstoreDef *def = NULL;
> +
> + def = g_new0(virDomainVarstoreDef, 1);
> +
> + return def;
> +}
> +
> +void
> +virDomainVarstoreDefFree(virDomainVarstoreDef *varstore)
> +{
> + if (!varstore)
> + return;
> +
> + g_free(varstore->path);
> + g_free(varstore->template);
> + g_free(varstore);
> +}
> +
>
> static void
> virDomainResctrlMonDefFree(virDomainResctrlMonDef *domresmon)
> @@ -4062,6 +4083,7 @@ virDomainOSDefClear(virDomainOSDef *os)
> virDomainOSACPITableDefFree(os->acpiTables[i]);
> g_free(os->acpiTables);
> virDomainLoaderDefFree(os->loader);
> + virDomainVarstoreDefFree(os->varstore);
> g_free(os->bootloader);
> g_free(os->bootloaderArgs);
> }
> @@ -18088,6 +18110,17 @@ virDomainLoaderDefParseXMLLoader(virDomainLoaderDef
> *loader,
> }
>
>
> +static int
> +virDomainVarstoreDefParseXML(virDomainVarstoreDef *varstore,
> + xmlNodePtr varstoreNode)
> +{
> + varstore->path = virXMLPropString(varstoreNode, "path");
> + varstore->template = virXMLPropString(varstoreNode, "template");
> +
> + return 0;
> +}
> +
> +
> static int
> virDomainLoaderDefParseXML(virDomainLoaderDef *loader,
> xmlNodePtr loaderNode,
> @@ -18535,16 +18568,29 @@ virDomainDefParseBootLoaderOptions(virDomainDef
> *def,
> xmlNodePtr loaderNode = virXPathNode("./os/loader[1]", ctxt);
> xmlNodePtr nvramNode = virXPathNode("./os/nvram[1]", ctxt);
> xmlNodePtr nvramSourceNode = virXPathNode("./os/nvram/source[1]", ctxt);
> + xmlNodePtr varstoreNode = virXPathNode("./os/varstore[1]", ctxt);
>
> - if (!loaderNode && !nvramNode)
> - return 0;
> + if (nvramNode && varstoreNode) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("Cannot have both <nvram> and <varstore>"));
> + return -1;
> + }
>
> - def->os.loader = virDomainLoaderDefNew();
> + if (loaderNode || nvramNode) {
> + def->os.loader = virDomainLoaderDefNew();
>
> - if (virDomainLoaderDefParseXML(def->os.loader,
> - loaderNode, nvramNode, nvramSourceNode,
> - ctxt, xmlopt, flags) < 0)
> - return -1;
> + if (virDomainLoaderDefParseXML(def->os.loader,
> + loaderNode, nvramNode,
> nvramSourceNode,
> + ctxt, xmlopt, flags) < 0)
> + return -1;
> + }
> +
> + if (varstoreNode) {
> + def->os.varstore = virDomainVarstoreDefNew();
> +
> + if (virDomainVarstoreDefParseXML(def->os.varstore, varstoreNode) < 0)
> + return -1;
> + }
>
> return 0;
> }
> @@ -28248,6 +28294,20 @@ virDomainLoaderDefFormat(virBuffer *buf,
> return 0;
> }
>
> +static int
> +virDomainVarstoreDefFormat(virBuffer *buf,
> + virDomainVarstoreDef *varstore)
> +{
> + g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
> +
> + virBufferEscapeString(&attrBuf, " template='%s'", varstore->template);
> + virBufferEscapeString(&attrBuf, " path='%s'", varstore->path);
> +
> + virXMLFormatElementEmpty(buf, "varstore", &attrBuf, NULL);
> +
> + return 0;
> +}
> +
> static void
> virDomainKeyWrapDefFormat(virBuffer *buf, virDomainKeyWrapDef *keywrap)
> {
> @@ -29720,6 +29780,11 @@ virDomainDefFormatInternalSetRootName(virDomainDef
> *def,
> if (def->os.loader &&
> virDomainLoaderDefFormat(buf, def->os.loader, xmlopt, flags) < 0)
> return -1;
> +
> + if (def->os.varstore &&
> + virDomainVarstoreDefFormat(buf, def->os.varstore) < 0)
> + return -1;
> +
> virBufferEscapeString(buf, "<kernel>%s</kernel>\n",
> def->os.kernel);
> virBufferEscapeString(buf, "<initrd>%s</initrd>\n",
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index a13f6d79e9..e63230beec 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2423,6 +2423,14 @@ struct _virDomainLoaderDef {
> virDomainLoaderDef *virDomainLoaderDefNew(void);
> void virDomainLoaderDefFree(virDomainLoaderDef *loader);
>
> +struct _virDomainVarstoreDef {
> + char *path;
> + char *template;
> +};
> +
> +virDomainVarstoreDef *virDomainVarstoreDefNew(void);
> +void virDomainVarstoreDefFree(virDomainVarstoreDef *varstore);
> +
> typedef enum {
> VIR_DOMAIN_IOAPIC_NONE = 0,
> VIR_DOMAIN_IOAPIC_QEMU,
> @@ -2576,6 +2584,7 @@ struct _virDomainOSDef {
> size_t nacpiTables;
> virDomainOSACPITableDef **acpiTables;
> virDomainLoaderDef *loader;
> + virDomainVarstoreDef *varstore;
> char *bootloader;
> char *bootloaderArgs;
> int smbios_mode;
> diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h
> index 6e2573035a..0596791a4d 100644
> --- a/src/conf/virconftypes.h
> +++ b/src/conf/virconftypes.h
> @@ -164,6 +164,8 @@ typedef struct _virDomainLeaseDef virDomainLeaseDef;
>
> typedef struct _virDomainLoaderDef virDomainLoaderDef;
>
> +typedef struct _virDomainVarstoreDef virDomainVarstoreDef;
> +
> typedef struct _virDomainMemballoonDef virDomainMemballoonDef;
>
> typedef struct _virDomainMemoryDef virDomainMemoryDef;
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index d8ae4f46cd..9853ece557 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -719,6 +719,8 @@ virDomainTPMProfileRemoveDisabledTypeToString;
> virDomainTPMVersionTypeFromString;
> virDomainTPMVersionTypeToString;
> virDomainUSBDeviceDefForeach;
> +virDomainVarstoreDefFree;
> +virDomainVarstoreDefNew;
> virDomainVideoDefaultRAM;
> virDomainVideoDefClear;
> virDomainVideoDefFree;
> --
> 2.53.0
>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|