]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix check for existance of cgroups at creation
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 12 Nov 2009 14:11:43 +0000 (14:11 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 13 Nov 2009 11:50:12 +0000 (11:50 +0000)
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

index bdd4eb68edb18570a8b48adcbd8d0d7750d646c8..c80cf50311064dcacfd15ad1c29b167eeed6854c 100644 (file)
@@ -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);
     }