From: Peter Krempa Date: Fri, 16 Dec 2016 14:45:26 +0000 (+0100) Subject: qemu: snapshot: Properly handle image locking X-Git-Tag: v3.0.0-rc1~41 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f61e40610d790836f3af2393ae7d77843f03f378;p=thirdparty%2Flibvirt.git qemu: snapshot: Properly handle image locking Images that became the backing chain of the current image due to the snapshot need to be unlocked in the lock manager. Also if qemu was paused during the snapshot the current top level images need to be released until qemu is resumed so that they can be acquired properly. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1191901 --- diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4dc97e0191..da49088bd0 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14486,6 +14486,23 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver, virStorageFileUnlink(diskdata[i].src) < 0) VIR_WARN("Unable to remove just-created %s", diskdata[i].src->path); } + } else { + /* on successful snapshot we need to remove locks from the now-old + * disks and if the VM is paused release locks on the images since qemu + * stopped using them*/ + bool paused = virDomainObjGetState(vm, NULL) != VIR_DOMAIN_RUNNING; + + for (i = 0; i < snap->def->ndisks; i++) { + if (!diskdata[i].disk) + continue; + + if (paused) + virDomainLockImageDetach(driver->lockManager, vm, + diskdata[i].disk->src); + + virDomainLockImageDetach(driver->lockManager, vm, + diskdata[i].disk->src->backingStore); + } } if (ret == 0 || !actions) {