diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-11-18 21:37:07 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-11-18 21:37:07 +0100 |
commit | 5177dc3f2b3220b2dcfcf35eb9e6ec53ee818231 (patch) | |
tree | 29dd80a7b33426d0890aa07b5864224557c62af7 /kernel/cgroup_freezer.c | |
parent | 0bb943c7a2136716757a263f604d26309fd98042 (diff) | |
parent | 7f0f598a0069d1ab072375965a4b69137233169c (diff) | |
download | talos-op-linux-5177dc3f2b3220b2dcfcf35eb9e6ec53ee818231.tar.gz talos-op-linux-5177dc3f2b3220b2dcfcf35eb9e6ec53ee818231.zip |
Merge branch 'linus' into tracing/urgent
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)); } |