diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2008-10-29 17:00:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-30 14:38:45 -0400 |
commit | 7ccb97437bcc818d0ba6067513475f6ee8177a15 (patch) | |
tree | 5d9209002ea50383ffc256f89c25743552b5c637 /kernel/cgroup_freezer.c | |
parent | df8bc08c192f00f155185bfd6f052d46a728814a (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.c | 3 |
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); |