]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
bhyve: support removing NVRAM on domain undefine
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Tue, 6 May 2025 16:58:29 +0000 (18:58 +0200)
committerRoman Bogorodskiy <bogorodskiy@gmail.com>
Tue, 20 May 2025 16:27:30 +0000 (18:27 +0200)
Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/bhyve/bhyve_driver.c

index 684346952de5f0522418c176ddb5f2d669779ce8..db7d440a97c364fb5b39408fc3bd4a89e5781ab9 100644 (file)
@@ -533,9 +533,19 @@ bhyveDomainUndefineFlags(virDomainPtr domain, unsigned int flags)
     struct _bhyveConn *privconn = domain->conn->privateData;
     virObjectEvent *event = NULL;
     virDomainObj *vm;
+    g_autofree char *nvram_path = NULL;
     int ret = -1;
 
-    virCheckFlags(0, -1);
+    virCheckFlags(VIR_DOMAIN_UNDEFINE_NVRAM |
+                  VIR_DOMAIN_UNDEFINE_KEEP_NVRAM, -1);
+
+    if ((flags & VIR_DOMAIN_UNDEFINE_NVRAM) &&
+        (flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) {
+        virReportError(VIR_ERR_OPERATION_INVALID,
+                       "%s", _("cannot both keep and delete nvram"));
+        return -1;
+    }
+
     if (!(vm = bhyveDomObjFromDomain(domain)))
         goto cleanup;
 
@@ -548,6 +558,26 @@ bhyveDomainUndefineFlags(virDomainPtr domain, unsigned int flags)
         goto cleanup;
     }
 
+    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 (nvram_path && virFileExists(nvram_path)) {
+        if ((flags & VIR_DOMAIN_UNDEFINE_NVRAM)) {
+            if (unlink(nvram_path) < 0) {
+                virReportSystemError(errno,
+                                     _("failed to remove nvram: %1$s"),
+                                     nvram_path);
+                goto cleanup;
+            }
+        } else if (!(flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) {
+            virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                           _("cannot undefine domain with nvram"));
+            goto cleanup;
+        }
+    }
+
     if (virDomainDeleteConfig(BHYVE_CONFIG_DIR,
                               BHYVE_AUTOSTART_DIR,
                               vm) < 0)