[PATCH 0/5] qemu: Fix handling of persistent reservations daemon with blockjobs

See 5/5 Peter Krempa (5): qemu_hotplug.h: Reformat according to new coding style virDomainDefHasManagedPR: Consider also disk's 'mirror' chain qemu: hotplug: Export persistent reservations manager helper functions qemu: blockjob: Remove persistent reservations manager when dropping disk images qemu: Attach persistent reservations manager if block-copy target requires it src/conf/domain_conf.c | 3 + src/qemu/qemu_blockjob.c | 3 + src/qemu/qemu_driver.c | 5 ++ src/qemu/qemu_hotplug.c | 4 +- src/qemu/qemu_hotplug.h | 175 ++++++++++++++++++++++----------------- 5 files changed, 113 insertions(+), 77 deletions(-) -- 2.48.1

Fix the mixed style by unifying the formatting. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_hotplug.h | 167 ++++++++++++++++++++++------------------ 1 file changed, 92 insertions(+), 75 deletions(-) diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 4fe7f4923e..c6cea0fe69 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -24,52 +24,62 @@ #include "qemu_conf.h" #include "qemu_domain.h" -void qemuDomainDelTLSObjects(virDomainObj *vm, - virDomainAsyncJob asyncJob, - const char *secAlias, - const char *tlsAlias); - -int qemuDomainAddTLSObjects(virDomainObj *vm, - virDomainAsyncJob asyncJob, - virJSONValue **secProps, - virJSONValue **tlsProps); - -int qemuDomainGetTLSObjects(qemuDomainSecretInfo *secinfo, - const char *tlsCertdir, - bool tlsListen, - bool tlsVerify, - const char *alias, - virJSONValue **tlsProps, - virJSONValue **secProps); - -int qemuDomainAttachDiskGeneric(virDomainObj *vm, - virDomainDiskDef *disk, - virDomainAsyncJob asyncJob); - -int qemuDomainFindGraphicsIndex(virDomainDef *def, - virDomainGraphicsDef *dev); -int qemuDomainChangeGraphicsPasswords(virDomainObj *vm, - int type, - virDomainGraphicsAuthDef *auth, - const char *defaultPasswd, - int asyncJob); - -int qemuDomainAttachDeviceLive(virDomainObj *vm, - virDomainDeviceDef *dev, - virQEMUDriver *driver); - -int qemuDomainDetachDeviceLive(virDomainObj *vm, - virDomainDeviceDef *match, - virQEMUDriver *driver, - bool async); - -int qemuDomainUpdateDeviceLive(virDomainObj *vm, - virDomainDeviceDef *dev, - virQEMUDriver *driver, - bool force); - -void qemuDomainRemoveVcpuAlias(virDomainObj *vm, - const char *alias); +void +qemuDomainDelTLSObjects(virDomainObj *vm, + virDomainAsyncJob asyncJob, + const char *secAlias, + const char *tlsAlias); + +int +qemuDomainAddTLSObjects(virDomainObj *vm, + virDomainAsyncJob asyncJob, + virJSONValue **secProps, + virJSONValue **tlsProps); + +int +qemuDomainGetTLSObjects(qemuDomainSecretInfo *secinfo, + const char *tlsCertdir, + bool tlsListen, + bool tlsVerify, + const char *alias, + virJSONValue **tlsProps, + virJSONValue **secProps); + +int +qemuDomainAttachDiskGeneric(virDomainObj *vm, + virDomainDiskDef *disk, + virDomainAsyncJob asyncJob); + +int +qemuDomainFindGraphicsIndex(virDomainDef *def, + virDomainGraphicsDef *dev); +int +qemuDomainChangeGraphicsPasswords(virDomainObj *vm, + int type, + virDomainGraphicsAuthDef *auth, + const char *defaultPasswd, + int asyncJob); + +int +qemuDomainAttachDeviceLive(virDomainObj *vm, + virDomainDeviceDef *dev, + virQEMUDriver *driver); + +int +qemuDomainDetachDeviceLive(virDomainObj *vm, + virDomainDeviceDef *match, + virQEMUDriver *driver, + bool async); + +int +qemuDomainUpdateDeviceLive(virDomainObj *vm, + virDomainDeviceDef *dev, + virQEMUDriver *driver, + bool force); + +void +qemuDomainRemoveVcpuAlias(virDomainObj *vm, + const char *alias); int qemuDomainChrInsert(virDomainDef *vmdef, @@ -78,33 +88,40 @@ virDomainChrDef * qemuDomainChrRemove(virDomainDef *vmdef, virDomainChrDef *chr); -int qemuDomainRemoveDevice(virQEMUDriver *driver, +int +qemuDomainRemoveDevice(virQEMUDriver *driver, + virDomainObj *vm, + virDomainDeviceDef *dev); + +bool +qemuDomainSignalDeviceRemoval(virDomainObj *vm, + const char *devAlias, + qemuDomainUnpluggingDeviceStatus status); + +int +qemuDomainSetVcpusInternal(virQEMUDriver *driver, virDomainObj *vm, - virDomainDeviceDef *dev); - -bool qemuDomainSignalDeviceRemoval(virDomainObj *vm, - const char *devAlias, - qemuDomainUnpluggingDeviceStatus status); - -int qemuDomainSetVcpusInternal(virQEMUDriver *driver, - virDomainObj *vm, - virDomainDef *def, - virDomainDef *persistentDef, - unsigned int nvcpus, - bool hotpluggable); - -int qemuDomainSetVcpuInternal(virQEMUDriver *driver, - virDomainObj *vm, - virDomainDef *def, - virDomainDef *persistentDef, - virBitmap *vcpus, - bool state); - -unsigned long long qemuDomainGetUnplugTimeout(virDomainObj *vm) G_NO_INLINE; - -int qemuHotplugAttachDBusVMState(virQEMUDriver *driver, - virDomainObj *vm, - virDomainAsyncJob asyncJob); - -int qemuHotplugRemoveDBusVMState(virDomainObj *vm, - virDomainAsyncJob asyncJob); + virDomainDef *def, + virDomainDef *persistentDef, + unsigned int nvcpus, + bool hotpluggable); + +int +qemuDomainSetVcpuInternal(virQEMUDriver *driver, + virDomainObj *vm, + virDomainDef *def, + virDomainDef *persistentDef, + virBitmap *vcpus, + bool state); + +unsigned long long +qemuDomainGetUnplugTimeout(virDomainObj *vm) G_NO_INLINE; + +int +qemuHotplugAttachDBusVMState(virQEMUDriver *driver, + virDomainObj *vm, + virDomainAsyncJob asyncJob); + +int +qemuHotplugRemoveDBusVMState(virDomainObj *vm, + virDomainAsyncJob asyncJob); -- 2.48.1

