Commit 4528fd0595847c2078b59f24800e751c2d6b7e41

Authored by Li Zefan
Committed by Linus Torvalds
1 parent ef2b9b0545

cgroups: fix to return errno in a failure path

In cgroup_create(), if alloc_css_id() returns failure, the errno is not
propagated to userspace, so mkdir will fail silently.

To trigger this bug, we mount blkio (or memory subsystem), and create more
then 65534 cgroups.  (The number of cgroups is limited to 65535 if a
subsystem has use_id == 1)

 # mount -t cgroup -o blkio xxx /mnt
 # for ((i = 0; i < 65534; i++)); do mkdir /mnt/$i; done
 # mkdir /mnt/65534
 (should return ENOSPC)
 #

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Acked-by: Serge Hallyn <serue@us.ibm.com>
Acked-by: Paul Menage <menage@google.com>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 5 additions and 2 deletions Side-by-side Diff

... ... @@ -2936,14 +2936,17 @@
2936 2936  
2937 2937 for_each_subsys(root, ss) {
2938 2938 struct cgroup_subsys_state *css = ss->create(ss, cgrp);
  2939 +
2939 2940 if (IS_ERR(css)) {
2940 2941 err = PTR_ERR(css);
2941 2942 goto err_destroy;
2942 2943 }
2943 2944 init_cgroup_css(css, ss, cgrp);
2944   - if (ss->use_id)
2945   - if (alloc_css_id(ss, parent, cgrp))
  2945 + if (ss->use_id) {
  2946 + err = alloc_css_id(ss, parent, cgrp);
  2947 + if (err)
2946 2948 goto err_destroy;
  2949 + }
2947 2950 /* At error, ->destroy() callback has to free assigned ID. */
2948 2951 }
2949 2952