aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cgroup.c
diff options
context:
space:
mode:
authorKirill A. Shutemov <kirill@shutemov.name>2010-03-10 18:22:34 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2010-03-12 18:52:37 -0500
commita0a4db548edcce067c1201ef25cf2bc29f32dca4 (patch)
tree6f8139a582179666cd248d978332ed0e32ad9f0f /kernel/cgroup.c
parent4ab78683c17d739c2a2077141dcf81a02b7fb57e (diff)
cgroups: remove events before destroying subsystem state objects
Events should be removed after rmdir of cgroup directory, but before destroying subsystem state objects. Let's take reference to cgroup directory dentry to do that. Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hioryu@jp.fujitsu.com> Cc: Paul Menage <menage@google.com> Acked-by: Li Zefan <lizf@cn.fujitsu.com> Cc: Balbir Singh <balbir@linux.vnet.ibm.com> Cc: Pavel Emelyanov <xemul@openvz.org> Cc: Dan Malek <dan@embeddedalley.com> Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/cgroup.c')
-rw-r--r--kernel/cgroup.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 87441fc75663..ef909a329750 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -2994,6 +2994,7 @@ static void cgroup_event_remove(struct work_struct *work)
2994 2994
2995 eventfd_ctx_put(event->eventfd); 2995 eventfd_ctx_put(event->eventfd);
2996 kfree(event); 2996 kfree(event);
2997 dput(cgrp->dentry);
2997} 2998}
2998 2999
2999/* 3000/*
@@ -3114,6 +3115,13 @@ static int cgroup_write_event_control(struct cgroup *cgrp, struct cftype *cft,
3114 goto fail; 3115 goto fail;
3115 } 3116 }
3116 3117
3118 /*
3119 * Events should be removed after rmdir of cgroup directory, but before
3120 * destroying subsystem state objects. Let's take reference to cgroup
3121 * directory dentry to do that.
3122 */
3123 dget(cgrp->dentry);
3124
3117 spin_lock(&cgrp->event_list_lock); 3125 spin_lock(&cgrp->event_list_lock);
3118 list_add(&event->list, &cgrp->event_list); 3126 list_add(&event->list, &cgrp->event_list);
3119 spin_unlock(&cgrp->event_list_lock); 3127 spin_unlock(&cgrp->event_list_lock);