forked from pool/libvirt
9decd8f3cc
- qemu: Fix cgroup handling when setting VCPU BW - daemon: fix leak after listing all volumes - Fix iohelper usage with streams opened for read - util: fix virFileOpenAs return value and resulting error logs - iscsi: don't leak portal string when starting a pool - don't mention disk controllers in generic controller errors - conf: don't crash on a tpm device with no backends - qemu: allocate network connections sooner during domain startup - Make detect_scsi_host_caps a function on all architectures - Fix release of resources with lockd plugin - Fix potential use of undefined variable in remote dispatch code - Fix F_DUPFD_CLOEXEC operation args - qemu: fix stupid typos in VFIO cgroup setup/teardown - network: fix network driver startup for qemu:///session - Remove patches that are included in the 1.0.5.1 release 0471637d-cgroups-vcpu-bw.patch, a2214c52-iohelper.patch, ca697e90-CVE-2013-1962.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=266
103 lines
3.5 KiB
Diff
103 lines
3.5 KiB
Diff
commit bbe97ae968eba60b71e0066d49f9fc909966d9d6
|
|
Author: Jim Fehlig <jfehlig@suse.com>
|
|
Date: Fri May 10 12:05:00 2013 -0600
|
|
|
|
Fix starting domains when kernel has no cgroups support
|
|
|
|
Found that I was unable to start existing domains after updating
|
|
to a kernel with no cgroups support
|
|
|
|
# zgrep CGROUP /proc/config.gz
|
|
# CONFIG_CGROUPS is not set
|
|
# virsh start test
|
|
error: Failed to start domain test
|
|
error: Unable to initialize /machine cgroup: Cannot allocate memory
|
|
|
|
virCgroupPartitionNeedsEscaping() correctly returns errno (ENOENT) when
|
|
attempting to open /proc/cgroups on such a system, but it was being
|
|
dropped in virCgroupSetPartitionSuffix().
|
|
|
|
Change virCgroupSetPartitionSuffix() to propagate errors returned by
|
|
its callees. Also check for ENOENT in qemuInitCgroup() when determining
|
|
if cgroups support is available.
|
|
|
|
Index: libvirt-1.0.5.1/src/qemu/qemu_cgroup.c
|
|
===================================================================
|
|
--- libvirt-1.0.5.1.orig/src/qemu/qemu_cgroup.c
|
|
+++ libvirt-1.0.5.1/src/qemu/qemu_cgroup.c
|
|
@@ -415,7 +415,8 @@ int qemuInitCgroup(virQEMUDriverPtr driv
|
|
if (rc != 0) {
|
|
if (rc == -ENXIO ||
|
|
rc == -EPERM ||
|
|
- rc == -EACCES) { /* No cgroups mounts == success */
|
|
+ rc == -EACCES ||
|
|
+ rc == -ENOENT) { /* No cgroups mounts == success */
|
|
VIR_DEBUG("No cgroups present/configured/accessible, ignoring error");
|
|
goto done;
|
|
}
|
|
Index: libvirt-1.0.5.1/src/util/vircgroup.c
|
|
===================================================================
|
|
--- libvirt-1.0.5.1.orig/src/util/vircgroup.c
|
|
+++ libvirt-1.0.5.1/src/util/vircgroup.c
|
|
@@ -1168,14 +1168,14 @@ static int virCgroupPartitionEscape(char
|
|
return 0;
|
|
}
|
|
|
|
-static char *virCgroupSetPartitionSuffix(const char *path)
|
|
+static int virCgroupSetPartitionSuffix(const char *path, char **res)
|
|
{
|
|
char **tokens = virStringSplit(path, "/", 0);
|
|
size_t i;
|
|
- char *ret = NULL;
|
|
+ int ret = -1;
|
|
|
|
if (!tokens)
|
|
- return NULL;
|
|
+ return ret;
|
|
|
|
for (i = 0 ; tokens[i] != NULL ; i++) {
|
|
/* Whitelist the 3 top level fixed dirs
|
|
@@ -1194,20 +1194,27 @@ static char *virCgroupSetPartitionSuffix
|
|
!strchr(tokens[i], '.')) {
|
|
if (VIR_REALLOC_N(tokens[i],
|
|
strlen(tokens[i]) + strlen(".partition") + 1) < 0) {
|
|
+ ret = -ENOMEM;
|
|
virReportOOMError();
|
|
goto cleanup;
|
|
}
|
|
strcat(tokens[i], ".partition");
|
|
}
|
|
|
|
- if (virCgroupPartitionEscape(&(tokens[i])) < 0) {
|
|
- virReportOOMError();
|
|
+ ret = virCgroupPartitionEscape(&(tokens[i]));
|
|
+ if (ret < 0) {
|
|
+ if (ret == -ENOMEM)
|
|
+ virReportOOMError();
|
|
goto cleanup;
|
|
}
|
|
}
|
|
|
|
- if (!(ret = virStringJoin((const char **)tokens, "/")))
|
|
+ if (!(*res = virStringJoin((const char **)tokens, "/"))) {
|
|
+ ret = -ENOMEM;
|
|
goto cleanup;
|
|
+ }
|
|
+
|
|
+ ret = 0;
|
|
|
|
cleanup:
|
|
virStringFreeList(tokens);
|
|
@@ -1242,9 +1249,9 @@ int virCgroupNewPartition(const char *pa
|
|
|
|
/* XXX convert all cgroups APIs to use error report
|
|
* APIs instead of returning errno */
|
|
- if (!(newpath = virCgroupSetPartitionSuffix(path))) {
|
|
+ rc = virCgroupSetPartitionSuffix(path, &newpath);
|
|
+ if (rc < 0) {
|
|
virResetLastError();
|
|
- rc = -ENOMEM;
|
|
goto cleanup;
|
|
}
|
|
|