From ffe3d3e88676112424500f843a26770489dccd51 Mon Sep 17 00:00:00 2001 From: Shanzhi Yu Date: Tue, 24 Mar 2015 18:08:00 +0800 Subject: [PATCH] conf: Rename virDomainHasDiskMirror and detect block jobs properly virDomainHasDiskMirror() currently detects only jobs that add the mirror elements. Since some operations like migration are interlocked by existing block jobs on the given domain the check needs to be instrumented to check regular jobs too. This patch renames virDomainHasDiskMirror to virDomainHasDiskBlockjob and adds an argument that allows to select that it returns true only for block copy jobs as those interlock making the domain persistent. Other two uses trigger on any block job type. Signed-off-by: Shanzhi Yu Signed-off-by: Peter Krempa --- src/conf/domain_conf.c | 25 ++++++++++++++++++++----- src/conf/domain_conf.h | 3 ++- src/libvirt_private.syms | 2 +- src/qemu/qemu_driver.c | 6 +++--- src/qemu/qemu_migration.c | 2 +- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cd6ee22e57..4e5c538a3f 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 84e880a6d7..33200846a2 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 5716ece1d1..9e71b1a8c4 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 fc288c5260..80a21d86cf 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 d34bb02dc4..8c45415b7e 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; -- GitLab