Messages in this thread Patch in this message |  | | | Date | Tue, 11 Nov 2008 16:23:05 -0800 | | From | Greg KH <> | | Subject | [patch 07/49] cgroups: fix invalid cgrp->dentry before cgroup has been completely removed |
| |
2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------ From: Li Zefan <lizf@cn.fujitsu.com>
commit 24eb089950ce44603b30a3145a2c8520e2b55bb1 upstream
This fixes an oops when reading /proc/sched_debug.
A cgroup won't be removed completely until finishing cgroup_diput(), so we shouldn't invalidate cgrp->dentry in cgroup_rmdir(). Otherwise, when a group is being removed while cgroup_path() gets called, we may trigger NULL dereference BUG.
The bug can be reproduced:
# cat test.sh #!/bin/sh mount -t cgroup -o cpu xxx /mnt for (( ; ; )) { mkdir /mnt/sub rmdir /mnt/sub } # ./test.sh & # cat /proc/sched_debug BUG: unable to handle kernel NULL pointer dereference at 00000038 IP: [<c045a47f>] cgroup_path+0x39/0x90 .. Call Trace: [<c0420344>] ? print_cfs_rq+0x6e/0x75d [<c0421160>] ? sched_debug_show+0x72d/0xc1e .. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Acked-by: Paul Menage <menage@google.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- kernel/cgroup.c | 1 - 1 file changed, 1 deletion(-) --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -2443,7 +2443,6 @@ static int cgroup_rmdir(struct inode *un list_del(&cgrp->sibling); spin_lock(&cgrp->dentry->d_lock); d = dget(cgrp->dentry); - cgrp->dentry = NULL; spin_unlock(&d->d_lock); cgroup_d_remove_dir(d); --
|  |