aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLi Zefan <lizefan@huawei.com>2013-01-21 05:18:33 -0500
committerTejun Heo <tj@kernel.org>2013-01-22 19:29:07 -0500
commit2739d3cce9816805fe26774fea2527d5b16e924d (patch)
treede9fa4a5d6090835a551cea82c09a146d391f37e
parent130e3695a3edf6bf21464f2826720a79a6afdee0 (diff)
cgroup: fix bogus kernel warnings when cgroup_create() failed
If cgroup_create() failed and cgroup_destroy_locked() is called to do cleanup, we'll see a bunch of warnings: cgroup_addrm_files: failed to remove 2MB.limit_in_bytes, err=-2 cgroup_addrm_files: failed to remove 2MB.usage_in_bytes, err=-2 cgroup_addrm_files: failed to remove 2MB.max_usage_in_bytes, err=-2 cgroup_addrm_files: failed to remove 2MB.failcnt, err=-2 cgroup_addrm_files: failed to remove prioidx, err=-2 cgroup_addrm_files: failed to remove ifpriomap, err=-2 ... We failed to remove those files, because cgroup_create() has failed before creating those cgroup files. To fix this, we simply don't warn if cgroup_rm_file() can't find the cft entry. Signed-off-by: Li Zefan <lizefan@huawei.com> Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r--kernel/cgroup.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index a893985601e9..ad3359f903f0 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -921,13 +921,17 @@ static void remove_dir(struct dentry *d)
921 dput(parent); 921 dput(parent);
922} 922}
923 923
924static int cgroup_rm_file(struct cgroup *cgrp, const struct cftype *cft) 924static void cgroup_rm_file(struct cgroup *cgrp, const struct cftype *cft)
925{ 925{
926 struct cfent *cfe; 926 struct cfent *cfe;
927 927
928 lockdep_assert_held(&cgrp->dentry->d_inode->i_mutex); 928 lockdep_assert_held(&cgrp->dentry->d_inode->i_mutex);
929 lockdep_assert_held(&cgroup_mutex); 929 lockdep_assert_held(&cgroup_mutex);
930 930
931 /*
932 * If we're doing cleanup due to failure of cgroup_create(),
933 * the corresponding @cfe may not exist.
934 */
931 list_for_each_entry(cfe, &cgrp->files, node) { 935 list_for_each_entry(cfe, &cgrp->files, node) {
932 struct dentry *d = cfe->dentry; 936 struct dentry *d = cfe->dentry;
933 937
@@ -940,9 +944,8 @@ static int cgroup_rm_file(struct cgroup *cgrp, const struct cftype *cft)
940 list_del_init(&cfe->node); 944 list_del_init(&cfe->node);
941 dput(d); 945 dput(d);
942 946
943 return 0; 947 break;
944 } 948 }
945 return -ENOENT;
946} 949}
947 950
948/** 951/**
@@ -2758,14 +2761,14 @@ static int cgroup_addrm_files(struct cgroup *cgrp, struct cgroup_subsys *subsys,
2758 if ((cft->flags & CFTYPE_ONLY_ON_ROOT) && cgrp->parent) 2761 if ((cft->flags & CFTYPE_ONLY_ON_ROOT) && cgrp->parent)
2759 continue; 2762 continue;
2760 2763
2761 if (is_add) 2764 if (is_add) {
2762 err = cgroup_add_file(cgrp, subsys, cft); 2765 err = cgroup_add_file(cgrp, subsys, cft);
2763 else 2766 if (err)
2764 err = cgroup_rm_file(cgrp, cft); 2767 pr_warn("cgroup_addrm_files: failed to add %s, err=%d\n",
2765 if (err) { 2768 cft->name, err);
2766 pr_warning("cgroup_addrm_files: failed to %s %s, err=%d\n",
2767 is_add ? "add" : "remove", cft->name, err);
2768 ret = err; 2769 ret = err;
2770 } else {
2771 cgroup_rm_file(cgrp, cft);
2769 } 2772 }
2770 } 2773 }
2771 return ret; 2774 return ret;