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 :|

Reply via email to