Extract the (possible) removal of the PR backend and daemon into a separate helper which enters monitor on it's own. This simplifies the code and allows reuse of this function in the future e.g. for blockjobs where removing a image with PR may result into PR not being necessary. Since the PR is not used often the overhead of entering monitor again should be negligible. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_hotplug.c | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 3ee74c8e40..57ab753974 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -350,6 +350,41 @@ qemuDomainDiskAttachManagedPR(virDomainObjPtr vm, } +/** + * qemuHotplugRemoveManagedPR: + * @driver: QEMU driver object + * @vm: domain object + * @asyncJob: asynchronous job identifier + * + * Removes the managed PR object from @vm if the configuration does not require + * it any more. + */ +static int +qemuHotplugRemoveManagedPR(virQEMUDriverPtr driver, + virDomainObjPtr vm, + qemuDomainAsyncJob asyncJob) +{ + qemuDomainObjPrivatePtr priv = vm->privateData; + virErrorPtr orig_err; + virErrorPreserveLast(&orig_err); + + if (!priv->prDaemonRunning || + virDomainDefHasManagedPR(vm->def)) + return 0; + + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) + return -1; + ignore_value(qemuMonitorDelObject(priv->mon, qemuDomainGetManagedPRAlias())); + if (qemuDomainObjExitMonitor(driver, vm) < 0) + return -1; + + qemuProcessKillManagedPRDaemon(vm); + virErrorRestore(&orig_err); + + return 0; +} + + struct _qemuHotplugDiskSourceData { qemuBlockStorageSourceAttachDataPtr *backends; size_t nbackends; @@ -3948,8 +3983,6 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, virObjectEventPtr event; size_t i; qemuDomainObjPrivatePtr priv = vm->privateData; - bool prManaged = priv->prDaemonRunning; - bool prUsed = false; int ret = -1; VIR_DEBUG("Removing disk %s from domain %p %s", @@ -3965,16 +3998,10 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, } } - /* check if the last disk with managed PR was just removed */ - prUsed = virDomainDefHasManagedPR(vm->def); - qemuDomainObjEnterMonitor(driver, vm); qemuHotplugDiskSourceRemove(priv->mon, diskbackend); - if (prManaged && !prUsed) - ignore_value(qemuMonitorDelObject(priv->mon, qemuDomainGetManagedPRAlias())); - if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; @@ -3983,9 +4010,6 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, event = virDomainEventDeviceRemovedNewFromObj(vm, disk->info.alias); virObjectEventStateQueue(driver->domainEventState, event); - if (prManaged && !prUsed) - qemuProcessKillManagedPRDaemon(vm); - qemuDomainReleaseDeviceAddress(vm, &disk->info, virDomainDiskGetSource(disk)); /* tear down disk security access */ @@ -3996,6 +4020,9 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, ignore_value(qemuRemoveSharedDevice(driver, &dev, vm->def->name)); virDomainUSBAddressRelease(priv->usbaddrs, &disk->info); + if (qemuHotplugRemoveManagedPR(driver, vm, QEMU_ASYNC_JOB_NONE) < 0) + goto cleanup; + ret = 0; cleanup: -- 2.16.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list