aboutsummaryrefslogtreecommitdiffstats
path: root/security
diff options
context:
space:
mode:
authorJerry Snitselaar <jerry.snitselaar@oracle.com>2013-02-21 19:41:31 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-21 20:22:15 -0500
commit53eb8c82d581fdd4b389a3e417261f3ae924e603 (patch)
treede3893156c17c9ab220e4460630f581c55a0f487 /security
parent024e4ec1856d57bb78c06ec903d29dcf716f5f47 (diff)
device_cgroup: don't grab mutex in rcu callback
Commit 103a197c0c4e ("security/device_cgroup: lock assert fails in dev_exception_clean()") grabs devcgroup_mutex to fix assert failure, but a mutex can't be grabbed in rcu callback. Since there shouldn't be any other references when css_free is called, mutex isn't needed for list cleanup in devcgroup_css_free(). Signed-off-by: Jerry Snitselaar <jerry.snitselaar@oracle.com> Acked-by: Tejun Heo <tj@kernel.org> Acked-by: Aristeu Rozanski <aris@redhat.com> Cc: James Morris <james.l.morris@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'security')
-rw-r--r--security/device_cgroup.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/security/device_cgroup.c b/security/device_cgroup.c
index d794abcc4b3b..1c69e38e3a2c 100644
--- a/security/device_cgroup.c
+++ b/security/device_cgroup.c
@@ -159,6 +159,16 @@ static void dev_exception_rm(struct dev_cgroup *dev_cgroup,
159 } 159 }
160} 160}
161 161
162static void __dev_exception_clean(struct dev_cgroup *dev_cgroup)
163{
164 struct dev_exception_item *ex, *tmp;
165
166 list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) {
167 list_del_rcu(&ex->list);
168 kfree_rcu(ex, rcu);
169 }
170}
171
162/** 172/**
163 * dev_exception_clean - frees all entries of the exception list 173 * dev_exception_clean - frees all entries of the exception list
164 * @dev_cgroup: dev_cgroup with the exception list to be cleaned 174 * @dev_cgroup: dev_cgroup with the exception list to be cleaned
@@ -167,14 +177,9 @@ static void dev_exception_rm(struct dev_cgroup *dev_cgroup,
167 */ 177 */
168static void dev_exception_clean(struct dev_cgroup *dev_cgroup) 178static void dev_exception_clean(struct dev_cgroup *dev_cgroup)
169{ 179{
170 struct dev_exception_item *ex, *tmp;
171
172 lockdep_assert_held(&devcgroup_mutex); 180 lockdep_assert_held(&devcgroup_mutex);
173 181
174 list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) { 182 __dev_exception_clean(dev_cgroup);
175 list_del_rcu(&ex->list);
176 kfree_rcu(ex, rcu);
177 }
178} 183}
179 184
180/* 185/*
@@ -215,9 +220,7 @@ static void devcgroup_css_free(struct cgroup *cgroup)
215 struct dev_cgroup *dev_cgroup; 220 struct dev_cgroup *dev_cgroup;
216 221
217 dev_cgroup = cgroup_to_devcgroup(cgroup); 222 dev_cgroup = cgroup_to_devcgroup(cgroup);
218 mutex_lock(&devcgroup_mutex); 223 __dev_exception_clean(dev_cgroup);
219 dev_exception_clean(dev_cgroup);
220 mutex_unlock(&devcgroup_mutex);
221 kfree(dev_cgroup); 224 kfree(dev_cgroup);
222} 225}
223 226