]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
api.c: Allow reading/writing from cgroup.* files in cgroup v2
authorTom Hromatka <tom.hromatka@oracle.com>
Tue, 14 Dec 2021 21:41:40 +0000 (14:41 -0700)
committerTom Hromatka <tom.hromatka@oracle.com>
Tue, 14 Dec 2021 21:41:40 +0000 (14:41 -0700)
Allow reading/writing from cgroup.* files (such as cgroup.type
and cgroup.procs) on cgroup v2 filesystems.

Closes: https://github.com/libcgroup/libcgroup/issues/73
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
(cherry picked from commit 30d0d4708af07baf1ec1ec7edc14a31359a4c1ef)

src/api.c
src/libcgroup-internal.h

index 4a980a157cde3f012c4d5f9d917e7623f0160463..c14068a93ee4044ec7513000bf44553df8d72661 100644 (file)
--- a/src/api.c
+++ b/src/api.c
@@ -396,6 +396,17 @@ int cgroup_test_subsys_mounted(const char *name)
                        pthread_rwlock_unlock(&cg_mount_table_lock);
                        return 1;
                }
+
+               /* The user has likely requested a file like cgroup.type or
+                * cgroup.procs.  Allow this request as long as there's a
+                * cgroup v2 controller mounted.
+                */
+               if (strncmp(name, CGROUP_FILE_PREFIX,
+                           strlen(CGROUP_FILE_PREFIX)) == 0 &&
+                   cg_mount_table[i].version == CGROUP_V2) {
+                       pthread_rwlock_unlock(&cg_mount_table_lock);
+                       return 1;
+               }
        }
        pthread_rwlock_unlock(&cg_mount_table_lock);
        return 0;
@@ -1469,7 +1480,15 @@ char *cg_build_path_locked(const char *name, char *path,
 {
        int i, ret;
        for (i = 0; cg_mount_table[i].name[0] != '\0'; i++) {
-               if (strcmp(cg_mount_table[i].name, type) == 0) {
+               /* Two ways to successfully move forward here:
+                * 1. The "type" controller matches the name of a mounted
+                *    controller
+                * 2. The "type" controller requested is "cgroup" and there's
+                *    a "real" controller mounted as cgroup v2
+                */
+               if ((strcmp(cg_mount_table[i].name, type) == 0) ||
+                   (strcmp(type, CGROUP_FILE_PREFIX) == 0 &&
+                    cg_mount_table[i].version == CGROUP_V2)) {
                        if (cg_namespace_table[i]) {
                                ret = snprintf(path, FILENAME_MAX, "%s/%s/",
                                                cg_mount_table[i].mount.path,
index edc5abb9bdf63e2b25293cb2a4e5386660a1909d..f21bb7a8d1ed11cc62be2bd94f11700109ed8028 100644 (file)
@@ -75,6 +75,8 @@ extern "C" {
 #define CGROUP_RULE_MAXLINE    (FILENAME_MAX + CGROUP_RULE_MAXKEY + \
        CG_CONTROLLER_MAX + 3)
 
+#define CGROUP_FILE_PREFIX     "cgroup"
+
 #define cgroup_err(x...) cgroup_log(CGROUP_LOG_ERROR, x)
 #define cgroup_warn(x...) cgroup_log(CGROUP_LOG_WARNING, x)
 #define cgroup_info(x...) cgroup_log(CGROUP_LOG_INFO, x)