diff options
author | Ingo Molnar | 2008-12-04 08:52:14 +0100 |
---|---|---|
committer | Ingo Molnar | 2008-12-04 08:52:14 +0100 |
commit | cb9c34e6d090d376b77becaa5d29a65dec7f4272 (patch) | |
tree | 3678abce20d6825aebe3fec218057d4131e13fd6 /kernel/cgroup_freezer.c | |
parent | genirq: warn when IRQF_DISABLED may be ignored (diff) | |
parent | Linux 2.6.28-rc7 (diff) | |
download | kernel-qcow2-linux-cb9c34e6d090d376b77becaa5d29a65dec7f4272.tar.gz kernel-qcow2-linux-cb9c34e6d090d376b77becaa5d29a65dec7f4272.tar.xz kernel-qcow2-linux-cb9c34e6d090d376b77becaa5d29a65dec7f4272.zip |
Merge commit 'v2.6.28-rc7' into core/locking
Diffstat (limited to 'kernel/cgroup_freezer.c')
-rw-r--r-- | kernel/cgroup_freezer.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index 7fa476f01d05..fb249e2bcada 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c @@ -184,9 +184,20 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task) { struct freezer *freezer; - task_lock(task); + /* + * No lock is needed, since the task isn't on tasklist yet, + * so it can't be moved to another cgroup, which means the + * freezer won't be removed and will be valid during this + * function call. + */ freezer = task_freezer(task); - task_unlock(task); + + /* + * The root cgroup is non-freezable, so we can skip the + * following check. + */ + if (!freezer->css.cgroup->parent) + return; spin_lock_irq(&freezer->lock); BUG_ON(freezer->state == CGROUP_FROZEN); @@ -331,7 +342,7 @@ static int freezer_write(struct cgroup *cgroup, else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0) goal_state = CGROUP_FROZEN; else - return -EIO; + return -EINVAL; if (!cgroup_lock_live_group(cgroup)) return -ENODEV; @@ -350,6 +361,8 @@ static struct cftype files[] = { static int freezer_populate(struct cgroup_subsys *ss, struct cgroup *cgroup) { + if (!cgroup->parent) + return 0; return cgroup_add_files(cgroup, ss, files, ARRAY_SIZE(files)); } |