diff options
author | Li Zefan <lizefan@huawei.com> | 2013-01-21 05:18:33 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-01-22 19:29:07 -0500 |
commit | 2739d3cce9816805fe26774fea2527d5b16e924d (patch) | |
tree | de9fa4a5d6090835a551cea82c09a146d391f37e | |
parent | 130e3695a3edf6bf21464f2826720a79a6afdee0 (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.c | 21 |
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 | ||
924 | static int cgroup_rm_file(struct cgroup *cgrp, const struct cftype *cft) | 924 | static 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; |