summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2015-01-24 22:56:35 +0100
committerGuido Günther <agx@sigxcpu.org>2015-01-24 22:56:35 +0100
commit67f2b22d25cf9ad9cff386a686edc6959c4d1457 (patch)
treefcfc6517cfed692601880dae8b82e03cc00abb82 /src
parent7b59a26ddabc57815755a8a80e646ac388d94b0c (diff)
New upstream version 1.2.12~rc2
Diffstat (limited to 'src')
-rw-r--r--src/access/viraccessapicheck.c18
-rw-r--r--src/access/viraccessapicheck.h4
-rw-r--r--src/conf/device_conf.h2
-rw-r--r--src/conf/domain_conf.c2
-rw-r--r--src/esx/esx_vi.c3
-rw-r--r--src/nodeinfo.c17
-rw-r--r--src/nodeinfo.h1
-rw-r--r--src/qemu/qemu_command.c279
-rw-r--r--src/qemu/qemu_command.h1
-rw-r--r--src/qemu/qemu_driver.c4
-rw-r--r--src/remote/remote_protocol.c4
-rw-r--r--src/remote/remote_protocol.x2
-rw-r--r--src/util/vircgroup.c24
-rw-r--r--src/util/virjson.c2
-rw-r--r--src/util/virjson.h2
-rw-r--r--src/virtlockd.8.in2
-rw-r--r--src/xenapi/xenapi_driver.c2
17 files changed, 231 insertions, 138 deletions
diff --git a/src/access/viraccessapicheck.c b/src/access/viraccessapicheck.c
index 4e8d6e1af..cc6235d85 100644
--- a/src/access/viraccessapicheck.c
+++ b/src/access/viraccessapicheck.c
@@ -4260,7 +4260,7 @@ int virDomainSaveImageDefineXMLEnsureACL(virConnectPtr conn, virDomainDefPtr dom
}
/* Returns: -1 on error/denied, 0 on allowed */
-int virDomainSaveImageGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr domain)
+int virDomainSaveImageGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr domain, unsigned int flags)
{
virAccessManagerPtr mgr;
int rv;
@@ -4275,6 +4275,13 @@ int virDomainSaveImageGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr do
virReportError(VIR_ERR_ACCESS_DENIED, NULL);
return -1;
}
+ if (((flags & (VIR_DOMAIN_XML_SECURE)) == (VIR_DOMAIN_XML_SECURE)) &&
+ (rv = virAccessManagerCheckDomain(mgr, conn->driver->name, domain, VIR_ACCESS_PERM_DOMAIN_READ_SECURE)) <= 0) {
+ virObjectUnref(mgr);
+ if (rv == 0)
+ virReportError(VIR_ERR_ACCESS_DENIED, NULL);
+ return -1;
+ }
virObjectUnref(mgr);
return 0;
}
@@ -4941,7 +4948,7 @@ int virDomainSnapshotGetParentEnsureACL(virConnectPtr conn, virDomainDefPtr doma
}
/* Returns: -1 on error/denied, 0 on allowed */
-int virDomainSnapshotGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr domain)
+int virDomainSnapshotGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr domain, unsigned int flags)
{
virAccessManagerPtr mgr;
int rv;
@@ -4956,6 +4963,13 @@ int virDomainSnapshotGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr dom
virReportError(VIR_ERR_ACCESS_DENIED, NULL);
return -1;
}
+ if (((flags & (VIR_DOMAIN_XML_SECURE)) == (VIR_DOMAIN_XML_SECURE)) &&
+ (rv = virAccessManagerCheckDomain(mgr, conn->driver->name, domain, VIR_ACCESS_PERM_DOMAIN_READ_SECURE)) <= 0) {
+ virObjectUnref(mgr);
+ if (rv == 0)
+ virReportError(VIR_ERR_ACCESS_DENIED, NULL);
+ return -1;
+ }
virObjectUnref(mgr);
return 0;
}
diff --git a/src/access/viraccessapicheck.h b/src/access/viraccessapicheck.h
index 00b48d39d..824cc93ec 100644
--- a/src/access/viraccessapicheck.h
+++ b/src/access/viraccessapicheck.h
@@ -212,7 +212,7 @@ extern int virDomainRevertToSnapshotEnsureACL(virConnectPtr conn, virDomainDefPt
extern int virDomainSaveEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
extern int virDomainSaveFlagsEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
extern int virDomainSaveImageDefineXMLEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
-extern int virDomainSaveImageGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
+extern int virDomainSaveImageGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr domain, unsigned int flags);
extern int virDomainScreenshotEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
extern int virDomainSendKeyEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
extern int virDomainSendProcessSignalEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
@@ -238,7 +238,7 @@ extern int virDomainSnapshotCreateXMLEnsureACL(virConnectPtr conn, virDomainDefP
extern int virDomainSnapshotCurrentEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
extern int virDomainSnapshotDeleteEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
extern int virDomainSnapshotGetParentEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
-extern int virDomainSnapshotGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
+extern int virDomainSnapshotGetXMLDescEnsureACL(virConnectPtr conn, virDomainDefPtr domain, unsigned int flags);
extern int virDomainSnapshotHasMetadataEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
extern int virDomainSnapshotIsCurrentEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
extern int virDomainSnapshotListAllChildrenEnsureACL(virConnectPtr conn, virDomainDefPtr domain);
diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
index f067a3586..7256cdcf5 100644
--- a/src/conf/device_conf.h
+++ b/src/conf/device_conf.h
@@ -52,7 +52,7 @@ struct _virDevicePCIAddress {
unsigned int bus;
unsigned int slot;
unsigned int function;
- int multi; /* enum virDomainDeviceAddressPCIMulti */
+ int multi; /* virTristateSwitch */
};
typedef struct _virInterfaceLink virInterfaceLink;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 8792f5ee7..9ff38195c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -12416,7 +12416,7 @@ virDomainDefMaybeAddController(virDomainDefPtr def,
return -1;
}
- return 0;
+ return 1;
}
diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index a87f2c09a..bbec91247 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -3292,14 +3292,13 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx,
goto cleanup;
}
+ result = 0;
break;
} else {
VIR_WARN("Unexpected '%s' property", dynamicProperty->name);
}
}
- result = 0;
-
cleanup:
esxVI_String_Free(&propertyNameList);
esxVI_ObjectContent_Free(&objectContent);
diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 3c22ebc58..3a27c22ee 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -1242,6 +1242,23 @@ nodeGetCPUCount(void)
}
virBitmapPtr
+nodeGetPresentCPUBitmap(void)
+{
+ int max_present;
+
+ if ((max_present = nodeGetCPUCount()) < 0)
+ return NULL;
+
+#ifdef __linux__
+ if (virFileExists(SYSFS_SYSTEM_PATH "/cpu/present"))
+ return linuxParseCPUmap(max_present, SYSFS_SYSTEM_PATH "/cpu/present");
+#endif
+ virReportError(VIR_ERR_NO_SUPPORT, "%s",
+ _("non-continuous host cpu numbers not implemented on this platform"));
+ return NULL;
+}
+
+virBitmapPtr
nodeGetCPUBitmap(int *max_id ATTRIBUTE_UNUSED)
{
#ifdef __linux__
diff --git a/src/nodeinfo.h b/src/nodeinfo.h
index a993c6367..047bd5ca6 100644
--- a/src/nodeinfo.h
+++ b/src/nodeinfo.h
@@ -43,6 +43,7 @@ int nodeGetCellsFreeMemory(unsigned long long *freeMems,
int nodeGetMemory(unsigned long long *mem,
unsigned long long *freeMem);
+virBitmapPtr nodeGetPresentCPUBitmap(void);
virBitmapPtr nodeGetCPUBitmap(int *max_id);
int nodeGetCPUCount(void);
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index c041ee77b..731400603 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1158,7 +1158,8 @@ qemuDomainAssignARMVirtioMMIOAddresses(virDomainDefPtr def,
if (((def->os.arch == VIR_ARCH_ARMV7L) ||
(def->os.arch == VIR_ARCH_AARCH64)) &&
(STRPREFIX(def->os.machine, "vexpress-") ||
- STREQ(def->os.machine, "virt")) &&
+ STREQ(def->os.machine, "virt") ||
+ STRPREFIX(def->os.machine, "virt-")) &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO)) {
qemuDomainPrimeVirtioDeviceAddresses(
def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO);
@@ -1458,102 +1459,6 @@ qemuDomainPCIBusFullyReserved(virDomainPCIAddressBusPtr bus)
return true;
}
-int
-qemuDomainAssignPCIAddresses(virDomainDefPtr def,
- virQEMUCapsPtr qemuCaps,
- virDomainObjPtr obj)
-{
- int ret = -1;
- virDomainPCIAddressSetPtr addrs = NULL;
- qemuDomainObjPrivatePtr priv = NULL;
-
- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
- int max_idx = -1;
- int nbuses = 0;
- size_t i;
- int rv;
- virDomainPCIConnectFlags flags = VIR_PCI_CONNECT_TYPE_PCI;
-
- for (i = 0; i < def->ncontrollers; i++) {
- if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
- if ((int) def->controllers[i]->idx > max_idx)
- max_idx = def->controllers[i]->idx;
- }
- }
-
- nbuses = max_idx + 1;
-
- if (nbuses > 0 &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) {
- virDomainDeviceInfo info;
-
- /* 1st pass to figure out how many PCI bridges we need */
- if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true)))
- goto cleanup;
- if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
- goto cleanup;
-
- for (i = 0; i < addrs->nbuses; i++) {
- if (!qemuDomainPCIBusFullyReserved(&addrs->buses[i])) {
-
- /* Reserve 1 extra slot for a (potential) bridge */
- if (virDomainPCIAddressReserveNextSlot(addrs, &info, flags) < 0)
- goto cleanup;
- }
- }
-
- for (i = 1; i < addrs->nbuses; i++) {
- virDomainPCIAddressBusPtr bus = &addrs->buses[i];
-
- if ((rv = virDomainDefMaybeAddController(
- def, VIR_DOMAIN_CONTROLLER_TYPE_PCI,
- i, bus->model)) < 0)
- goto cleanup;
- /* If we added a new bridge, we will need one more address */
- if (rv == 0 &&
- virDomainPCIAddressReserveNextSlot(addrs, &info, flags) < 0)
- goto cleanup;
- }
- nbuses = addrs->nbuses;
- virDomainPCIAddressSetFree(addrs);
- addrs = NULL;
-
- } else if (max_idx > 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("PCI bridges are not supported "
- "by this QEMU binary"));
- goto cleanup;
- }
-
- if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false)))
- goto cleanup;
-
- if (qemuDomainSupportsPCI(def)) {
- if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
- goto cleanup;
- }
- }
-
- if (obj && obj->privateData) {
- priv = obj->privateData;
- if (addrs) {
- /* if this is the live domain object, we persist the PCI addresses*/
- virDomainPCIAddressSetFree(priv->pciaddrs);
- priv->persistentAddrs = 1;
- priv->pciaddrs = addrs;
- addrs = NULL;
- } else {
- priv->persistentAddrs = 0;
- }
- }
-
- ret = 0;
-
- cleanup:
- virDomainPCIAddressSetFree(addrs);
-
- return ret;
-}
int qemuDomainAssignAddresses(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
@@ -1970,6 +1875,156 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
return ret;
}
+static int
+qemuValidateDevicePCISlotsChipsets(virDomainDefPtr def,
+ virQEMUCapsPtr qemuCaps,
+ virDomainPCIAddressSetPtr addrs)
+{
+ if ((STRPREFIX(def->os.machine, "pc-0.") ||
+ STRPREFIX(def->os.machine, "pc-1.") ||
+ STRPREFIX(def->os.machine, "pc-i440") ||
+ STREQ(def->os.machine, "pc") ||
+ STRPREFIX(def->os.machine, "rhel")) &&
+ qemuValidateDevicePCISlotsPIIX3(def, qemuCaps, addrs) < 0) {
+ return -1;
+ }
+
+ if (qemuDomainMachineIsQ35(def) &&
+ qemuDomainValidateDevicePCISlotsQ35(def, qemuCaps, addrs) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+qemuDomainAssignPCIAddresses(virDomainDefPtr def,
+ virQEMUCapsPtr qemuCaps,
+ virDomainObjPtr obj)
+{
+ int ret = -1;
+ virDomainPCIAddressSetPtr addrs = NULL;
+ qemuDomainObjPrivatePtr priv = NULL;
+
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
+ int max_idx = -1;
+ int nbuses = 0;
+ size_t i;
+ int rv;
+ bool buses_reserved = true;
+
+ virDomainPCIConnectFlags flags = VIR_PCI_CONNECT_TYPE_PCI;
+
+ for (i = 0; i < def->ncontrollers; i++) {
+ if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
+ if ((int) def->controllers[i]->idx > max_idx)
+ max_idx = def->controllers[i]->idx;
+ }
+ }
+
+ nbuses = max_idx + 1;
+
+ if (nbuses > 0 &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) {
+ virDomainDeviceInfo info;
+
+ /* 1st pass to figure out how many PCI bridges we need */
+ if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true)))
+ goto cleanup;
+
+ if (qemuValidateDevicePCISlotsChipsets(def, qemuCaps, addrs) < 0)
+ goto cleanup;
+
+ for (i = 0; i < addrs->nbuses; i++) {
+ if (!qemuDomainPCIBusFullyReserved(&addrs->buses[i]))
+ buses_reserved = false;
+ }
+
+ /* Reserve 1 extra slot for a (potential) bridge only if buses
+ * are not fully reserved yet
+ */
+ if (!buses_reserved &&
+ virDomainPCIAddressReserveNextSlot(addrs, &info, flags) < 0)
+ goto cleanup;
+
+ if (qemuAssignDevicePCISlots(def, addrs) < 0)
+ goto cleanup;
+
+ for (i = 1; i < addrs->nbuses; i++) {
+ virDomainPCIAddressBusPtr bus = &addrs->buses[i];
+
+ if ((rv = virDomainDefMaybeAddController(
+ def, VIR_DOMAIN_CONTROLLER_TYPE_PCI,
+ i, bus->model)) < 0)
+ goto cleanup;
+ /* If we added a new bridge, we will need one more address */
+ if (rv > 0 &&
+ virDomainPCIAddressReserveNextSlot(addrs, &info, flags) < 0)
+ goto cleanup;
+ }
+ nbuses = addrs->nbuses;
+ virDomainPCIAddressSetFree(addrs);
+ addrs = NULL;
+
+ } else if (max_idx > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("PCI bridges are not supported "
+ "by this QEMU binary"));
+ goto cleanup;
+ }
+
+ if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false)))
+ goto cleanup;
+
+ if (qemuDomainSupportsPCI(def)) {
+ if (qemuValidateDevicePCISlotsChipsets(def, qemuCaps, addrs) < 0)
+ goto cleanup;
+
+ if (qemuAssignDevicePCISlots(def, addrs) < 0)
+ goto cleanup;
+
+ for (i = 0; i < def->ncontrollers; i++) {
+ /* check if every PCI bridge controller's ID is greater than
+ * the bus it is placed onto
+ */
+ virDomainControllerDefPtr cont = def->controllers[i];
+ int idx = cont->idx;
+ int bus = cont->info.addr.pci.bus;
+ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
+ cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE &&
+ idx <= bus) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("failed to create PCI bridge "
+ "on bus %d: too many devices with fixed "
+ "addresses"),
+ bus);
+ goto cleanup;
+ }
+ }
+ }
+ }
+
+ if (obj && obj->privateData) {
+ priv = obj->privateData;
+ if (addrs) {
+ /* if this is the live domain object, we persist the PCI addresses*/
+ virDomainPCIAddressSetFree(priv->pciaddrs);
+ priv->persistentAddrs = 1;
+ priv->pciaddrs = addrs;
+ addrs = NULL;
+ } else {
+ priv->persistentAddrs = 0;
+ }
+ }
+
+ ret = 0;
+
+ cleanup:
+ virDomainPCIAddressSetFree(addrs);
+
+ return ret;
+}
+
/*
* This assigns static PCI slots to all configured devices.
@@ -1988,6 +2043,9 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
* - PIIX3 ISA bridge, IDE controller, something else unknown, USB controller (slot 1)
* - Video (slot 2)
*
+ * - These integrated devices were already added by
+ * qemuValidateDevicePCISlotsChipsets invoked right before this function
+ *
* Incrementally assign slots from 3 onwards:
*
* - Net
@@ -2005,27 +2063,12 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
*/
int
qemuAssignDevicePCISlots(virDomainDefPtr def,
- virQEMUCapsPtr qemuCaps,
virDomainPCIAddressSetPtr addrs)
{
size_t i, j;
virDomainPCIConnectFlags flags;
virDevicePCIAddress tmp_addr;
- if ((STRPREFIX(def->os.machine, "pc-0.") ||
- STRPREFIX(def->os.machine, "pc-1.") ||
- STRPREFIX(def->os.machine, "pc-i440") ||
- STREQ(def->os.machine, "pc") ||
- STRPREFIX(def->os.machine, "rhel")) &&
- qemuValidateDevicePCISlotsPIIX3(def, qemuCaps, addrs) < 0) {
- goto error;
- }
-
- if (qemuDomainMachineIsQ35(def) &&
- qemuDomainValidateDevicePCISlotsQ35(def, qemuCaps, addrs) < 0) {
- goto error;
- }
-
/* PCI controllers */
for (i = 0; i < def->ncontrollers; i++) {
if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
@@ -4576,7 +4619,8 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
case VIR_DOMAIN_NET_TYPE_SERVER:
virBufferAsprintf(&buf, "socket%clisten=%s:%d",
type_sep,
- net->data.socket.address,
+ net->data.socket.address ? net->data.socket.address
+ : "",
net->data.socket.port);
type_sep = ',';
break;
@@ -6636,7 +6680,7 @@ qemuBuildSmpArgStr(const virDomainDef *def,
static int
qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
- const virDomainDef *def,
+ virDomainDefPtr def,
virCommandPtr cmd,
virQEMUCapsPtr qemuCaps,
virBitmapPtr nodeset)
@@ -10067,13 +10111,18 @@ qemuBuildConsoleChrDeviceStr(char **deviceStr,
break;
case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL:
+ break;
+
case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE:
case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN:
case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_UML:
case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC:
case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_OPENVZ:
case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST:
- break;
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unsupported console target type %s"),
+ NULLSTR(virDomainChrConsoleTargetTypeToString(chr->targetType)));
+ goto cleanup;
}
ret = 0;
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index dcc712732..93492bf61 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -249,7 +249,6 @@ virDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def,
bool dryRun);
int qemuAssignDevicePCISlots(virDomainDefPtr def,
- virQEMUCapsPtr qemuCaps,
virDomainPCIAddressSetPtr addrs);
int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 59945583c..bc6aae40e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6031,7 +6031,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *path,
if (fd < 0)
goto cleanup;
- if (virDomainSaveImageGetXMLDescEnsureACL(conn, def) < 0)
+ if (virDomainSaveImageGetXMLDescEnsureACL(conn, def, flags) < 0)
goto cleanup;
ret = qemuDomainDefFormatXML(driver, def, flags);
@@ -14406,7 +14406,7 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
if (!(vm = qemuDomObjFromSnapshot(snapshot)))
return NULL;
- if (virDomainSnapshotGetXMLDescEnsureACL(snapshot->domain->conn, vm->def) < 0)
+ if (virDomainSnapshotGetXMLDescEnsureACL(snapshot->domain->conn, vm->def, flags) < 0)
goto cleanup;
if (!(snap = qemuSnapObjFromSnapshot(vm, snapshot)))
diff --git a/src/remote/remote_protocol.c b/src/remote/remote_protocol.c
index fe2b8dcc5..81a9b0917 100644
--- a/src/remote/remote_protocol.c
+++ b/src/remote/remote_protocol.c
@@ -2084,8 +2084,8 @@ xdr_remote_domain_get_vcpus_args (XDR *xdrs, remote_domain_get_vcpus_args *objp)
bool_t
xdr_remote_domain_get_vcpus_ret (XDR *xdrs, remote_domain_get_vcpus_ret *objp)
{
- char **objp_cpp0 = (char **) (void *) &objp->info.info_val;
char **objp_cpp1 = (char **) (void *) &objp->cpumaps.cpumaps_val;
+ char **objp_cpp0 = (char **) (void *) &objp->info.info_val;
if (!xdr_array (xdrs, objp_cpp0, (u_int *) &objp->info.info_len, REMOTE_VCPUINFO_MAX,
sizeof (remote_vcpu_info), (xdrproc_t) xdr_remote_vcpu_info))
@@ -6107,8 +6107,8 @@ xdr_remote_domain_migrate_begin3_params_ret (XDR *xdrs, remote_domain_migrate_be
bool_t
xdr_remote_domain_migrate_prepare3_params_args (XDR *xdrs, remote_domain_migrate_prepare3_params_args *objp)
{
- char **objp_cpp0 = (char **) (void *) &objp->params.params_val;
char **objp_cpp1 = (char **) (void *) &objp->cookie_in.cookie_in_val;
+ char **objp_cpp0 = (char **) (void *) &objp->params.params_val;
if (!xdr_array (xdrs, objp_cpp0, (u_int *) &objp->params.params_len, REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX,
sizeof (remote_typed_param), (xdrproc_t) xdr_remote_typed_param))
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index d91fbe0ee..c8162a504 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -4489,6 +4489,7 @@ enum remote_procedure {
* @generate: both
* @priority: high
* @acl: domain:read
+ * @acl: domain:read_secure:VIR_DOMAIN_XML_SECURE
*/
REMOTE_PROC_DOMAIN_SNAPSHOT_GET_XML_DESC = 186,
@@ -4819,6 +4820,7 @@ enum remote_procedure {
* @generate: both
* @priority: high
* @acl: domain:read
+ * @acl: domain:read_secure:VIR_DOMAIN_XML_SECURE
*/
REMOTE_PROC_DOMAIN_SAVE_IMAGE_GET_XML_DESC = 235,
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index fe34290ac..e65617a8a 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -2985,7 +2985,8 @@ static int
virCgroupGetPercpuVcpuSum(virCgroupPtr group,
unsigned int nvcpupids,
unsigned long long *sum_cpu_time,
- unsigned int num)
+ size_t nsum,
+ virBitmapPtr cpumap)
{
int ret = -1;
size_t i;
@@ -2995,7 +2996,7 @@ virCgroupGetPercpuVcpuSum(virCgroupPtr group,
for (i = 0; i < nvcpupids; i++) {
char *pos;
unsigned long long tmp;
- size_t j;
+ ssize_t j;
if (virCgroupNewVcpu(group, i, false, &group_vcpu) < 0)
goto cleanup;
@@ -3004,7 +3005,9 @@ virCgroupGetPercpuVcpuSum(virCgroupPtr group,
goto cleanup;
pos = buf;
- for (j = 0; j < num; j++) {
+ for (j = virBitmapNextSetBit(cpumap, -1);
+ j >= 0 && j < nsum;
+ j = virBitmapNextSetBit(cpumap, j)) {
if (virStrToLong_ull(pos, &pos, 10, &tmp) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cpuacct parse error"));
@@ -3042,6 +3045,7 @@ virCgroupGetPercpuStats(virCgroupPtr group,
virTypedParameterPtr ent;
int param_idx;
unsigned long long cpu_time;
+ virBitmapPtr cpumap = NULL;
/* return the number of supported params */
if (nparams == 0 && ncpus != 0) {
@@ -3052,9 +3056,11 @@ virCgroupGetPercpuStats(virCgroupPtr group,
}
/* To parse account file, we need to know how many cpus are present. */
- if ((total_cpus = nodeGetCPUCount()) < 0)
+ if (!(cpumap = nodeGetPresentCPUBitmap()))
return rv;
+ total_cpus = virBitmapSize(cpumap);
+
if (ncpus == 0)
return total_cpus;
@@ -3077,7 +3083,11 @@ virCgroupGetPercpuStats(virCgroupPtr group,
need_cpus = MIN(total_cpus, start_cpu + ncpus);
for (i = 0; i < need_cpus; i++) {
- if (virStrToLong_ull(pos, &pos, 10, &cpu_time) < 0) {
+ bool present;
+ ignore_value(virBitmapGetBit(cpumap, i, &present));
+ if (!present) {
+ cpu_time = 0;
+ } else if (virStrToLong_ull(pos, &pos, 10, &cpu_time) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cpuacct parse error"));
goto cleanup;
@@ -3097,7 +3107,8 @@ virCgroupGetPercpuStats(virCgroupPtr group,
if (VIR_ALLOC_N(sum_cpu_time, need_cpus) < 0)
goto cleanup;
- if (virCgroupGetPercpuVcpuSum(group, nvcpupids, sum_cpu_time, need_cpus) < 0)
+ if (virCgroupGetPercpuVcpuSum(group, nvcpupids, sum_cpu_time, need_cpus,
+ cpumap) < 0)
goto cleanup;
for (i = start_cpu; i < need_cpus; i++) {
@@ -3113,6 +3124,7 @@ virCgroupGetPercpuStats(virCgroupPtr group,
rv = param_idx + 1;
cleanup:
+ virBitmapFree(cpumap);
VIR_FREE(sum_cpu_time);
VIR_FREE(buf);
return rv;
diff --git a/src/util/virjson.c b/src/util/virjson.c
index 3ffa19f7d..9f2e1cfce 100644
--- a/src/util/virjson.c
+++ b/src/util/virjson.c
@@ -797,7 +797,7 @@ virJSONValueIsArray(virJSONValuePtr array)
int
-virJSONValueArraySize(virJSONValuePtr array)
+virJSONValueArraySize(const virJSONValue *array)
{
if (array->type != VIR_JSON_TYPE_ARRAY)
return -1;
diff --git a/src/util/virjson.h b/src/util/virjson.h
index 1996a9110..c0aefba1d 100644
--- a/src/util/virjson.h
+++ b/src/util/virjson.h
@@ -105,7 +105,7 @@ int virJSONValueObjectHasKey(virJSONValuePtr object, const char *key);
virJSONValuePtr virJSONValueObjectGet(virJSONValuePtr object, const char *key);
bool virJSONValueIsArray(virJSONValuePtr array);
-int virJSONValueArraySize(virJSONValuePtr object);
+int virJSONValueArraySize(const virJSONValue *array);
virJSONValuePtr virJSONValueArrayGet(virJSONValuePtr object, unsigned int element);
virJSONValuePtr virJSONValueArraySteal(virJSONValuePtr object, unsigned int element);
diff --git a/src/virtlockd.8.in b/src/virtlockd.8.in
index 500e511cb..6bb60ee53 100644
--- a/src/virtlockd.8.in
+++ b/src/virtlockd.8.in
@@ -133,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "VIRTLOCKD 8"
-.TH VIRTLOCKD 8 "2013-08-28" "libvirt-1.2.12" "Virtualization Support"
+.TH VIRTLOCKD 8 "2015-01-23" "libvirt-1.2.12" "Virtualization Support"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
index c5118ec36..cef53eccb 100644
--- a/src/xenapi/xenapi_driver.c
+++ b/src/xenapi/xenapi_driver.c
@@ -1504,7 +1504,7 @@ xenapiDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
defPtr->onReboot = xenapiNormalExitEnum2virDomainLifecycle(action);
enum xen_on_crash_behaviour crash;
if (xen_vm_get_actions_after_crash(session, &crash, vm))
- defPtr->onCrash = xenapiCrashExitEnum2virDomainLifecycle(action);
+ defPtr->onCrash = xenapiCrashExitEnum2virDomainLifecycle(crash);
xen_vm_get_platform(session, &result, vm);
if (result != NULL) {
size_t i;