aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2009-11-12 14:11:43 +0000
committerDaniel P. Berrange <berrange@redhat.com>2009-11-13 11:50:12 +0000
commitd11d93f406fecfba685314fedc338b5a70ed4a25 (patch)
treef270ecd1b27237673bf411942502a30011a9715b
parentFix race condition in HAL driver startup (diff)
downloadlibvirt-d11d93f406fecfba685314fedc338b5a70ed4a25.tar.gz
libvirt-d11d93f406fecfba685314fedc338b5a70ed4a25.tar.bz2
libvirt-d11d93f406fecfba685314fedc338b5a70ed4a25.zip
Fix check for existance of cgroups at creation
In the scenario where the cgroups were mounted but the particular group did not exist, and the caller had not requested auto-creation, the code would fail to return an error condition. This caused the lxc_controller to think the cgroup existed, and it then later failed when attempting to use it * src/util/cgroup.c: Raise an error if the cgroup path does not exist
-rw-r--r--src/util/cgroup.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/util/cgroup.c b/src/util/cgroup.c
index bdd4eb68e..c80cf5031 100644
--- a/src/util/cgroup.c
+++ b/src/util/cgroup.c
@@ -442,7 +442,7 @@ static int virCgroupCpuSetInherit(virCgroupPtr parent, virCgroupPtr group)
return rc;
}
-static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group)
+static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group, int create)
{
int i;
int rc = 0;
@@ -461,7 +461,8 @@ static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group)
VIR_DEBUG("Make controller %s", path);
if (access(path, F_OK) != 0) {
- if (mkdir(path, 0755) < 0) {
+ if (!create ||
+ mkdir(path, 0755) < 0) {
rc = -errno;
VIR_FREE(path);
break;
@@ -548,7 +549,7 @@ static int virCgroupAppRoot(int privileged,
if (rc != 0)
goto cleanup;
- rc = virCgroupMakeGroup(rootgrp, *group);
+ rc = virCgroupMakeGroup(rootgrp, *group, 1);
cleanup:
virCgroupFree(&rootgrp);
@@ -647,9 +648,8 @@ int virCgroupForDriver(const char *name,
rc = virCgroupNew(path, group);
VIR_FREE(path);
- if (rc == 0 &&
- create) {
- rc = virCgroupMakeGroup(rootgrp, *group);
+ if (rc == 0) {
+ rc = virCgroupMakeGroup(rootgrp, *group, create);
if (rc != 0)
virCgroupFree(group);
}
@@ -695,9 +695,8 @@ int virCgroupForDomain(virCgroupPtr driver,
rc = virCgroupNew(path, group);
VIR_FREE(path);
- if (rc == 0 &&
- create) {
- rc = virCgroupMakeGroup(driver, *group);
+ if (rc == 0) {
+ rc = virCgroupMakeGroup(driver, *group, create);
if (rc != 0)
virCgroupFree(group);
}