diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index d55eb48605..292610d089 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -536,6 +536,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, @@ -652,6 +674,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);