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);