To support further refactors replace all write access to def->maxvcpus
with a accessor function.
---
src/conf/domain_conf.c | 18 ++++++++++++++++--
src/conf/domain_conf.h | 2 ++
src/hyperv/hyperv_driver.c | 5 ++++-
src/libvirt_private.syms | 1 +
src/libxl/libxl_driver.c | 8 ++++++--
src/lxc/lxc_native.c | 4 +++-
src/openvz/openvz_conf.c | 4 +++-
src/openvz/openvz_driver.c | 5 ++++-
src/phyp/phyp_driver.c | 4 +++-
src/qemu/qemu_command.c | 9 +++++++--
src/qemu/qemu_driver.c | 4 +++-
src/test/test_driver.c | 4 +++-
src/vbox/vbox_common.c | 11 +++++++++--
src/vmx/vmx.c | 5 ++++-
src/vz/vz_sdk.c | 4 +++-
src/xen/xm_internal.c | 4 +++-
src/xenapi/xenapi_driver.c | 4 +++-
src/xenconfig/xen_common.c | 4 +++-
src/xenconfig/xen_sxpr.c | 3 ++-
19 files changed, 82 insertions(+), 21 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7ec6954..02b5e6d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1430,6 +1430,16 @@ void virDomainLeaseDefFree(virDomainLeaseDefPtr def)
}
+int
+virDomainDefSetVcpusMax(virDomainDefPtr def,
+ unsigned int maxvcpus)
+{
+ def->maxvcpus = maxvcpus;
+
+ return 0;
+}
+
+
virDomainDiskDefPtr
virDomainDiskDefNew(virDomainXMLOptionPtr xmlopt)
{
@@ -14691,18 +14701,22 @@ virDomainVcpuParse(virDomainDefPtr def,
{
int n;
char *tmp = NULL;
+ unsigned int maxvcpus;
int ret = -1;
- if ((n = virXPathUInt("string(./vcpu[1])", ctxt, &def->maxvcpus))
< 0) {
+ if ((n = virXPathUInt("string(./vcpu[1])", ctxt, &maxvcpus)) < 0) {
if (n == -2) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("maximum vcpus count must be an integer"));
goto cleanup;
}
- def->maxvcpus = 1;
+ maxvcpus = 1;
}
+ if (virDomainDefSetVcpusMax(def, maxvcpus) < 0)
+ goto cleanup;
+
if ((n = virXPathUInt("string(./vcpu[1]/@current)", ctxt,
&def->vcpus)) < 0) {
if (n == -2) {
virReportError(VIR_ERR_XML_ERROR, "%s",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 038d65b..f65026b 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2337,6 +2337,8 @@ struct _virDomainDef {
xmlNodePtr metadata;
};
+int virDomainDefSetVcpusMax(virDomainDefPtr def, unsigned int vcpus);
+
unsigned long long virDomainDefGetMemoryInitial(const virDomainDef *def);
void virDomainDefSetMemoryTotal(virDomainDefPtr def, unsigned long long size);
void virDomainDefSetMemoryInitial(virDomainDefPtr def, unsigned long long size);
diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
index 72261df..1e8db03 100644
--- a/src/hyperv/hyperv_driver.c
+++ b/src/hyperv/hyperv_driver.c
@@ -873,8 +873,11 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
virDomainDefSetMemoryTotal(def, memorySettingData->data->Limit * 1024); /*
megabyte to kilobyte */
def->mem.cur_balloon = memorySettingData->data->VirtualQuantity * 1024; /*
megabyte to kilobyte */
+ if (virDomainDefSetVcpusMax(def,
+ processorSettingData->data->VirtualQuantity) <
0)
+ goto cleanup;
+
def->vcpus = processorSettingData->data->VirtualQuantity;
- def->maxvcpus = processorSettingData->data->VirtualQuantity;
def->os.type = VIR_DOMAIN_OSTYPE_HVM;
/* FIXME: devices section is totally missing */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 42528a4..b1bced7 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -230,6 +230,7 @@ virDomainDefParseString;
virDomainDefPostParse;
virDomainDefSetMemoryInitial;
virDomainDefSetMemoryTotal;
+virDomainDefSetVcpusMax;
virDomainDeleteConfig;
virDomainDeviceAddressIsValid;
virDomainDeviceAddressTypeToString;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 35d7fae..dbc2b78 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -552,8 +552,10 @@ libxlAddDom0(libxlDriverPrivatePtr driver)
def = NULL;
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED);
+ if (virDomainDefSetVcpusMax(vm->def, d_info.vcpu_max_id + 1))
+ goto cleanup;
+
vm->def->vcpus = d_info.vcpu_online;
- vm->def->maxvcpus = d_info.vcpu_max_id + 1;
vm->def->mem.cur_balloon = d_info.current_memkb;
virDomainDefSetMemoryTotal(vm->def, d_info.max_memkb);
@@ -2184,7 +2186,9 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
switch (flags) {
case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG:
- def->maxvcpus = nvcpus;
+ if (virDomainDefSetVcpusMax(def, nvcpus) < 0)
+ goto cleanup;
+
if (nvcpus < def->vcpus)
def->vcpus = nvcpus;
break;
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 2f95597..1c65475 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -1019,7 +1019,9 @@ lxcParseConfigString(const char *config)
/* Value not handled by the LXC driver, setting to
* minimum required to make XML parsing pass */
- vmdef->maxvcpus = 1;
+ if (virDomainDefSetVcpusMax(vmdef, 1) < 0)
+ goto error;
+
vmdef->vcpus = 1;
vmdef->nfss = 0;
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index c0f65c9..6629105 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -582,7 +582,9 @@ int openvzLoadDomains(struct openvz_driver *driver)
if (ret == 0 || vcpus == 0)
vcpus = openvzGetNodeCPUs();
- def->maxvcpus = vcpus;
+ if (virDomainDefSetVcpusMax(def, vcpus) < 0)
+ goto cleanup;
+
def->vcpus = vcpus;
/* XXX load rest of VM config data .... */
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index b8c0f50..307b607 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -1368,7 +1368,10 @@ static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
if (virRun(prog, NULL) < 0)
return -1;
- vm->def->maxvcpus = vm->def->vcpus = nvcpus;
+ if (virDomainDefSetVcpusMax(vm->def, nvcpus) < 0)
+ return -1;
+
+ vm->def->vcpus = nvcpus;
return 0;
}
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
index 14264c0..b60e5ba 100644
--- a/src/phyp/phyp_driver.c
+++ b/src/phyp/phyp_driver.c
@@ -3295,7 +3295,9 @@ phypDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
goto err;
}
- def.maxvcpus = vcpus;
+ if (virDomainDefSetVcpusMax(&def, vcpus) < 0)
+ goto err;
+
def.vcpus = vcpus;
return virDomainDefFormat(&def,
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a0947b2..30d7bdb 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -12640,7 +12640,11 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
}
}
- dom->maxvcpus = maxcpus ? maxcpus : dom->vcpus;
+ if (maxcpus == 0)
+ maxcpus = dom->vcpus;
+
+ if (virDomainDefSetVcpusMax(dom, maxcpus) < 0)
+ goto error;
if (sockets && cores && threads) {
virCPUDefPtr cpu;
@@ -12754,7 +12758,8 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
def->id = -1;
def->mem.cur_balloon = 64 * 1024;
virDomainDefSetMemoryTotal(def, def->mem.cur_balloon);
- def->maxvcpus = 1;
+ if (virDomainDefSetVcpusMax(def, 1) < 0)
+ goto error;
def->vcpus = 1;
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ae1d8e7..5dc7243 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4979,7 +4979,9 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
}
if (flags & VIR_DOMAIN_VCPU_MAXIMUM) {
- persistentDef->maxvcpus = nvcpus;
+ if (virDomainDefSetVcpusMax(persistentDef, nvcpus) < 0)
+ goto endjob;
+
if (nvcpus < persistentDef->vcpus)
persistentDef->vcpus = nvcpus;
} else {
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 9ccd567..6bf41d7 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -2376,7 +2376,9 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
if (persistentDef) {
if (flags & VIR_DOMAIN_VCPU_MAXIMUM) {
- persistentDef->maxvcpus = nrCpus;
+ if (virDomainDefSetVcpusMax(persistentDef, nrCpus) < 0)
+ goto cleanup;
+
if (nrCpus < persistentDef->vcpus)
persistentDef->vcpus = nrCpus;
} else {
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 3e6ed7a..1a0cc63 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -3901,7 +3901,10 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int
flags)
virDomainDefSetMemoryTotal(def, memorySize * 1024);
gVBoxAPI.UIMachine.GetCPUCount(machine, &CPUCount);
- def->maxvcpus = def->vcpus = CPUCount;
+ if (virDomainDefSetVcpusMax(def, CPUCount) < 0)
+ goto cleanup;
+
+ def->vcpus = CPUCount;
/* Skip cpumasklen, cpumask, onReboot, onPoweroff, onCrash */
@@ -6055,7 +6058,11 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr
snapshot,
def->dom->os.type = VIR_DOMAIN_OSTYPE_HVM;
def->dom->os.arch = virArchFromHost();
gVBoxAPI.UIMachine.GetCPUCount(machine, &CPUCount);
- def->dom->maxvcpus = def->dom->vcpus = CPUCount;
+ if (virDomainDefSetVcpusMax(def->dom, CPUCount) < 0)
+ goto cleanup;
+
+ def->dom->vcpus = CPUCount;
+
if (vboxSnapshotGetReadWriteDisks(def, snapshot) < 0)
VIR_DEBUG("Could not get read write disks for snapshot");
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index 7c3c10a..fe9d407 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -1457,7 +1457,10 @@ virVMXParseConfig(virVMXContext *ctx,
goto cleanup;
}
- def->maxvcpus = def->vcpus = numvcpus;
+ if (virDomainDefSetVcpusMax(def, numvcpus) < 0)
+ goto cleanup;
+
+ def->vcpus = numvcpus;
/* vmx:sched.cpu.affinity -> def:cpumask */
/* NOTE: maps to VirtualMachine:config.cpuAffinity.affinitySet */
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 750133d..eb0d2e8 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1150,8 +1150,10 @@ prlsdkConvertCpuInfo(PRL_HANDLE sdkdom,
if (cpuCount > hostcpus)
cpuCount = hostcpus;
+ if (virDomainDefSetVcpusMax(def, cpuCount) < 0)
+ goto cleanup;
+
def->vcpus = cpuCount;
- def->maxvcpus = cpuCount;
pret = PrlVmCfg_GetCpuMask(sdkdom, NULL, &buflen);
prlsdkCheckRetGoto(pret, cleanup);
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
index 75f98b1..d465576 100644
--- a/src/xen/xm_internal.c
+++ b/src/xen/xm_internal.c
@@ -704,7 +704,9 @@ xenXMDomainSetVcpusFlags(virConnectPtr conn,
}
if (flags & VIR_DOMAIN_VCPU_MAXIMUM) {
- entry->def->maxvcpus = vcpus;
+ if (virDomainDefSetVcpusMax(entry->def, vcpus) < 0)
+ goto cleanup;
+
if (entry->def->vcpus > vcpus)
entry->def->vcpus = vcpus;
} else {
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
index e503974..fa66bb1 100644
--- a/src/xenapi/xenapi_driver.c
+++ b/src/xenapi/xenapi_driver.c
@@ -1502,7 +1502,9 @@ xenapiDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
vcpus = xenapiDomainGetMaxVcpus(dom);
- defPtr->maxvcpus = vcpus;
+ if (virDomainDefSetVcpusMax(defPtr, vcpus) < 0)
+ goto error;
+
defPtr->vcpus = vcpus;
enum xen_on_normal_exit action;
diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c
index 0890c73..eba5be2 100644
--- a/src/xenconfig/xen_common.c
+++ b/src/xenconfig/xen_common.c
@@ -502,7 +502,9 @@ xenParseCPUFeatures(virConfPtr conf, virDomainDefPtr def)
MAX_VIRT_CPUS < count)
return -1;
- def->maxvcpus = count;
+ if (virDomainDefSetVcpusMax(def, count) < 0)
+ return -1;
+
if (xenConfigGetULong(conf, "vcpu_avail", &count, -1) < 0)
return -1;
diff --git a/src/xenconfig/xen_sxpr.c b/src/xenconfig/xen_sxpr.c
index 7fc9c9d..76c4051 100644
--- a/src/xenconfig/xen_sxpr.c
+++ b/src/xenconfig/xen_sxpr.c
@@ -1173,7 +1173,8 @@ xenParseSxpr(const struct sexpr *root,
}
}
- def->maxvcpus = sexpr_int(root, "domain/vcpus");
+ if (virDomainDefSetVcpusMax(def, sexpr_int(root, "domain/vcpus")) < 0)
+ goto error;
def->vcpus = count_one_bits_l(sexpr_u64(root, "domain/vcpu_avail"));
if (!def->vcpus || def->maxvcpus < def->vcpus)
def->vcpus = def->maxvcpus;
--
2.6.2