Merge branch 'for-3.10-fixes' into for-3.11
Merging to receive 7805d000db
("cgroup: fix a subtle bug in descendant
pre-order walk") so that further iterator updates can build upon it.
Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
commit
3f33e64f4a
2 changed files with 9 additions and 11 deletions
|
@ -709,7 +709,7 @@ struct cgroup *cgroup_rightmost_descendant(struct cgroup *pos);
|
|||
*
|
||||
* If a subsystem synchronizes against the parent in its ->css_online() and
|
||||
* before starting iterating, and synchronizes against @pos on each
|
||||
* iteration, any descendant cgroup which finished ->css_offline() is
|
||||
* iteration, any descendant cgroup which finished ->css_online() is
|
||||
* guaranteed to be visible in the future iterations.
|
||||
*
|
||||
* In other words, the following guarantees that a descendant can't escape
|
||||
|
|
|
@ -2736,13 +2736,14 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,
|
|||
goto out;
|
||||
}
|
||||
|
||||
cfe->type = (void *)cft;
|
||||
cfe->dentry = dentry;
|
||||
dentry->d_fsdata = cfe;
|
||||
simple_xattrs_init(&cfe->xattrs);
|
||||
|
||||
mode = cgroup_file_mode(cft);
|
||||
error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb);
|
||||
if (!error) {
|
||||
cfe->type = (void *)cft;
|
||||
cfe->dentry = dentry;
|
||||
dentry->d_fsdata = cfe;
|
||||
simple_xattrs_init(&cfe->xattrs);
|
||||
list_add_tail(&cfe->node, &parent->files);
|
||||
cfe = NULL;
|
||||
}
|
||||
|
@ -2990,11 +2991,8 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,
|
|||
WARN_ON_ONCE(!rcu_read_lock_held());
|
||||
|
||||
/* if first iteration, pretend we just visited @cgroup */
|
||||
if (!pos) {
|
||||
if (list_empty(&cgroup->children))
|
||||
return NULL;
|
||||
if (!pos)
|
||||
pos = cgroup;
|
||||
}
|
||||
|
||||
/* visit the first child if exists */
|
||||
next = list_first_or_null_rcu(&pos->children, struct cgroup, sibling);
|
||||
|
@ -3002,14 +3000,14 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,
|
|||
return next;
|
||||
|
||||
/* no child, visit my or the closest ancestor's next sibling */
|
||||
do {
|
||||
while (pos != cgroup) {
|
||||
next = list_entry_rcu(pos->sibling.next, struct cgroup,
|
||||
sibling);
|
||||
if (&next->sibling != &pos->parent->children)
|
||||
return next;
|
||||
|
||||
pos = pos->parent;
|
||||
} while (pos != cgroup);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue