diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cd6ee22e57a4282bde9fdb326ded3269941a6b08..4e5c538a3f258222f8931c8985e28d68da683e56 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -12277,15 +12277,30 @@ virDomainDiskRemoveByName(virDomainDefPtr def, const char *name) return virDomainDiskRemove(def, idx); } -/* Return true if VM has at least one disk involved in a current block - * copy/commit job (that is, with a element in the disk xml). */ +/** + * virDomainHasBlockjob: + * @vm: domain object + * @copy_only: Reject only block copy job + * + * Return true if @vm has at least one disk involved in a current block + * copy/commit/pull job. If @copy_only is true this returns true only if the + * disk is involved in a block copy. + * */ bool -virDomainHasDiskMirror(virDomainObjPtr vm) +virDomainHasBlockjob(virDomainObjPtr vm, + bool copy_only) { size_t i; - for (i = 0; i < vm->def->ndisks; i++) - if (vm->def->disks[i]->mirror) + for (i = 0; i < vm->def->ndisks; i++) { + if (!copy_only && + vm->def->disks[i]->blockjob) + return true; + + if (vm->def->disks[i]->mirror && + vm->def->disks[i]->mirrorJob == VIR_DOMAIN_BLOCK_JOB_TYPE_COPY) return true; + } + return false; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 84e880a6d7c2c4ceb700ab59893e0e3bfcb18279..33200846a2f605bf414c7f9780179083db1d05c1 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2660,7 +2660,8 @@ int virDomainDiskSourceParse(xmlNodePtr node, xmlXPathContextPtr ctxt, virStorageSourcePtr src); -bool virDomainHasDiskMirror(virDomainObjPtr vm); +bool virDomainHasBlockjob(virDomainObjPtr vm, + bool copy_only); int virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net); virDomainNetDefPtr virDomainNetFind(virDomainDefPtr def, const char *device); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5716ece1d15e3f42f59773371e0977efb9fc1ff2..9e71b1a8c4131a60460ba39245ad6279a4bf09af 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -297,7 +297,7 @@ virDomainGraphicsTypeFromString; virDomainGraphicsTypeToString; virDomainGraphicsVNCSharePolicyTypeFromString; virDomainGraphicsVNCSharePolicyTypeToString; -virDomainHasDiskMirror; +virDomainHasBlockjob; virDomainHasNet; virDomainHostdevCapsTypeToString; virDomainHostdevDefAlloc; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index fc288c5260cd9c2205c34034eb2d80de047502ea..80a21d86cf6df3de619c19201846c51d3e245d35 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7387,7 +7387,7 @@ static virDomainPtr qemuDomainDefineXMLFlags(virConnectPtr conn, const char *xml virObjectRef(vm); def = NULL; - if (virDomainHasDiskMirror(vm)) { + if (virDomainHasBlockjob(vm, true)) { virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s", _("domain has active block job")); virDomainObjAssignDef(vm, NULL, false, NULL); @@ -15237,8 +15237,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, if (!(caps = virQEMUDriverGetCapabilities(driver, false))) goto cleanup; - if (virDomainHasDiskMirror(vm)) { - virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s", + if (virDomainHasBlockjob(vm, false)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("domain has active block job")); goto cleanup; } diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index d34bb02dc4202756c7b4a2e9c029df5cfbde16b0..8c45415b7e0402e76ad0d6b0b2a04e367f0b1c60 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1977,7 +1977,7 @@ qemuMigrationIsAllowed(virQEMUDriverPtr driver, virDomainObjPtr vm, } - if (virDomainHasDiskMirror(vm)) { + if (virDomainHasBlockjob(vm, false)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("domain has an active block job")); return false;