We need to check that qemu supports block jobs in multiple places. Add a helper to do the check. --- src/qemu/qemu_domain.c | 30 ++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 707ef8b..3fb497f 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3038,3 +3038,33 @@ qemuDomainGetMonitor(virDomainObjPtr vm) { return ((qemuDomainObjPrivatePtr) vm->privateData)->mon; } + + +/** + * qemuDomainSupportsBlockJobs: + * @vm: domain object + * @modern: pointer to bool that returns whether modern block jobs are supported + * + * Returns -1 in case when qemu does not support block jobs at all. Otherwise + * returns 0 and optionally fills @modern to denote that modern (async) block + * jobs are supported. + */ +int +qemuDomainSupportsBlockJobs(virDomainObjPtr vm, + bool *modern) +{ + qemuDomainObjPrivatePtr priv = vm->privateData; + bool async = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_ASYNC); + bool sync = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_SYNC); + + if (!sync && !async) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("block jobs not supported with this QEMU binary")); + return -1; + } + + if (modern) + *modern = async; + + return 0; +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 33dac39..ec76e91 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -424,6 +424,8 @@ int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); +int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern) + ATTRIBUTE_NONNULL(1); bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk); void qemuDomObjEndAPI(virDomainObjPtr *vm); -- 2.2.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list