[Devel] [PATCH RHEL7 COMMIT] ms/cgroup: fix error path of cgroup_addrm_files()

Konstantin Khorenko khorenko at virtuozzo.com
Mon Jan 13 13:22:23 MSK 2025


The commit is pushed to "branch-rh7-3.10.0-1160.119.1.vz7.224.x-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh7-3.10.0-1160.119.1.vz7.224.4
------>
commit 89bfd2c08925436ddf8e105af20b594c015f400b
Author: Tejun Heo <tj at 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 <tj at kernel.org>
    Acked-by: Li Zefan <lizefan at 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 <khorenko at 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);


More information about the Devel mailing list