The commit is pushed to "branch-rh7-3.10.0-1160.119.1.vz7.224.x-ovz" and will appear at g...@bitbucket.org:openvz/vzkernel.git after rh7-3.10.0-1160.119.1.vz7.224.4 ------> commit 89bfd2c08925436ddf8e105af20b594c015f400b Author: Tejun Heo <t...@kernel.org> Date: Fri Jun 28 16:24:10 2013 -0700
ms/cgroup: fix error path of cgroup_addrm_files() cgroup_addrm_files() mishandled error return value from cgroup_add_file() and returns error iff the last file fails to create. As we're in the process of cleaning up file add/rm error handling and will reliably propagate file creation failures, there's no point in keeping adding files after a failure. Replace the broken error collection logic with immediate error return. While at it, add lockdep assertions and function comment. Signed-off-by: Tejun Heo <t...@kernel.org> Acked-by: Li Zefan <lize...@huawei.com> This is a prerequisite patch for backporting 6732ed853af94 ("cgroup: make cgroup_addrm_files() clean up after itself on failures"). https://virtuozzo.atlassian.net/browse/PSBM-155867 (cherry picked from commit b1f28d3109349899e87377e89f9d8ab5bc95ec57) Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com> --- kernel/cgroup.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 3f8c49b9ebe0..f8af3c6dc5df 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -3133,11 +3133,26 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys, return error; } +/** + * cgroup_addrm_files - add or remove files to a cgroup directory + * @cgrp: the target cgroup + * @subsys: the subsystem of files to be added + * @cfts: array of cftypes to be added + * @is_add: whether to add or remove + * + * Depending on @is_add, add or remove files defined by @cfts on @cgrp. + * All @cfts should belong to @subsys. For removals, this function never + * fails. If addition fails, this function doesn't remove files already + * added. The caller is responsible for cleaning up. + */ static int cgroup_addrm_files(struct cgroup *cgrp, struct cgroup_subsys *subsys, struct cftype cfts[], bool is_add) { struct cftype *cft; - int err, ret = 0; + int ret; + + lockdep_assert_held(&cgrp->dentry->d_inode->i_mutex); + lockdep_assert_held(&cgroup_mutex); for (cft = cfts; cft->name[0] != '\0'; cft++) { /* does cft->flags tell us to skip this file on @cgrp? */ @@ -3149,16 +3164,17 @@ static int cgroup_addrm_files(struct cgroup *cgrp, struct cgroup_subsys *subsys, continue; if (is_add) { - err = cgroup_add_file(cgrp, subsys, cft); - if (err) + ret = cgroup_add_file(cgrp, subsys, cft); + if (ret) { pr_warn("cgroup_addrm_files: failed to add %s, err=%d\n", - cft->name, err); - ret = err; + cft->name, ret); + return ret; + } } else { cgroup_rm_file(cgrp, cft); } } - return ret; + return 0; } static DEFINE_MUTEX(cgroup_cft_mutex); _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel