For the blockjobs, where libvirt is able to track the state internally
we can fix locking of images we can remove the appropriate locks.
Also when doing a pivoting operation we should not acquire the lock on
any of those images since both are actually locked already.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1302168
---
src/qemu/qemu_blockjob.c | 26 ++++++++++++++++----------
src/qemu/qemu_driver.c | 4 +---
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 83a5a3f7c..4ada4cd27 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -33,6 +33,7 @@
#include "virstoragefile.h"
#include "virthread.h"
#include "virtime.h"
+#include "locking/domain_lock.h"
#define VIR_FROM_THIS VIR_FROM_QEMU
@@ -139,17 +140,19 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
}
}
- /* XXX We want to revoke security labels and disk
- * lease, as well as audit that revocation, before
- * dropping the original source. But it gets tricky
- * if both source and mirror share common backing
- * files (we want to only revoke the non-shared
- * portion of the chain); so for now, we leak the
- * access to the original. */
+ /* XXX We want to revoke security labels as well as audit that
+ * revocation, before dropping the original source. But it gets
+ * tricky if both source and mirror share common backing files (we
+ * want to only revoke the non-shared portion of the chain); so for
+ * now, we leak the access to the original. */
+ virDomainLockImageDetach(driver->lockManager, vm, disk->src);
virStorageSourceFree(disk->src);
disk->src = disk->mirror;
} else {
- virStorageSourceFree(disk->mirror);
+ if (disk->mirror) {
+ virDomainLockImageDetach(driver->lockManager, vm, disk->mirror);
+ virStorageSourceFree(disk->mirror);
+ }
}
/* Recompute the cached backing chain to match our
@@ -172,8 +175,11 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
case VIR_DOMAIN_BLOCK_JOB_FAILED:
case VIR_DOMAIN_BLOCK_JOB_CANCELED:
- virStorageSourceFree(disk->mirror);
- disk->mirror = NULL;
+ if (disk->mirror) {
+ virDomainLockImageDetach(driver->lockManager, vm, disk->mirror);
+ virStorageSourceFree(disk->mirror);
+ disk->mirror = NULL;
+ }
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
save = true;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 13da035c2..dcb010e9a 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -16206,9 +16206,7 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
if (disk->mirror->format &&
disk->mirror->format != VIR_STORAGE_FILE_RAW &&
- (virDomainLockDiskAttach(driver->lockManager, cfg->uri, vm,
- disk) < 0 ||
- qemuDomainNamespaceSetupDisk(driver, vm, disk) < 0 ||
+ (qemuDomainNamespaceSetupDisk(driver, vm, disk) < 0 ||
qemuSetupDiskCgroup(vm, disk) < 0 ||
qemuSecuritySetDiskLabel(driver, vm, disk) < 0))
goto cleanup;
--
2.11.0