]> git.proxmox.com Git - mirror_lxc.git/commitdiff
cgroup.c: clean up for handle_cgroup_settings
authorQiang Huang <h.huangqiang@huawei.com>
Mon, 20 Jan 2014 08:37:06 +0000 (16:37 +0800)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Thu, 23 Jan 2014 03:25:35 +0000 (21:25 -0600)
Clean up the nesting if, make the logic similar for memory
and cpuset, and the error message should sent from inside,
for better extendibility.

Signed-off-by: Qiang Huang <h.huangqiang@huawei.com>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/lxc/cgroup.c

index fc23a066399d90e3fc750c5c733ae8dc4c4f6955..4da0e0730181dff3c813503d2ec9c5bf59c6f1f6 100644 (file)
@@ -848,10 +848,8 @@ struct cgroup_process_info *lxc_cgroupfs_create(const char *name, const char *pa
 
                if (lxc_string_in_array("ns", (const char **)h->subsystems))
                        continue;
-               if (handle_cgroup_settings(mp, info_ptr->cgroup_path) < 0) {
-                       ERROR("Could not set clone_children to 1 for cpuset hierarchy in parent cgroup.");
+               if (handle_cgroup_settings(mp, info_ptr->cgroup_path) < 0)
                        goto out_initial_error;
-               }
        }
 
        /* normalize the path */
@@ -2084,47 +2082,66 @@ static int handle_cgroup_settings(struct cgroup_mount_point *mp,
 {
        int r, saved_errno = 0;
        char buf[2];
+       const char **subsystems = (const char **)mp->hierarchy->subsystems;
 
        /* If this is the memory cgroup, we want to enforce hierarchy.
         * But don't fail if for some reason we can't.
         */
-       if (lxc_string_in_array("memory", (const char **)mp->hierarchy->subsystems)) {
-               char *cc_path = cgroup_to_absolute_path(mp, cgroup_path, "/memory.use_hierarchy");
-               if (cc_path) {
-                       r = lxc_read_from_file(cc_path, buf, 1);
-                       if (r < 1 || buf[0] != '1') {
-                               r = lxc_write_to_file(cc_path, "1", 1, false);
-                               if (r < 0)
-                                       SYSERROR("failed to set memory.use_hiararchy to 1; continuing");
-                       }
+       if (lxc_string_in_array("memory", subsystems)) {
+               char *cc_path = cgroup_to_absolute_path(mp, cgroup_path,
+                                               "/memory.use_hierarchy");
+               if (!cc_path)
+                       goto cpuset;
+
+               r = lxc_read_from_file(cc_path, buf, 1);
+               if (r == 1 && buf[0] == '1') {
                        free(cc_path);
+                       goto cpuset;
                }
-       }
+
+               r = lxc_write_to_file(cc_path, "1", 1, false);
+               if (r < 0)
+                       SYSERROR("Failed to set memory.use_hiararchy to 1; continuing");
+               free(cc_path);
+       }
 
        /* if this is a cpuset hierarchy, we have to set cgroup.clone_children in
         * the base cgroup, otherwise containers will start with an empty cpuset.mems
         * and cpuset.cpus and then
         */
-       if (lxc_string_in_array("cpuset", (const char **)mp->hierarchy->subsystems)) {
-               char *cc_path = cgroup_to_absolute_path(mp, cgroup_path, "/cgroup.clone_children");
+cpuset:
+       if (lxc_string_in_array("cpuset", subsystems)) {
                struct stat sb;
+               char *cc_path = cgroup_to_absolute_path(mp, cgroup_path,
+                                               "/cgroup.clone_children");
 
                if (!cc_path)
-                       return -1;
-               if (stat(cc_path, &sb) != 0 && errno == ENOENT)
-                       return 0;
+                       goto err;
+               if (stat(cc_path, &sb) != 0 && errno == ENOENT) {
+                       free(cc_path);
+                       goto out;
+               }
+
                r = lxc_read_from_file(cc_path, buf, 1);
                if (r == 1 && buf[0] == '1') {
                        free(cc_path);
-                       return 0;
+                       goto out;
                }
+
                r = lxc_write_to_file(cc_path, "1", 1, false);
-               saved_errno = errno;
-               free(cc_path);
-               errno = saved_errno;
-               return r < 0 ? -1 : 0;
+               if (r < 0) {
+                       SYSERROR("Failed to set clone_children to 1 for cpuset hierarchy in parent cgroup.");
+                       saved_errno = errno;
+                       free(cc_path);
+                       errno = saved_errno;
+                       goto err;
+               }
+               free(cc_path);
        }
+out:
        return 0;
+err:
+       return -1;
 }
 
 extern void lxc_monitor_send_state(const char *name, lxc_state_t state,