summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Denemark <jdenemar@redhat.com>2014-04-25 15:07:37 +0200
committerJiri Denemark <jdenemar@redhat.com>2014-04-27 21:19:12 +0200
commiteec2f65946388102f8acdd63f13c21a8b9aae806 (patch)
tree6bba053822ad2b46aa4428786b68b00358241432
parent34cc3b2f106e296df5e64309620c79d16fd76c85 (diff)
downloadlibvirt-eec2f65946388102f8acdd63f13c21a8b9aae806.tar.gz
Recheck disk backing chains after snapshotv1.2.4-rc1
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.
-rw-r--r--src/qemu/qemu_driver.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 69a7053c05..e0b855054d 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -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 ||