X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=inline;f=src%2Fcgroup-util.c;h=fd0ac98e28faad081e1b2faa17425b592f2e9ea7;hb=3bfc71846c3eac9011f0182b0c8d5639a9549228;hp=bbadc789a1651a30a2d995c85f807c704dc41b84;hpb=1f73f0f163eeb8a889e3799c0c63bcb437e531ac;p=elogind.git diff --git a/src/cgroup-util.c b/src/cgroup-util.c index bbadc789a..fd0ac98e2 100644 --- a/src/cgroup-util.c +++ b/src/cgroup-util.c @@ -482,12 +482,26 @@ finish: int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs) { const char *p; - char *mp; - int r; + char *t; + static __thread bool good = false; assert(controller); assert(fs); + if (_unlikely_(!good)) { + int r; + + r = path_is_mount_point("/sys/fs/cgroup"); + if (r <= 0) + return r < 0 ? r : -ENOENT; + + /* Cache this to save a few stat()s */ + good = true; + } + + if (isempty(controller)) + return -EINVAL; + /* 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 @@ -501,29 +515,22 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch else p = controller; - if (asprintf(&mp, "/sys/fs/cgroup/%s", p) < 0) - return -ENOMEM; - - 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); + t = join("/sys/fs/cgroup/", p, "/", path, "/", suffix, NULL); else if (path) - r = asprintf(fs, "%s/%s", mp, path); + t = join("/sys/fs/cgroup/", p, "/", path, NULL); else if (suffix) - r = asprintf(fs, "%s/%s", mp, suffix); - else { - path_kill_slashes(mp); - *fs = mp; - return 0; - } + t = join("/sys/fs/cgroup/", p, "/", suffix, NULL); + else + t = join("/sys/fs/cgroup/", p, NULL); + + if (!t) + return -ENOMEM; - free(mp); - path_kill_slashes(*fs); - return r < 0 ? -ENOMEM : 0; + path_kill_slashes(t); + + *fs = t; + return 0; } int cg_trim(const char *controller, const char *path, bool delete_root) {