diff options
author | Jiri Denemark <jdenemar@redhat.com> | 2014-04-25 15:07:37 +0200 |
---|---|---|
committer | Jiri Denemark <jdenemar@redhat.com> | 2014-04-27 21:19:12 +0200 |
commit | eec2f65946388102f8acdd63f13c21a8b9aae806 (patch) | |
tree | 6bba053822ad2b46aa4428786b68b00358241432 | |
parent | 34cc3b2f106e296df5e64309620c79d16fd76c85 (diff) | |
download | libvirt-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.c | 12 |
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 || |