diff options
author | Tejun Heo <tj@kernel.org> | 2013-09-06 15:31:08 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-09-10 09:41:00 -0400 |
commit | 58b79a91f57efec9457de8ff93a4cc4fb8daf753 (patch) | |
tree | eb7d3c84c5102506fe222d905761167c9c68373d /kernel | |
parent | 26b0332e30c7f93e780aaa054bd84e3437f84354 (diff) |
cgroup: fix cgroup post-order descendant walk of empty subtree
bd8815a6d8 ("cgroup: make css_for_each_descendant() and friends
include the origin css in the iteration") updated cgroup descendant
iterators to include the origin css; unfortuantely, it forgot to drop
special case handling in css_next_descendant_post() for empty subtree
leading to failure to visit the origin css without any child.
Fix it by dropping the special case handling and always returning the
leftmost descendant on the first iteration.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/cgroup.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index e0aeb32415ff..8075b72d22be 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -3187,11 +3187,9 @@ css_next_descendant_post(struct cgroup_subsys_state *pos, | |||
3187 | 3187 | ||
3188 | WARN_ON_ONCE(!rcu_read_lock_held()); | 3188 | WARN_ON_ONCE(!rcu_read_lock_held()); |
3189 | 3189 | ||
3190 | /* if first iteration, visit the leftmost descendant */ | 3190 | /* if first iteration, visit leftmost descendant which may be @root */ |
3191 | if (!pos) { | 3191 | if (!pos) |
3192 | next = css_leftmost_descendant(root); | 3192 | return css_leftmost_descendant(root); |
3193 | return next != root ? next : NULL; | ||
3194 | } | ||
3195 | 3193 | ||
3196 | /* if we visited @root, we're done */ | 3194 | /* if we visited @root, we're done */ |
3197 | if (pos == root) | 3195 | if (pos == root) |