aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cgroup_freezer.c
diff options
context:
space:
mode:
authorLi Zefan <lizf@cn.fujitsu.com>2008-10-29 17:00:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-10-30 14:38:45 -0400
commit7ccb97437bcc818d0ba6067513475f6ee8177a15 (patch)
tree5d9209002ea50383ffc256f89c25743552b5c637 /kernel/cgroup_freezer.c
parentdf8bc08c192f00f155185bfd6f052d46a728814a (diff)
freezer_cg: fix improper BUG_ON() causing oops
The BUG_ON() should be protected by freezer->lock, otherwise it can be triggered easily when a task has been unfreezed but the corresponding cgroup hasn't been changed to FROZEN state. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Acked-by: Cedric Le Goater <clg@fr.ibm.com> Acked-by: Matt Helsley <matthltc@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/cgroup_freezer.c')
-rw-r--r--kernel/cgroup_freezer.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c
index e95056954498..7f54d1c42953 100644
--- a/kernel/cgroup_freezer.c
+++ b/kernel/cgroup_freezer.c
@@ -190,8 +190,9 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
190 freezer = task_freezer(task); 190 freezer = task_freezer(task);
191 task_unlock(task); 191 task_unlock(task);
192 192
193 BUG_ON(freezer->state == CGROUP_FROZEN);
194 spin_lock_irq(&freezer->lock); 193 spin_lock_irq(&freezer->lock);
194 BUG_ON(freezer->state == CGROUP_FROZEN);
195
195 /* Locking avoids race with FREEZING -> THAWED transitions. */ 196 /* Locking avoids race with FREEZING -> THAWED transitions. */
196 if (freezer->state == CGROUP_FREEZING) 197 if (freezer->state == CGROUP_FREEZING)
197 freeze_task(task, true); 198 freeze_task(task, true);