Pull cgroup fix from Tejun Heo: "Fix leak of filesystem context root which is triggered by LTP. Not too likely to be a problem in non-testing environments" * 'for-5.14-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: cgroup1: fix leaked context root causing sporadic NULL deref in LTP
Unified · Split
| @@ -61,7 +61,6 @@ extern void __init chrdev_init(void); · 60 unmodified lines | |||
| 61 | */ | 61 | */ |
| 62 | extern const struct fs_context_operations legacy_fs_context_ops; | 62 | extern const struct fs_context_operations legacy_fs_context_ops; |
| 63 | extern int parse_monolithic_mount_data(struct fs_context *, void *); | 63 | extern int parse_monolithic_mount_data(struct fs_context *, void *); |
| 64 | extern void fc_drop_locked(struct fs_context *); | ||
| 65 | extern void vfs_clean_context(struct fs_context *fc); | 64 | extern void vfs_clean_context(struct fs_context *fc); |
| 66 | extern int finish_clean_context(struct fs_context *fc); | 65 | extern int finish_clean_context(struct fs_context *fc); |
| 67 | 66 | ||
| @@ -141,6 +141,7 @@ extern int vfs_get_tree(struct fs_context *fc); · 140 unmodified lines | |||
| 141 | extern void put_fs_context(struct fs_context *fc); | 141 | extern void put_fs_context(struct fs_context *fc); |
| 142 | extern int vfs_parse_fs_param_source(struct fs_context *fc, | 142 | extern int vfs_parse_fs_param_source(struct fs_context *fc, |
| 143 | struct fs_parameter *param); | 143 | struct fs_parameter *param); |
| 144 | extern void fc_drop_locked(struct fs_context *fc); | ||
| 144 | 145 | ||
| 145 | /* | 146 | /* |
| 146 | * sget() wrappers to be called from the ->get_tree() op. | 147 | * sget() wrappers to be called from the ->get_tree() op. |
| @@ -1221,9 +1221,7 @@ int cgroup1_get_tree(struct fs_context *fc) · 1220 unmodified lines | |||
| 1221 | ret = cgroup_do_get_tree(fc); | 1221 | ret = cgroup_do_get_tree(fc); |
| 1222 | 1222 | ||
| 1223 | if (!ret && percpu_ref_is_dying(&ctx->root->cgrp.self.refcnt)) { | 1223 | if (!ret && percpu_ref_is_dying(&ctx->root->cgrp.self.refcnt)) { |
| 1224 | struct super_block *sb = fc->root->d_sb; | 1224 | fc_drop_locked(fc); |
| 1225 | dput(fc->root); | ||
| 1226 | deactivate_locked_super(sb); | ||
| 1227 | ret = 1; | 1225 | ret = 1; |
| 1228 | } | 1226 | } |
| 1229 | 1227 | ||