Do this by adding a helper function to get the persistent domain config. This should be useful for other functions that may eventually want to alter the persistent domain config (attach/detach device). Also make similar changes to the test drivers setvcpus command. A caveat is that the function will return the running config for a transient domain, rather than error. This simplifies callers, as long as they use other methods to ensure the guest is persistent. Signed-off-by: Cole Robinson <crobinso@xxxxxxxxxx> --- src/conf/domain_conf.c | 21 +++++++++++++++++++++ src/conf/domain_conf.h | 3 +++ src/libvirt_private.syms | 1 + src/qemu/qemu_driver.c | 44 +++++++++++++++++--------------------------- src/test/test_driver.c | 39 ++++++++++++--------------------------- 5 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 045934d..39a77c6 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1008,6 +1008,27 @@ out: } /* + * Return the persistent domain configuration. If domain is transient, + * return the running config. + * + * @param caps pointer to capabilities info + * @param domain domain object pointer + * @return NULL on error, virDOmainDefPtr on success + */ +virDomainDefPtr +virDomainObjGetPersistentDef(virCapsPtr caps, + virDomainObjPtr domain) +{ + if (virDomainObjSetDefTransient(caps, domain) < 0) + return NULL; + + if (domain->newDef) + return domain->newDef; + else + return domain->def; +} + +/* * The caller must hold a lock on the driver owning 'doms', * and must also have locked 'dom', to ensure no one else * is either waiting for 'dom' or still usingn it diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 392e052..10cbded 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1094,6 +1094,9 @@ void virDomainObjAssignDef(virDomainObjPtr domain, bool live); int virDomainObjSetDefTransient(virCapsPtr caps, virDomainObjPtr domain); +virDomainDefPtr +virDomainObjGetPersistentDef(virCapsPtr caps, + virDomainObjPtr domain); void virDomainRemoveInactive(virDomainObjListPtr doms, virDomainObjPtr dom); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 0b62cf1..5a97cb4 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -225,6 +225,7 @@ virDomainNetDefFree; virDomainNetTypeToString; virDomainObjAssignDef; virDomainObjSetDefTransient; +virDomainObjGetPersistentDef; virDomainObjIsDuplicate; virDomainObjListDeinit; virDomainObjListGetActiveIDs; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 058a8f0..c0335c3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6264,7 +6264,7 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, { struct qemud_driver *driver = dom->conn->privateData; virDomainObjPtr vm; - virDomainDefPtr def; + virDomainDefPtr persistentDef; const char * type; int max; int ret = -1; @@ -6309,6 +6309,12 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, goto endjob; } + if (!vm->persistent && (flags & VIR_DOMAIN_VCPU_CONFIG)) { + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot change persistent config of a transient domain")); + goto endjob; + } + if (!(type = virDomainVirtTypeToString(vm->def->virtType))) { qemuReportError(VIR_ERR_INTERNAL_ERROR, _("unknown virt type in domain definition '%d'"), @@ -6333,36 +6339,19 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, goto endjob; } + if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm))) + goto endjob; + switch (flags) { case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG: - def = vm->def; - if (virDomainObjIsActive(vm)) { - if (vm->newDef) - def = vm->newDef; - else{ - qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("no persistent state")); - goto endjob; - } - } - def->maxvcpus = nvcpus; - if (nvcpus < vm->newDef->vcpus) - def->vcpus = nvcpus; + persistentDef->maxvcpus = nvcpus; + if (nvcpus < persistentDef->vcpus) + persistentDef->vcpus = nvcpus; ret = 0; break; case VIR_DOMAIN_VCPU_CONFIG: - def = vm->def; - if (virDomainObjIsActive(vm)) { - if (vm->newDef) - def = vm->newDef; - else { - qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("no persistent state")); - goto endjob; - } - } - def->vcpus = nvcpus; + persistentDef->vcpus = nvcpus; ret = 0; break; @@ -6372,8 +6361,9 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG: ret = qemudDomainHotplugVcpus(vm, nvcpus); - if (ret == 0 && vm->newDef) - vm->newDef->vcpus = nvcpus; + if (ret == 0) { + persistentDef->vcpus = nvcpus; + } break; } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index d32568f..4f14606 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2095,7 +2095,7 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus, { testConnPtr privconn = domain->conn->privateData; virDomainObjPtr privdom = NULL; - virDomainDefPtr def; + virDomainDefPtr persistentDef; int ret = -1, maxvcpus; virCheckFlags(VIR_DOMAIN_VCPU_LIVE | @@ -2145,36 +2145,20 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus, goto cleanup; } + if (!(persistentDef = virDomainObjGetPersistentDef(privconn->caps, + privdom))) + goto cleanup; + switch (flags) { case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG: - def = privdom->def; - if (virDomainObjIsActive(privdom)) { - if (privdom->newDef) - def = privdom->newDef; - else { - testError(VIR_ERR_OPERATION_INVALID, "%s", - _("no persistent state")); - goto cleanup; - } - } - def->maxvcpus = nrCpus; - if (nrCpus < def->vcpus) - def->vcpus = nrCpus; + persistentDef->maxvcpus = nrCpus; + if (nrCpus < persistentDef->vcpus) + persistentDef->vcpus = nrCpus; ret = 0; break; case VIR_DOMAIN_VCPU_CONFIG: - def = privdom->def; - if (virDomainObjIsActive(privdom)) { - if (privdom->newDef) - def = privdom->newDef; - else { - testError(VIR_ERR_OPERATION_INVALID, "%s", - _("no persistent state")); - goto cleanup; - } - } - def->vcpus = nrCpus; + persistentDef->vcpus = nrCpus; ret = 0; break; @@ -2184,8 +2168,9 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus, case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG: ret = testDomainUpdateVCPUs(domain->conn, privdom, nrCpus, 0); - if (ret == 0 && privdom->newDef) - privdom->newDef->vcpus = nrCpus; + if (ret == 0) { + persistentDef->vcpus = nrCpus; + } break; } -- 1.7.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list