[PATCH v3 07/38] conf: Parse and format varstore element

Andrea Bolognani via Devel posted 38 patches 1 week, 5 days ago
There is a newer version of this series
[PATCH v3 07/38] conf: Parse and format varstore element
Posted by Andrea Bolognani via Devel 1 week, 5 days ago
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 <abologna@redhat.com>
---
 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(-)

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
Re: [PATCH v3 07/38] conf: Parse and format varstore element
Posted by Daniel P. Berrangé via Devel 1 week ago
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 <abologna@redhat.com>
> ---
>  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 :|