[libvirt] [PATCH 24/25] qemu: blockjob: Unplug inherited storage chains when concluding blockjob
Peter Krempa
pkrempa at redhat.com
Fri Jul 12 16:06:05 UTC 2019
In cases when the disk frontend was unplugged while a blockjob was
running the blockjob inherits the backing chain. When the blockjob is
then terminated we need to unplug the chain as it will not be used any
more.
Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
src/qemu/qemu_blockjob.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 70b223b29d..8a1cf6893b 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -537,6 +537,28 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver,
}
+static void
+qemuBlockJobEventProcessConcludedRemoveChain(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob,
+ virStorageSourcePtr chain)
+{
+ VIR_AUTOPTR(qemuBlockStorageSourceChainData) data = NULL;
+
+ if (!(data = qemuBlockStorageSourceChainDetachPrepareBlockdev(chain)))
+ return;
+
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+ return;
+
+ qemuBlockStorageSourceChainDetach(qemuDomainGetMonitor(vm), data);
+ if (qemuDomainObjExitMonitor(driver, vm) < 0)
+ return;
+
+ qemuDomainStorageSourceChainAccessRevoke(driver, vm, chain);
+}
+
+
static void
qemuBlockJobEventProcessConcludedTransition(qemuBlockJobDataPtr job,
virQEMUDriverPtr driver,
@@ -653,6 +675,16 @@ qemuBlockJobEventProcessConcluded(qemuBlockJobDataPtr job,
qemuBlockJobEventProcessConcludedTransition(job, driver, vm, asyncJob);
+ /* unplug the backing chains in case the job inherited them */
+ if (!job->disk) {
+ if (job->chain)
+ qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob,
+ job->chain);
+ if (job->mirrorChain)
+ qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob,
+ job->mirrorChain);
+ }
+
cleanup:
if (dismissed) {
qemuBlockJobUnregister(job, vm);
--
2.21.0
More information about the libvir-list
mailing list