]> xenbits.xensource.com Git - libvirt.git/commitdiff
virLXCProcessReboot: Remove the need to re-register autodestroy callback
authorPeter Krempa <pkrempa@redhat.com>
Tue, 28 Jun 2022 15:08:00 +0000 (17:08 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 22 Jul 2022 09:11:42 +0000 (11:11 +0200)
Add a new flag VIR_LXC_PROCESS_CLEANUP_AUTODESTROY to
virLXCProcessCleanupFlags for skipping removal of the autodestroy
callback so that fake reboot of the container doesn't need to fetch the
connection and re-register it.

Since virLXCProcessReboot is defined before virLXCProcessCleanupFlags,
this patch also moves the flag enum typedef to the beginning of the
file.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Tim Wiederhake <twiederh@redhat.com>
src/lxc/lxc_process.c

index 753e9e0b9a61af8752811e2d0043ea73051d41f7..f9854ac1389dbf7530e9726a43edf532864715c2 100644 (file)
@@ -56,6 +56,13 @@ VIR_LOG_INIT("lxc.lxc_process");
 
 #define START_POSTFIX ": starting up\n"
 
+typedef enum {
+    VIR_LXC_PROCESS_CLEANUP_RELEASE_SECLABEL = (1 << 0),
+    VIR_LXC_PROCESS_CLEANUP_RESTORE_SECLABEL = (1 << 1),
+    VIR_LXC_PROCESS_CLEANUP_REMOVE_TRANSIENT = (1 << 2),
+    VIR_LXC_PROCESS_CLEANUP_AUTODESTROY = (1 << 3),
+} virLXCProcessCleanupFlags;
+
 static void
 lxcProcessAutoDestroy(virDomainObj *dom,
                       virConnectPtr conn)
@@ -87,23 +94,21 @@ static int
 virLXCProcessReboot(virLXCDriver *driver,
                     virDomainObj *vm)
 {
-    g_autoptr(virConnect) autoDestroyConn = virCloseCallbacksGetConn(driver->closeCallbacks, vm);
+    /* we want to keep the autodestroy callback registered */
+    unsigned int stopFlags = ~(VIR_LXC_PROCESS_CLEANUP_AUTODESTROY);
     int reason = vm->state.reason;
     virDomainDef *savedDef;
 
     VIR_DEBUG("Faking reboot");
 
-    if (autoDestroyConn)
-        virObjectRef(autoDestroyConn);
-
     /* In a reboot scenario, we need to make sure we continue
      * to use the current 'def', and not switch to 'newDef'.
      * So temporarily hide the newDef and then reinstate it
      */
     savedDef = g_steal_pointer(&vm->newDef);
-    virLXCProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN, 0);
+    virLXCProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN, stopFlags);
     vm->newDef = savedDef;
-    if (virLXCProcessStart(driver, vm, 0, NULL, autoDestroyConn, reason) < 0) {
+    if (virLXCProcessStart(driver, vm, 0, NULL, NULL, reason) < 0) {
         VIR_WARN("Unable to handle reboot of vm %s", vm->def->name);
         return -1;
     }
@@ -126,12 +131,6 @@ lxcProcessRemoveDomainStatus(virLXCDriverConfig *cfg,
 }
 
 
-typedef enum {
-    VIR_LXC_PROCESS_CLEANUP_RELEASE_SECLABEL = (1 << 0),
-    VIR_LXC_PROCESS_CLEANUP_RESTORE_SECLABEL = (1 << 1),
-    VIR_LXC_PROCESS_CLEANUP_REMOVE_TRANSIENT = (1 << 2),
-} virLXCProcessCleanupFlags;
-
 /**
  * virLXCProcessCleanup:
  * @driver: pointer to driver structure
@@ -188,8 +187,9 @@ static void virLXCProcessCleanup(virLXCDriver *driver,
     }
 
     /* Stop autodestroy in case guest is restarted */
-    virCloseCallbacksUnset(driver->closeCallbacks, vm,
-                           lxcProcessAutoDestroy);
+    if (flags & VIR_LXC_PROCESS_CLEANUP_AUTODESTROY) {
+        virCloseCallbacksUnset(driver->closeCallbacks, vm, lxcProcessAutoDestroy);
+    }
 
     if (priv->monitor) {
         virLXCMonitorClose(priv->monitor);