|
@@ -276,6 +276,26 @@ inline int cgroup_is_removed(const struct cgroup *cgrp)
|
|
|
return test_bit(CGRP_REMOVED, &cgrp->flags);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * cgroup_is_descendant - test ancestry
|
|
|
+ * @cgrp: the cgroup to be tested
|
|
|
+ * @ancestor: possible ancestor of @cgrp
|
|
|
+ *
|
|
|
+ * Test whether @cgrp is a descendant of @ancestor. It also returns %true
|
|
|
+ * if @cgrp == @ancestor. This function is safe to call as long as @cgrp
|
|
|
+ * and @ancestor are accessible.
|
|
|
+ */
|
|
|
+bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor)
|
|
|
+{
|
|
|
+ while (cgrp) {
|
|
|
+ if (cgrp == ancestor)
|
|
|
+ return true;
|
|
|
+ cgrp = cgrp->parent;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(cgroup_is_descendant);
|
|
|
+
|
|
|
/* bits in struct cgroupfs_root flags field */
|
|
|
enum {
|
|
|
ROOT_NOPREFIX, /* mounted subsystems have no named prefix */
|