aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLi Zefan <lizefan@huawei.com>2014-04-04 05:14:41 -0400
committerTejun Heo <tj@kernel.org>2014-04-04 08:22:27 -0400
commitc6b3d5bcd67c75961a1e8b9564d1475c0f194a84 (patch)
treee6ed4f1c3b98474996b6b61e232569564d86d352 /kernel
parent4a4389abdd9822fdf3cc2ac6ed87eb811fd43acc (diff)
cgroup: fix top cgroup refcnt leak
As mount() and kill_sb() is not a one-to-one match, If we mount the same cgroupfs in serveral mount points, and then umount all of them, kill_sb() will be called only once. Try: # mount -t cgroup -o cpuacct xxx /cgroup # mount -t cgroup -o cpuacct xxx /cgroup2 # cat /proc/cgroups | grep cpuacct cpuacct 2 1 1 # umount /cgroup # umount /cgroup2 # cat /proc/cgroups | grep cpuacct cpuacct 2 1 1 You'll see cgroupfs will never be freed. Signed-off-by: Li Zefan <lizefan@huawei.com> Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/cgroup.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index fede3d3f28ff..0dfc7324c789 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -1487,6 +1487,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
1487 struct cgroup_sb_opts opts; 1487 struct cgroup_sb_opts opts;
1488 struct dentry *dentry; 1488 struct dentry *dentry;
1489 int ret; 1489 int ret;
1490 bool new_sb;
1490 1491
1491 /* 1492 /*
1492 * The first time anyone tries to mount a cgroup, enable the list 1493 * The first time anyone tries to mount a cgroup, enable the list
@@ -1603,8 +1604,8 @@ out_unlock:
1603 if (ret) 1604 if (ret)
1604 return ERR_PTR(ret); 1605 return ERR_PTR(ret);
1605 1606
1606 dentry = kernfs_mount(fs_type, flags, root->kf_root, NULL); 1607 dentry = kernfs_mount(fs_type, flags, root->kf_root, &new_sb);
1607 if (IS_ERR(dentry)) 1608 if (IS_ERR(dentry) || !new_sb)
1608 cgroup_put(&root->cgrp); 1609 cgroup_put(&root->cgrp);
1609 return dentry; 1610 return dentry;
1610} 1611}