Skip to content

Commit

Permalink
cgroup: Take css_set_lock from cgroup_css_sets_empty()
Browse files Browse the repository at this point in the history
As indicated in the comment above cgroup_css_sets_empty it needs the
css_set_lock. But neither of the 2 call points have it, so rather then fixing
the callers just take the lock inside cgroup_css_sets_empty().

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Change-Id: If7aea71824f6d0e3f2cc6c1ce236c3ae6be2037b
  • Loading branch information
jwrdegoede authored and Ed Tam committed Jul 29, 2014
1 parent 647f26e commit 24c66d5
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions kernel/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -3977,19 +3977,23 @@ static int cgroup_clear_css_refs(struct cgroup *cgrp)
return !failed;
}

/* checks if all of the css_sets attached to a cgroup have a refcount of 0.
* Must be called with css_set_lock held */
/* Checks if all of the css_sets attached to a cgroup have a refcount of 0. */
static int cgroup_css_sets_empty(struct cgroup *cgrp)
{
struct cg_cgroup_link *link;
int retval = 1;

read_lock(&css_set_lock);
list_for_each_entry(link, &cgrp->css_sets, cgrp_link_list) {
struct css_set *cg = link->cg;
if (atomic_read(&cg->refcount) > 0)
return 0;
if (atomic_read(&cg->refcount) > 0) {
retval = 0;
break;
}
}
read_unlock(&css_set_lock);

return 1;
return retval;
}

static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry)
Expand Down

0 comments on commit 24c66d5

Please sign in to comment.