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