mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 11:22:23 +00:00
qemu: Detect managed persistent reservations in block job orphan chains
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 <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
b3f8ad07dd
commit
0a9fd83240
@ -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;
|
||||
}
|
||||
|
@ -1146,6 +1146,8 @@ qemuDomainDiskCachemodeFlags(int cachemode,
|
||||
|
||||
char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv);
|
||||
|
||||
bool qemuDomainDefHasManagedPR(virDomainObjPtr vm);
|
||||
|
||||
unsigned int qemuDomainStorageIdNew(qemuDomainObjPrivatePtr priv);
|
||||
void qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv);
|
||||
|
||||
|
@ -4792,7 +4792,7 @@ processPRDisconnectEvent(virDomainObjPtr vm)
|
||||
return;
|
||||
|
||||
if (!priv->prDaemonRunning &&
|
||||
virDomainDefHasManagedPR(vm->def))
|
||||
qemuDomainDefHasManagedPR(vm))
|
||||
qemuProcessStartManagedPRDaemon(vm);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user