cgroups: fix lock inconsistency in cgroup_clone()
PATCH 1/1 cgroups: fix lock inconsistency in cgroup_clone()
I fixed a bug in cgroup_clone() in Linus' tree (commit 7b574b7), without noticing there was a cleanup patch in -mm tree that should be rebased (now commit 104cbd5), thus resulted in lock inconsistency.
---
for 2.6.29
--- kernel/cgroup.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-)
kernel/cgroup.c +7 -6
@@ -2991,20 +2991,21 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_unlock (&cgroup_mutex);return 0 ; } -task_lock (tsk); - cg = tsk->cgroups; - parent =task_cgroup (tsk, subsys->subsys_id);/* Pin the hierarchy */ -if (!atomic_inc_not_zero (&parent->root->sb->s_active)) { +if (!atomic_inc_not_zero (&root->sb->s_active)) {/* We race with the final deactivate_super() */ mutex_unlock (&cgroup_mutex);return 0 ; }/* Keep the cgroup alive */ +task_lock (tsk); + parent =task_cgroup (tsk, subsys->subsys_id); + cg = tsk->cgroups;get_css_set (cg);task_unlock (tsk); +mutex_unlock (&cgroup_mutex);/* Now do the VFS work to create a cgroup */
@@ -3043,7 +3044,7 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_unlock (&inode->i_mutex);put_css_set (cg); -deactivate_super (parent->root->sb); +deactivate_super (root->sb);/* The cgroup is still accessible in the VFS, but * we're not going to try to rmdir() it at this * point. */
@@ -3069,7 +3070,7 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_lock (&cgroup_mutex);put_css_set (cg);mutex_unlock (&cgroup_mutex); -deactivate_super (parent->root->sb); +deactivate_super (root->sb);return ret; }
Signature · 1 line
1.5.4.rc3
A message that is not in the archive (sent off-list or not yet received): [email protected]
Paul Menage
Acked-byQuoted 5 lines · Li Zefan
I fixed a bug in
cgroup_clone()in Linus' tree (commit 7b574b7), without noticing there was a cleanup patch in -mm tree that should be rebased (now commit 104cbd5), thus resulted in lock inconsistency.Signed-off-by Li Zefan <[email protected]>
Thanks.
Quoted 61 lines
---
for 2.6.29
--- kernel/cgroup.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-)kernel/cgroup.c +7
-7@@ -2991,20 +2991,21 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_unlock (&cgroup_mutex);return 0 ; } -task_lock (tsk); - cg = tsk->cgroups; - parent =task_cgroup (tsk, subsys->subsys_id);/* Pin the hierarchy */ -if (!atomic_inc_not_zero (&parent->root->sb->s_active)) { +if (!atomic_inc_not_zero (&root->sb->s_active)) {/* We race with the final deactivate_super() */ mutex_unlock (&cgroup_mutex);return 0 ; }/* Keep the cgroup alive */ +task_lock (tsk); + parent =task_cgroup (tsk, subsys->subsys_id); + cg = tsk->cgroups;get_css_set (cg);task_unlock (tsk); +mutex_unlock (&cgroup_mutex);/* Now do the VFS work to create a cgroup */ @@ -3043,7 +3044,7 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_unlock (&inode->i_mutex);put_css_set (cg); -deactivate_super (parent->root->sb); +deactivate_super (root->sb);/* The cgroup is still accessible in the VFS, but * we're not going to try to rmdir() it at this * point. */ @@ -3069,7 +3070,7 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_lock (&cgroup_mutex);put_css_set (cg);mutex_unlock (&cgroup_mutex); -deactivate_super (parent->root->sb); +deactivate_super (root->sb);return ret; } --1.5.4.rc3
Quoted 5 lines · Li Zefan
I fixed a bug in
cgroup_clone()in Linus' tree (commit 7b574b7), without noticing there was a cleanup patch in -mm tree that should be rebased (now commit 104cbd5), thus resulted in lock inconsistency.Signed-off-by Li Zefan <[email protected]>
Thanks.
Quoted 61 lines
---
for 2.6.29
--- kernel/cgroup.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-)kernel/cgroup.c +7
-7@@ -2991,20 +2991,21 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_unlock (&cgroup_mutex);return 0 ; } -task_lock (tsk); - cg = tsk->cgroups; - parent =task_cgroup (tsk, subsys->subsys_id);/* Pin the hierarchy */ -if (!atomic_inc_not_zero (&parent->root->sb->s_active)) { +if (!atomic_inc_not_zero (&root->sb->s_active)) {/* We race with the final deactivate_super() */ mutex_unlock (&cgroup_mutex);return 0 ; }/* Keep the cgroup alive */ +task_lock (tsk); + parent =task_cgroup (tsk, subsys->subsys_id); + cg = tsk->cgroups;get_css_set (cg);task_unlock (tsk); +mutex_unlock (&cgroup_mutex);/* Now do the VFS work to create a cgroup */ @@ -3043,7 +3044,7 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_unlock (&inode->i_mutex);put_css_set (cg); -deactivate_super (parent->root->sb); +deactivate_super (root->sb);/* The cgroup is still accessible in the VFS, but * we're not going to try to rmdir() it at this * point. */ @@ -3069,7 +3070,7 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,mutex_lock (&cgroup_mutex);put_css_set (cg);mutex_unlock (&cgroup_mutex); -deactivate_super (parent->root->sb); +deactivate_super (root->sb);return ret; } --1.5.4.rc3