]> xenbits.xensource.com Git - libvirt.git/commitdiff
ch_driver: Introduce and use virCHDomainRemoveInactive()
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 10 Feb 2022 15:10:13 +0000 (16:10 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 11 Feb 2022 09:48:35 +0000 (10:48 +0100)
There are few places where a call to virDomainObjListRemove() is
guarded with !vm->persistent check. And there are some places
which are missing this check completely (leading us to losing a
domain). To prevent such mistakes introduce
virCHDomainRemoveInactive() which does the check for us. Also
replace all occurrences of virDomainObjListRemove() with the call
to the new function.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Tim Wiederhake <twiederh@redhat.com>
src/ch/ch_domain.c
src/ch/ch_domain.h
src/ch/ch_driver.c

index 0b4dbbf142fd16b4506de483983a476e0315d036..25f581c1c34aa6db46de126f6a4d2d6e8859aa14 100644 (file)
@@ -136,6 +136,15 @@ virCHDomainObjEndJob(virDomainObj *obj)
     virCondSignal(&priv->job.cond);
 }
 
+void
+virCHDomainRemoveInactive(virCHDriver *driver,
+                          virDomainObj *vm)
+{
+    if (vm->persistent) {
+        virDomainObjListRemove(driver->domains, vm);
+    }
+}
+
 static void *
 virCHDomainObjPrivateAlloc(void *opaque)
 {
index c1d3be212e4ee6320e5f0f53c95b7e00f132742a..11a20a874a52fe1c3960f5586c9588c77a1e3360 100644 (file)
@@ -88,6 +88,10 @@ virCHDomainObjBeginJob(virDomainObj *obj, enum virCHDomainJob job)
 void
 virCHDomainObjEndJob(virDomainObj *obj);
 
+void
+virCHDomainRemoveInactive(virCHDriver *driver,
+                          virDomainObj *vm);
+
 int
 virCHDomainRefreshThreadInfo(virDomainObj *vm);
 
index cd156a222bf1526ad3c4dc883c8321c51d2708f7..ef74a00bf7643f68a0c1d4a3f0be4d405810ad8b 100644 (file)
@@ -237,7 +237,7 @@ chDomainCreateXML(virConnectPtr conn,
 
  cleanup:
     if (vm && !dom) {
-        virDomainObjListRemove(driver->domains, vm);
+        virCHDomainRemoveInactive(driver, vm);
     }
     virDomainObjEndAPI(&vm);
     return dom;
@@ -342,10 +342,9 @@ chDomainUndefineFlags(virDomainPtr dom,
         goto cleanup;
     }
 
-    if (virDomainObjIsActive(vm)) {
-        vm->persistent = 0;
-    } else {
-        virDomainObjListRemove(driver->domains, vm);
+    vm->persistent = 0;
+    if (!virDomainObjIsActive(vm)) {
+        virCHDomainRemoveInactive(driver, vm);
     }
 
     ret = 0;
@@ -608,12 +607,14 @@ chDomainDestroyFlags(virDomainPtr dom, unsigned int flags)
     if (virDomainObjCheckActive(vm) < 0)
         goto endjob;
 
-    ret = virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED);
+    if (virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED) < 0)
+        goto endjob;
+
+    virCHDomainRemoveInactive(driver, vm);
+    ret = 0;
 
  endjob:
     virCHDomainObjEndJob(vm);
-    if (!vm->persistent)
-        virDomainObjListRemove(driver->domains, vm);
 
  cleanup:
     virDomainObjEndAPI(&vm);