From 0a9fd832403d16aa04fca319da63d7bec33f685d Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 21 Mar 2019 13:54:20 +0100 Subject: [PATCH] qemu: Detect managed persistent reservations in block job orphan chains MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The PR manager is a property of the format layer in qemu so we need to be able to track it also in the chains of orphaned block jobs. Add a helper for qemu to look also into the blockjob state. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_domain.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_hotplug.c | 2 +- src/qemu/qemu_process.c | 2 +- 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index fc8deb7084..e7f28aa2b8 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -14780,3 +14780,44 @@ qemuDomainPausedReasonToSuspendedEvent(virDomainPausedReason reason) return VIR_DOMAIN_EVENT_SUSPENDED_PAUSED; } + + +static int +qemuDomainDefHasManagedPRBlockjobIterator(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) +{ + qemuBlockJobDataPtr job = payload; + bool *hasPR = opaque; + + if (job->disk) + return 0; + + if ((job->chain && virStorageSourceChainHasManagedPR(job->chain)) || + (job->mirrorChain && virStorageSourceChainHasManagedPR(job->mirrorChain))) + *hasPR = true; + + return 0; +} + + +/** + * qemuDomainDefHasManagedPR: + * @vm: domain object + * + * @vm must be an active VM. Returns true if @vm has any storage source with + * managed persistent reservations. + */ +bool +qemuDomainDefHasManagedPR(virDomainObjPtr vm) +{ + qemuDomainObjPrivatePtr priv = vm->privateData; + bool jobPR = false; + + if (virDomainDefHasManagedPR(vm->def)) + return true; + + virHashForEach(priv->blockjobs, qemuDomainDefHasManagedPRBlockjobIterator, &jobPR); + + return jobPR; +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index b0bff0b01d..b0c465cb22 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -1146,6 +1146,8 @@ qemuDomainDiskCachemodeFlags(int cachemode, char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv); +bool qemuDomainDefHasManagedPR(virDomainObjPtr vm); + unsigned int qemuDomainStorageIdNew(qemuDomainObjPrivatePtr priv); void qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 44c7042d77..329c166255 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4792,7 +4792,7 @@ processPRDisconnectEvent(virDomainObjPtr vm) return; if (!priv->prDaemonRunning && - virDomainDefHasManagedPR(vm->def)) + qemuDomainDefHasManagedPR(vm)) qemuProcessStartManagedPRDaemon(vm); } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 7e9c1a1649..c50e41144e 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -397,7 +397,7 @@ qemuHotplugRemoveManagedPR(virQEMUDriverPtr driver, virErrorPtr orig_err; int ret = -1; - if (virDomainDefHasManagedPR(vm->def)) + if (qemuDomainDefHasManagedPR(vm)) return 0; virErrorPreserveLast(&orig_err); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index a2fe287f35..f3ffd76259 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -2309,7 +2309,7 @@ qemuRefreshPRManagerState(virQEMUDriverPtr driver, int ret = -1; if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_PR_MANAGER_HELPER) || - !virDomainDefHasManagedPR(vm->def)) + !qemuDomainDefHasManagedPR(vm)) return 0; qemuDomainObjEnterMonitor(driver, vm); -- 2.47.2