mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-14 06:35:12 +00:00
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>
This commit is contained in:
parent
4a4389abdd
commit
c6b3d5bcd6
1 changed files with 3 additions and 2 deletions
|
@ -1487,6 +1487,7 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
|
||||||
struct cgroup_sb_opts opts;
|
struct cgroup_sb_opts opts;
|
||||||
struct dentry *dentry;
|
struct dentry *dentry;
|
||||||
int ret;
|
int ret;
|
||||||
|
bool new_sb;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The first time anyone tries to mount a cgroup, enable the list
|
* The first time anyone tries to mount a cgroup, enable the list
|
||||||
|
@ -1603,8 +1604,8 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
dentry = kernfs_mount(fs_type, flags, root->kf_root, NULL);
|
dentry = kernfs_mount(fs_type, flags, root->kf_root, &new_sb);
|
||||||
if (IS_ERR(dentry))
|
if (IS_ERR(dentry) || !new_sb)
|
||||||
cgroup_put(&root->cgrp);
|
cgroup_put(&root->cgrp);
|
||||||
return dentry;
|
return dentry;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue