[libvirt] [PATCH 3/3] snapshot: remove snapshot metadata on transient exit

Eric Blake eblake at redhat.com
Wed Sep 21 19:08:52 UTC 2011


Commit 282fe1f0 documented that transient domains will auto-delete
any snapshot metadata when the last reference to the domain is
removed, and that management apps are in charge of grabbing any
snapshot metadata prior to that point.  However, this was not
actually implemented for qemu until now.

* src/qemu/qemu_driver.c (qemudDomainCreate)
(qemuDomainDestroyFlags, qemuDomainSaveInternal)
(qemudDomainCoreDump, qemuDomainRestoreFlags, qemudDomainDefine)
(qemuDomainUndefineFlags, qemuDomainMigrateConfirm3)
(qemuDomainRevertToSnapshot): Clean up snapshot metadata.
* src/qemu/qemu_migration.c (qemuMigrationPrepareAny)
(qemuMigrationPerformJob, qemuMigrationPerformPhase)
(qemuMigrationFinish): Likewise.
* src/qemu/qemu_process.c (qemuProcessHandleMonitorEOF)
(qemuProcessReconnect, qemuProcessReconnectHelper)
(qemuProcessAutoDestroyDom): Likewise.
---
 src/qemu/qemu_driver.c    |   26 ++++++++++----------------
 src/qemu/qemu_migration.c |    8 ++++----
 src/qemu/qemu_process.c   |    8 ++++----
 3 files changed, 18 insertions(+), 24 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4ff3281..0d0bea2 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1318,8 +1318,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
                          -1, NULL, NULL, VIR_VM_OP_CREATE) < 0) {
         virDomainAuditStart(vm, "booted", false);
         if (qemuDomainObjEndJob(driver, vm) > 0)
-            virDomainRemoveInactive(&driver->domains,
-                                    vm);
+            qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
         goto cleanup;
     }
