leave cgroup_path non-namespaced Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 6d0992f..149ae0a 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h
@@ -586,6 +586,8 @@ copy_cgroup_ns(unsigned long flags, struct user_namespace *user_ns, struct cgroup_namespace *old_ns); +char *cgroup_path_ns(struct cgroup *cgrp, char *buf, size_t buflen, + struct cgroup_namespace *ns); char *cgroup_path(struct cgroup *cgrp, char *buf, size_t buflen); #else /* !CONFIG_CGROUPS */
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index d10f127..074ba98 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c
@@ -2218,28 +2218,24 @@ .fs_flags = FS_USERNS_MOUNT, }; -static int cgroup_path_ns(struct cgroup *cgrp, char *buf, size_t buflen, - struct cgroup_namespace *ns) -{ - struct cgroup *root; - - root = cset_cgroup_from_root(ns->root_cset, cgrp->root); - return kernfs_path_from_node(cgrp->kn, root->kn, buf, buflen); -} - -char *cgroup_path(struct cgroup *cgrp, char *buf, size_t buflen) +char *cgroup_path_ns(struct cgroup *cgrp, char *buf, size_t buflen, + struct cgroup_namespace *ns) { int ret; - struct cgroup_namespace *ns = &init_cgroup_ns; - - if (!in_interrupt()) - ns = current->nsproxy->cgroup_ns; + struct cgroup *root = cset_cgroup_from_root(ns->root_cset, cgrp->root); - ret = cgroup_path_ns(cgrp, buf, buflen, ns); + ret = kernfs_path_from_node(cgrp->kn, root->kn, buf, buflen); if (ret < 0 || ret >= buflen) return NULL; return buf; } +EXPORT_SYMBOL_GPL(cgroup_path_ns); + +char *cgroup_path(struct cgroup *cgrp, char *buf, size_t buflen) +{ + return cgroup_path_ns(cgrp, buf, buflen, &init_cgroup_ns); +} + EXPORT_SYMBOL_GPL(cgroup_path); /** @@ -5487,7 +5483,8 @@ * " (deleted)" is appended to the cgroup path. */ if (cgroup_on_dfl(cgrp) || !(tsk->flags & PF_EXITING)) { - path = cgroup_path(cgrp, buf, PATH_MAX); + path = cgroup_path_ns(cgrp, buf, PATH_MAX, + current->nsproxy->cgroup_ns); if (!path) { retval = -ENAMETOOLONG; goto out_unlock;
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 3e945fc..37c8eb0 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c
@@ -2689,7 +2689,8 @@ retval = -ENAMETOOLONG; rcu_read_lock(); css = task_css(tsk, cpuset_cgrp_id); - p = cgroup_path(css->cgroup, buf, PATH_MAX); + p = cgroup_path_ns(css->cgroup, buf, PATH_MAX, + current->nsproxy->cgroup_ns); rcu_read_unlock(); if (!p) goto out_free;
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index 6415117..4c28523 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c
@@ -104,7 +104,8 @@ if (autogroup_path(tg, group_path, PATH_MAX)) return group_path; - return cgroup_path(tg->css.cgroup, group_path, PATH_MAX); + return cgroup_path_ns(tg->css.cgroup, group_path, PATH_MAX, + current->nsproxy->cgroup_ns); } #endif