From d11d93f406fecfba685314fedc338b5a70ed4a25 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 12 Nov 2009 14:11:43 +0000 Subject: 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 --- src/util/cgroup.c | 17 ++++++++--------- 1 file 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); } -- cgit v1.2.3-65-gdbad