cgroup: fix top cgroup refcnt leak
authorLi Zefan <lizefan@huawei.com>
Fri, 4 Apr 2014 09:14:41 +0000 (17:14 +0800)
committerTejun Heo <tj@kernel.org>
Fri, 4 Apr 2014 12:22:27 +0000 (08:22 -0400)
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>
kernel/cgroup.c

index fede3d3f28ffaa5c998333706d5233620d0734db..0dfc7324c789885381697a91df443eb102637c23 100644 (file)
@@ -1487,6 +1487,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
        struct cgroup_sb_opts opts;
        struct dentry *dentry;
        int ret;
+       bool new_sb;
 
        /*
         * The first time anyone tries to mount a cgroup, enable the list
@@ -1603,8 +1604,8 @@ out_unlock:
        if (ret)
                return ERR_PTR(ret);
 
-       dentry = kernfs_mount(fs_type, flags, root->kf_root, NULL);
-       if (IS_ERR(dentry))
+       dentry = kernfs_mount(fs_type, flags, root->kf_root, &new_sb);
+       if (IS_ERR(dentry) || !new_sb)
                cgroup_put(&root->cgrp);
        return dentry;
 }