Consider also the destination of a block-copy job. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2ef18b77fc..87f87bbe56 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -31372,6 +31372,9 @@ virDomainDefHasManagedPR(const virDomainDef *def) for (i = 0; i < def->ndisks; i++) { if (virStorageSourceChainHasManagedPR(def->disks[i]->src)) return true; + + if (virStorageSourceChainHasManagedPR(def->disks[i]->mirror)) + return true; } return false; -- 2.48.1

Export qemuHotplugAttachManagedPR/qemuHotplugRemoveManagedPR for reuse in blockjob code. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_hotplug.c | 4 ++-- src/qemu/qemu_hotplug.h | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 5a7e6c3b12..6c224c9793 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -419,7 +419,7 @@ qemuHotplugRemoveDBusVMState(virDomainObj *vm, * * Returns: 0 on success, -1 on error. */ -static int +int qemuHotplugAttachManagedPR(virDomainObj *vm, virStorageSource *src, virDomainAsyncJob asyncJob) @@ -469,7 +469,7 @@ qemuHotplugAttachManagedPR(virDomainObj *vm, * Removes the managed PR object from @vm if the configuration does not require * it any more. */ -static int +int qemuHotplugRemoveManagedPR(virDomainObj *vm, virDomainAsyncJob asyncJob) { diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index c6cea0fe69..d51f649bac 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -125,3 +125,11 @@ qemuHotplugAttachDBusVMState(virQEMUDriver *driver, int qemuHotplugRemoveDBusVMState(virDomainObj *vm, virDomainAsyncJob asyncJob); + +int +qemuHotplugAttachManagedPR(virDomainObj *vm, + virStorageSource *src, + virDomainAsyncJob asyncJob); +int +qemuHotplugRemoveManagedPR(virDomainObj *vm, + virDomainAsyncJob asyncJob); -- 2.48.1

Check if the persistent reservations manager daemon is still needed after a disk (sub)-chain was dropped after a blockjob. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_blockjob.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 4e77543fa8..3aef1ec285 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -28,6 +28,7 @@ #include "qemu_domain.h" #include "qemu_alias.h" #include "qemu_backup.h" +#include "qemu_hotplug.h" #include "conf/domain_conf.h" #include "conf/domain_event.h" @@ -707,6 +708,8 @@ qemuBlockJobEventProcessConcludedRemoveChain(virQEMUDriver *driver, qemuDomainObjExitMonitor(vm); qemuDomainStorageSourceChainAccessRevoke(driver, vm, chain); + + ignore_value(qemuHotplugRemoveManagedPR(vm, asyncJob)); } -- 2.48.1

Users can choose to copy a disk into a destination where they want to use persistent reservations. Start the daemon if the configuration requires it. Resolves: https://issues.redhat.com/browse/RHEL-7342 Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1b5ac883b5..78bfaa5b3a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14389,6 +14389,9 @@ qemuDomainBlockCopyCommon(virDomainObj *vm, goto endjob; } + if (qemuHotplugAttachManagedPR(vm, mirror, VIR_ASYNC_JOB_NONE) < 0) + goto endjob; + if (data) { qemuDomainObjEnterMonitor(vm); rc = qemuBlockStorageSourceChainAttach(priv->mon, data); @@ -14445,6 +14448,8 @@ qemuDomainBlockCopyCommon(virDomainObj *vm, } if (need_revoke) qemuDomainStorageSourceChainAccessRevoke(driver, vm, mirror); + + ignore_value(qemuHotplugRemoveManagedPR(vm, VIR_ASYNC_JOB_NONE)); } if (need_unlink && virStorageSourceUnlink(mirror) < 0) VIR_WARN("%s", _("unable to remove just-created copy target")); -- 2.48.1

On 2/4/25 18:25, Peter Krempa wrote:
See 5/5
Peter Krempa (5): qemu_hotplug.h: Reformat according to new coding style virDomainDefHasManagedPR: Consider also disk's 'mirror' chain qemu: hotplug: Export persistent reservations manager helper functions qemu: blockjob: Remove persistent reservations manager when dropping disk images qemu: Attach persistent reservations manager if block-copy target requires it
src/conf/domain_conf.c | 3 + src/qemu/qemu_blockjob.c | 3 + src/qemu/qemu_driver.c | 5 ++ src/qemu/qemu_hotplug.c | 4 +- src/qemu/qemu_hotplug.h | 175 ++++++++++++++++++++++----------------- 5 files changed, 113 insertions(+), 77 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Michal Prívozník
-
Peter Krempa