diff options
| -rw-r--r-- | kernel/cgroup/cgroup-internal.h | 3 | ||||
| -rw-r--r-- | kernel/cgroup/cgroup-v1.c | 4 | ||||
| -rw-r--r-- | kernel/cgroup/cgroup.c | 7 |
3 files changed, 10 insertions, 4 deletions
diff --git a/kernel/cgroup/cgroup-internal.h b/kernel/cgroup/cgroup-internal.h index a7b5a41f170c..3c1613a7648c 100644 --- a/kernel/cgroup/cgroup-internal.h +++ b/kernel/cgroup/cgroup-internal.h | |||
| @@ -41,6 +41,7 @@ extern void __init enable_debug_cgroup(void); | |||
| 41 | * The cgroup filesystem superblock creation/mount context. | 41 | * The cgroup filesystem superblock creation/mount context. |
| 42 | */ | 42 | */ |
| 43 | struct cgroup_fs_context { | 43 | struct cgroup_fs_context { |
| 44 | struct cgroup_root *root; | ||
| 44 | unsigned int flags; /* CGRP_ROOT_* flags */ | 45 | unsigned int flags; /* CGRP_ROOT_* flags */ |
| 45 | 46 | ||
| 46 | /* cgroup1 bits */ | 47 | /* cgroup1 bits */ |
| @@ -208,7 +209,7 @@ int cgroup_path_ns_locked(struct cgroup *cgrp, char *buf, size_t buflen, | |||
| 208 | struct cgroup_namespace *ns); | 209 | struct cgroup_namespace *ns); |
| 209 | 210 | ||
| 210 | void cgroup_free_root(struct cgroup_root *root); | 211 | void cgroup_free_root(struct cgroup_root *root); |
| 211 | void init_cgroup_root(struct cgroup_root *root, struct cgroup_fs_context *ctx); | 212 | void init_cgroup_root(struct cgroup_fs_context *ctx); |
| 212 | int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask); | 213 | int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask); |
| 213 | int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask); | 214 | int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask); |
| 214 | struct dentry *cgroup_do_mount(struct file_system_type *fs_type, int flags, | 215 | struct dentry *cgroup_do_mount(struct file_system_type *fs_type, int flags, |
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c index 725e9f6fe80d..45a198c63d6e 100644 --- a/kernel/cgroup/cgroup-v1.c +++ b/kernel/cgroup/cgroup-v1.c | |||
| @@ -1208,6 +1208,7 @@ int cgroup1_get_tree(struct fs_context *fc) | |||
| 1208 | if (root->flags ^ ctx->flags) | 1208 | if (root->flags ^ ctx->flags) |
| 1209 | pr_warn("new mount options do not match the existing superblock, will be ignored\n"); | 1209 | pr_warn("new mount options do not match the existing superblock, will be ignored\n"); |
| 1210 | 1210 | ||
| 1211 | ctx->root = root; | ||
| 1211 | ret = 0; | 1212 | ret = 0; |
| 1212 | goto out_unlock; | 1213 | goto out_unlock; |
| 1213 | } | 1214 | } |
| @@ -1234,7 +1235,8 @@ int cgroup1_get_tree(struct fs_context *fc) | |||
| 1234 | goto out_unlock; | 1235 | goto out_unlock; |
| 1235 | } | 1236 | } |
| 1236 | 1237 | ||
| 1237 | init_cgroup_root(root, ctx); | 1238 | ctx->root = root; |
| 1239 | init_cgroup_root(ctx); | ||
| 1238 | 1240 | ||
| 1239 | ret = cgroup_setup_root(root, ctx->subsys_mask); | 1241 | ret = cgroup_setup_root(root, ctx->subsys_mask); |
| 1240 | if (ret) | 1242 | if (ret) |
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index d0cddfbdf5cf..57f43f63363a 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c | |||
| @@ -1915,8 +1915,9 @@ static void init_cgroup_housekeeping(struct cgroup *cgrp) | |||
| 1915 | INIT_WORK(&cgrp->release_agent_work, cgroup1_release_agent); | 1915 | INIT_WORK(&cgrp->release_agent_work, cgroup1_release_agent); |
| 1916 | } | 1916 | } |
| 1917 | 1917 | ||
| 1918 | void init_cgroup_root(struct cgroup_root *root, struct cgroup_fs_context *ctx) | 1918 | void init_cgroup_root(struct cgroup_fs_context *ctx) |
| 1919 | { | 1919 | { |
| 1920 | struct cgroup_root *root = ctx->root; | ||
| 1920 | struct cgroup *cgrp = &root->cgrp; | 1921 | struct cgroup *cgrp = &root->cgrp; |
| 1921 | 1922 | ||
| 1922 | INIT_LIST_HEAD(&root->root_list); | 1923 | INIT_LIST_HEAD(&root->root_list); |
| @@ -2098,6 +2099,7 @@ static int cgroup_get_tree(struct fs_context *fc) | |||
| 2098 | 2099 | ||
| 2099 | cgrp_dfl_visible = true; | 2100 | cgrp_dfl_visible = true; |
| 2100 | cgroup_get_live(&cgrp_dfl_root.cgrp); | 2101 | cgroup_get_live(&cgrp_dfl_root.cgrp); |
| 2102 | ctx->root = &cgrp_dfl_root; | ||
| 2101 | 2103 | ||
| 2102 | root = cgroup_do_mount(&cgroup2_fs_type, fc->sb_flags, &cgrp_dfl_root, | 2104 | root = cgroup_do_mount(&cgroup2_fs_type, fc->sb_flags, &cgrp_dfl_root, |
| 2103 | CGROUP2_SUPER_MAGIC, ns); | 2105 | CGROUP2_SUPER_MAGIC, ns); |
| @@ -5374,7 +5376,8 @@ int __init cgroup_init_early(void) | |||
| 5374 | struct cgroup_subsys *ss; | 5376 | struct cgroup_subsys *ss; |
| 5375 | int i; | 5377 | int i; |
| 5376 | 5378 | ||
| 5377 | init_cgroup_root(&cgrp_dfl_root, &ctx); | 5379 | ctx.root = &cgrp_dfl_root; |
| 5380 | init_cgroup_root(&ctx); | ||
| 5378 | cgrp_dfl_root.cgrp.self.flags |= CSS_NO_REF; | 5381 | cgrp_dfl_root.cgrp.self.flags |= CSS_NO_REF; |
| 5379 | 5382 | ||
| 5380 | RCU_INIT_POINTER(init_task.cgroups, &init_css_set); | 5383 | RCU_INIT_POINTER(init_task.cgroups, &init_css_set); |
