}
+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,
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);