diff options
author | Guido Günther <agx@sigxcpu.org> | 2015-01-24 22:56:35 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2015-01-24 22:56:35 +0100 |
commit | 67f2b22d25cf9ad9cff386a686edc6959c4d1457 (patch) | |
tree | fcfc6517cfed692601880dae8b82e03cc00abb82 /src | |
parent | 7b59a26ddabc57815755a8a80e646ac388d94b0c (diff) |
New upstream version 1.2.12~rc2
Diffstat (limited to 'src')
-rw-r--r-- | src/access/viraccessapicheck.c | 18 | ||||
-rw-r--r-- | src/access/viraccessapicheck.h | 4 | ||||
-rw-r--r-- | src/conf/device_conf.h | 2 | ||||
-rw-r--r-- | src/conf/domain_conf.c | 2 | ||||
-rw-r--r-- | src/esx/esx_vi.c | 3 | ||||
-rw-r--r-- | src/nodeinfo.c | 17 | ||||
-rw-r--r-- | src/nodeinfo.h | 1 | ||||
-rw-r--r-- | src/qemu/qemu_command.c | 279 | ||||
-rw-r--r-- | src/qemu/qemu_command.h | 1 | ||||
-rw-r--r-- | src/qemu/qemu_driver.c | 4 | ||||
-rw-r--r-- | src/remote/remote_protocol.c | 4 | ||||
-rw-r--r-- | src/remote/remote_protocol.x | 2 | ||||
-rw-r--r-- | src/util/vircgroup.c | 24 | ||||
-rw-r--r-- | src/util/virjson.c | 2 | ||||
-rw-r--r-- | src/util/virjson.h | 2 | ||||
-rw-r--r-- | src/virtlockd.8.in | 2 | ||||
-rw-r--r-- | src/xenapi/xenapi_driver.c | 2 |
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; |