|
@@ -5132,7 +5132,7 @@ EXPORT_SYMBOL_GPL(css_depth);
|
|
|
* @root: the css supporsed to be an ancestor of the child.
|
|
|
*
|
|
|
* Returns true if "root" is an ancestor of "child" in its hierarchy. Because
|
|
|
- * this function reads css->id, this use rcu_dereference() and rcu_read_lock().
|
|
|
+ * this function reads css->id, the caller must hold rcu_read_lock().
|
|
|
* But, considering usual usage, the csses should be valid objects after test.
|
|
|
* Assuming that the caller will do some action to the child if this returns
|
|
|
* returns true, the caller must take "child";s reference count.
|
|
@@ -5144,18 +5144,18 @@ bool css_is_ancestor(struct cgroup_subsys_state *child,
|
|
|
{
|
|
|
struct css_id *child_id;
|
|
|
struct css_id *root_id;
|
|
|
- bool ret = true;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
child_id = rcu_dereference(child->id);
|
|
|
+ if (!child_id)
|
|
|
+ return false;
|
|
|
root_id = rcu_dereference(root->id);
|
|
|
- if (!child_id
|
|
|
- || !root_id
|
|
|
- || (child_id->depth < root_id->depth)
|
|
|
- || (child_id->stack[root_id->depth] != root_id->id))
|
|
|
- ret = false;
|
|
|
- rcu_read_unlock();
|
|
|
- return ret;
|
|
|
+ if (!root_id)
|
|
|
+ return false;
|
|
|
+ if (child_id->depth < root_id->depth)
|
|
|
+ return false;
|
|
|
+ if (child_id->stack[root_id->depth] != root_id->id)
|
|
|
+ return false;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css)
|