[PATCH v3 32/38] qemu: Create and delete varstore file

Andrea Bolognani via Devel posted 38 patches 1 week, 5 days ago
There is a newer version of this series
[PATCH v3 32/38] qemu: Create and delete varstore file
Posted by Andrea Bolognani via Devel 1 week, 5 days ago
Simply mimicking what is currently done for NVRAM files works.
A few user-visible messages are updated to reflect the fact
that they apply both to NVRAM and varstore.

https://issues.redhat.com/browse/RHEL-82645

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
 src/qemu/qemu_driver.c  | 15 ++++++++++-----
 src/qemu/qemu_process.c | 28 ++++++++++++++++++++++++++--
 2 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 9620f737ba..c9e9e970e7 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6646,22 +6646,27 @@ qemuDomainUndefineFlags(virDomainPtr dom,
         }
     }
 
-    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);
+    if (vm->def->os.loader) {
+        if (vm->def->os.loader->nvram &&
+            virStorageSourceIsLocalStorage(vm->def->os.loader->nvram)) {
+            nvram_path = g_strdup(vm->def->os.loader->nvram->path);
+        }
+        if (vm->def->os.varstore && vm->def->os.varstore->path) {
+            nvram_path = g_strdup(vm->def->os.varstore->path);
+        }
     }
 
     if (nvram_path && virFileExists(nvram_path)) {
         if ((flags & VIR_DOMAIN_UNDEFINE_NVRAM)) {
             if (unlink(nvram_path) < 0) {
                 virReportSystemError(errno,
-                                     _("failed to remove nvram: %1$s"),
+                                     _("Failed to remove NVRAM/varstore: %1$s"),
                                      nvram_path);
                 goto endjob;
             }
         } else if (!(flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) {
             virReportError(VIR_ERR_OPERATION_INVALID, "%s",
-                           _("cannot undefine domain with nvram"));
+                           _("Cannot undefine domain with NVRAM/varstore"));
             goto endjob;
         }
     }
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index db43b035c1..a82ee4b15e 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5029,6 +5029,27 @@ qemuPrepareNVRAM(virQEMUDriver *driver,
 }
 
 
+static int
+qemuPrepareVarstore(virQEMUDriver *driver,
+                    virDomainDef *def,
+                    bool reset_nvram)
+{
+    virDomainLoaderDef *loader = def->os.loader;
+    virDomainVarstoreDef *varstore = def->os.varstore;
+
+    if (!loader || !varstore)
+        return 0;
+
+    VIR_DEBUG("varstore='%s'", NULLSTR(varstore->path));
+
+    if (qemuPrepareNVRAMFileCommon(driver, varstore->path,
+                                   varstore->template, reset_nvram) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 static void
 qemuLogOperation(virDomainObj *vm,
                  const char *msg,
@@ -7799,6 +7820,7 @@ qemuProcessPrepareHost(virQEMUDriver *driver,
     unsigned int hostdev_flags = 0;
     qemuDomainObjPrivate *priv = vm->privateData;
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+    bool reset_nvram = !!(flags & VIR_QEMU_PROCESS_START_RESET_NVRAM);
 
     /*
      * Create all per-domain directories in order to make sure domain
@@ -7808,8 +7830,10 @@ qemuProcessPrepareHost(virQEMUDriver *driver,
         qemuProcessMakeDir(driver, vm, priv->channelTargetDir) < 0)
         return -1;
 
-    if (qemuPrepareNVRAM(driver, vm->def,
-                         !!(flags & VIR_QEMU_PROCESS_START_RESET_NVRAM)) < 0)
+    if (qemuPrepareNVRAM(driver, vm->def, reset_nvram) < 0)
+        return -1;
+
+    if (qemuPrepareVarstore(driver, vm->def, reset_nvram) < 0)
         return -1;
 
     if (vm->def->vsock) {
-- 
2.53.0
Re: [PATCH v3 32/38] qemu: Create and delete varstore file
Posted by Daniel P. Berrangé via Devel 1 week ago
On Wed, Feb 18, 2026 at 01:05:55PM +0100, Andrea Bolognani via Devel wrote:
> Simply mimicking what is currently done for NVRAM files works.
> A few user-visible messages are updated to reflect the fact
> that they apply both to NVRAM and varstore.
> 
> https://issues.redhat.com/browse/RHEL-82645
> 
> Signed-off-by: Andrea Bolognani <abologna@redhat.com>
> ---
>  src/qemu/qemu_driver.c  | 15 ++++++++++-----
>  src/qemu/qemu_process.c | 28 ++++++++++++++++++++++++++--
>  2 files changed, 36 insertions(+), 7 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>

> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 9620f737ba..c9e9e970e7 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -6646,22 +6646,27 @@ qemuDomainUndefineFlags(virDomainPtr dom,
>          }
>      }
>  
> -    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);
> +    if (vm->def->os.loader) {
> +        if (vm->def->os.loader->nvram &&
> +            virStorageSourceIsLocalStorage(vm->def->os.loader->nvram)) {
> +            nvram_path = g_strdup(vm->def->os.loader->nvram->path);
> +        }
> +        if (vm->def->os.varstore && vm->def->os.varstore->path) {

"else if" to make it clear these are mutually exclusive scenarios,
otherwise a static analyser is liable to complain that the next
assignment to nvram_path leaks memory from the previous assignment.

> +            nvram_path = g_strdup(vm->def->os.varstore->path);
> +        }
>      }
>  
>      if (nvram_path && virFileExists(nvram_path)) {
>          if ((flags & VIR_DOMAIN_UNDEFINE_NVRAM)) {
>              if (unlink(nvram_path) < 0) {
>                  virReportSystemError(errno,
> -                                     _("failed to remove nvram: %1$s"),
> +                                     _("Failed to remove NVRAM/varstore: %1$s"),
>                                       nvram_path);
>                  goto endjob;
>              }
>          } else if (!(flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) {
>              virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> -                           _("cannot undefine domain with nvram"));
> +                           _("Cannot undefine domain with NVRAM/varstore"));
>              goto endjob;
>          }
>      }


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