summaryrefslogtreecommitdiff
path: root/src/cgroup-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cgroup-util.c')
-rw-r--r--src/cgroup-util.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/cgroup-util.c b/src/cgroup-util.c
index 0b8678c012..e38d6f5c10 100644
--- a/src/cgroup-util.c
+++ b/src/cgroup-util.c
@@ -37,7 +37,6 @@
Currently, the only remaining functionality from libcgroup we call
here is:
- - cgroup_get_subsys_mount_point()
- cgroup_walk_tree_begin()/cgroup_walk_tree_next()
- cgroup_delete_cgroup_ext()
*/
@@ -409,13 +408,33 @@ int cg_migrate_recursive(const char *controller, const char *from, const char *t
}
int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs) {
+ const char *p;
char *mp;
int r;
assert(controller);
+ assert(fs);
+
+ /* This is a very minimal lookup from controller names to
+ * paths. Since we have mounted most hierarchies ourselves
+ * should be kinda safe, but eventually we might want to
+ * extend this to have a fallback to actually check
+ * /proc/mounts. Might need caching then. */
+
+ if (streq(controller, SYSTEMD_CGROUP_CONTROLLER))
+ p = "systemd";
+ else if (startswith(controller, "name="))
+ p = controller + 5;
+ else
+ p = controller;
+
+ if (asprintf(&mp, "/cgroup/%s", p) < 0)
+ return -ENOMEM;
- if ((r = cgroup_get_subsys_mount_point(controller, &mp)) != 0)
- return cg_translate_error(r, errno);
+ if ((r = path_is_mount_point(mp)) <= 0) {
+ free(mp);
+ return r < 0 ? r : -ENOENT;
+ }
if (path && suffix)
r = asprintf(fs, "%s/%s/%s", mp, path, suffix);