@@ -1658,8 +1657,7 @@ qemuDomainDestroyFlags(virDomainPtr dom,

     if (!vm->persistent) {
         if (qemuDomainObjEndJob(driver, vm) > 0)
-            virDomainRemoveInactive(&driver->domains,
-                                    vm);
+            qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }
     ret = 0;
@@ -2529,8 +2527,7 @@ qemuDomainSaveInternal(struct qemud_driver *driver, virDomainPtr dom,
                                      VIR_DOMAIN_EVENT_STOPPED_SAVED);
     if (!vm->persistent) {
         if (qemuDomainObjEndAsyncJob(driver, vm) > 0)
-            virDomainRemoveInactive(&driver->domains,
-                                    vm);
+            qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }

@@ -2947,8 +2944,7 @@ endjob:
     if (qemuDomainObjEndAsyncJob(driver, vm) == 0)
         vm = NULL;
     else if ((ret == 0) && (flags & VIR_DUMP_CRASH) && !vm->persistent) {
-        virDomainRemoveInactive(&driver->domains,
-                                vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }

@@ -4151,7 +4147,7 @@ qemuDomainRestoreFlags(virConnectPtr conn,
     if (qemuDomainObjEndJob(driver, vm) == 0)
         vm = NULL;
     else if (ret < 0 && !vm->persistent) {
-        virDomainRemoveInactive(&driver->domains, vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }

@@ -4830,8 +4826,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
     if (virDomainSaveConfig(driver->configDir,
                             vm->newDef ? vm->newDef : vm->def) < 0) {
         VIR_INFO("Defining domain '%s'", vm->def->name);
-        virDomainRemoveInactive(&driver->domains,
-                                vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
         goto cleanup;
     }
@@ -4936,8 +4931,7 @@ qemuDomainUndefineFlags(virDomainPtr dom,
     if (virDomainObjIsActive(vm)) {
         vm->persistent = 0;
     } else {
-        virDomainRemoveInactive(&driver->domains,
-                                vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }

@@ -8243,7 +8237,7 @@ qemuDomainMigrateConfirm3(virDomainPtr domain,
                (!vm->persistent || (flags & VIR_MIGRATE_UNDEFINE_SOURCE))) {
         if (flags & VIR_MIGRATE_UNDEFINE_SOURCE)
             virDomainDeleteConfig(driver->configDir, driver->autostartDir, vm);
-        virDomainRemoveInactive(&driver->domains, vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }

@@ -9774,7 +9768,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
         if (qemuDomainSnapshotRevertInactive(driver, vm, snap) < 0) {
             if (!vm->persistent) {
                 if (qemuDomainObjEndJob(driver, vm) > 0)
-                    virDomainRemoveInactive(&driver->domains, vm);
+                    qemuDomainRemoveInactive(driver, vm);
                 vm = NULL;
                 goto cleanup;
             }
@@ -9797,7 +9791,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
             if (rc < 0) {
                 if (!vm->persistent) {
                     if (qemuDomainObjEndJob(driver, vm) > 0)
-                        virDomainRemoveInactive(&driver->domains, vm);
+                        qemuDomainRemoveInactive(driver, vm);
                     vm = NULL;
                     goto cleanup;
                 }
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index d9f8d93..4fd2e9f 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1127,7 +1127,7 @@ endjob:
     if (qemuMigrationJobFinish(driver, vm) == 0) {
         vm = NULL;
     } else if (!vm->persistent) {
-        virDomainRemoveInactive(&driver->domains, vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }
     goto cleanup;
@@ -2272,7 +2272,7 @@ endjob:
                 (ret == 0 && (flags & VIR_MIGRATE_UNDEFINE_SOURCE)))) {
         if (flags & VIR_MIGRATE_UNDEFINE_SOURCE)
             virDomainDeleteConfig(driver->configDir, driver->autostartDir, vm);
-        virDomainRemoveInactive(&driver->domains, vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }

@@ -2351,7 +2351,7 @@ endjob:
     if (refs == 0) {
         vm = NULL;
     } else if (!virDomainObjIsActive(vm) && !vm->persistent) {
-        virDomainRemoveInactive(&driver->domains, vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }

@@ -2615,7 +2615,7 @@ endjob:
     if (qemuMigrationJobFinish(driver, vm) == 0) {
         vm = NULL;
     } else if (!vm->persistent && !virDomainObjIsActive(vm)) {
-        virDomainRemoveInactive(&driver->domains, vm);
+        qemuDomainRemoveInactive(driver, vm);
         vm = NULL;
     }

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 8797a56..c27a5e2 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -150,7 +150,7 @@ qemuProcessHandleMonitorEOF(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
     virDomainAuditStop(vm, auditReason);

     if (!vm->persistent)
-        virDomainRemoveInactive(&driver->domains, vm);
+        qemuDomainRemoveInactive(driver, vm);
     else
         virDomainObjUnlock(vm);

@@ -2674,7 +2674,7 @@ error:
          * user tries to start it again later */
         qemuProcessStop(driver, obj, 0, VIR_DOMAIN_SHUTOFF_FAILED);
         if (!obj->persistent)
-            virDomainRemoveInactive(&driver->domains, obj);
+            qemuDomainRemoveInactive(driver, obj);
         else
             virDomainObjUnlock(obj);
     }
@@ -2751,7 +2751,7 @@ qemuProcessReconnectHelper(void *payload,
             * Kill qemu */
             qemuProcessStop(src->driver, obj, 0, VIR_DOMAIN_SHUTOFF_FAILED);
             if (!obj->persistent)
-                virDomainRemoveInactive(&src->driver->domains, obj);
+                qemuDomainRemoveInactive(src->driver, obj);
             else
                 virDomainObjUnlock(obj);
         }
@@ -3698,7 +3698,7 @@ static void qemuProcessAutoDestroyDom(void *payload,
     if (qemuDomainObjEndJob(data->driver, dom) == 0)
         dom = NULL;
     if (dom && !dom->persistent)
-        virDomainRemoveInactive(&data->driver->domains, dom);
+        qemuDomainRemoveInactive(data->driver, dom);

 cleanup:
     if (dom)
-- 
1.7.4.4




More information about the libvir-list mailing list