From: Tom Hromatka Date: Mon, 6 Dec 2021 21:53:01 +0000 (-0700) Subject: api.c: Allow reading/writing from cgroup.* files in cgroup v2 X-Git-Tag: v3.0~254^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30d0d4708af07baf1ec1ec7edc14a31359a4c1ef;p=thirdparty%2Flibcgroup.git api.c: Allow reading/writing from cgroup.* files in cgroup v2 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 Reviewed-by: Kamalesh Babulal --- diff --git a/src/api.c b/src/api.c index 4a980a15..c14068a9 100644 --- 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, diff --git a/src/libcgroup-internal.h b/src/libcgroup-internal.h index edc5abb9..f21bb7a8 100644 --- a/src/libcgroup-internal.h +++ b/src/libcgroup-internal.h @@ -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)