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(a)redhat.com>
---
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