]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Recheck disk backing chains after snapshot
authorJiri Denemark <jdenemar@redhat.com>
Fri, 25 Apr 2014 13:07:37 +0000 (15:07 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Sun, 27 Apr 2014 19:19:12 +0000 (21:19 +0200)
When a snapshot operation finishes we have to recheck the backing chain
of all disks involved in the snapshot. And we need to do that even if
the operation failed because some of the disks might have changed if
QEMU did not support transactions.

src/qemu/qemu_driver.c

index 69a7053c058e16af7ff951df53900d4d7e95c2b8..e0b855054d13380606e50ccf903f4cbaa3b1abdb 100644 (file)
@@ -12949,6 +12949,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver,
     bool persist = false;
     bool reuse = (flags & VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT) != 0;
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+    virErrorPtr orig_err = NULL;
 
     if (!virDomainObjIsActive(vm)) {
         virReportError(VIR_ERR_OPERATION_INVALID,
@@ -13040,6 +13041,17 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver,
     }
 
  cleanup:
+    /* recheck backing chains of all disks involved in the snapshot */
+    orig_err = virSaveLastError();
+    for (i = 0; i < snap->def->ndisks; i++) {
+        if (snap->def->disks[i].snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL)
+            continue;
+        qemuDomainDetermineDiskChain(driver, vm, vm->def->disks[i], true);
+    }
+    if (orig_err) {
+        virSetError(orig_err);
+        virFreeError(orig_err);
+    }
 
     if (ret == 0 || !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_TRANSACTION)) {
         if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0 ||