cpuset: move mount -t cpuset logics into cgroup.c
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 13 May 2019 16:33:22 +0000 (12:33 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 May 2019 22:00:01 +0000 (18:00 -0400)
... and get rid of the weird dances in ->get_tree() - that logics
can be easily handled in ->init_fs_context().

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
kernel/cgroup/cgroup.c
kernel/cgroup/cpuset.c

index bbcdd3457eb0dc472511cbd1c2f2af640d41f920..4a0eb465d17ec22c2134dd56778d8cbc02b8efab 100644 (file)
@@ -2225,6 +2225,50 @@ static struct file_system_type cgroup2_fs_type = {
        .fs_flags               = FS_USERNS_MOUNT,
 };
 
+#ifdef CONFIG_CPUSETS
+static const struct fs_context_operations cpuset_fs_context_ops = {
+       .get_tree       = cgroup1_get_tree,
+       .free           = cgroup_fs_context_free,
+};
+
+/*
+ * This is ugly, but preserves the userspace API for existing cpuset
+ * users. If someone tries to mount the "cpuset" filesystem, we
+ * silently switch it to mount "cgroup" instead
+ */
+static int cpuset_init_fs_context(struct fs_context *fc)
+{
+       char *agent = kstrdup("/sbin/cpuset_release_agent", GFP_USER);
+       struct cgroup_fs_context *ctx;
+       int err;
+
+       err = cgroup_init_fs_context(fc);
+       if (err) {
+               kfree(agent);
+               return err;
+       }
+
+       fc->ops = &cpuset_fs_context_ops;
+
+       ctx = cgroup_fc2context(fc);
+       ctx->subsys_mask = 1 << cpuset_cgrp_id;
+       ctx->flags |= CGRP_ROOT_NOPREFIX;
+       ctx->release_agent = agent;
+
+       get_filesystem(&cgroup_fs_type);
+       put_filesystem(fc->fs_type);
+       fc->fs_type = &cgroup_fs_type;
+
+       return 0;
+}
+
+static struct file_system_type cpuset_fs_type = {
+       .name                   = "cpuset",
+       .init_fs_context        = cpuset_init_fs_context,
+       .fs_flags               = FS_USERNS_MOUNT,
+};
+#endif
+
 int cgroup_path_ns_locked(struct cgroup *cgrp, char *buf, size_t buflen,
                          struct cgroup_namespace *ns)
 {
@@ -5710,6 +5754,9 @@ int __init cgroup_init(void)
        WARN_ON(register_filesystem(&cgroup_fs_type));
        WARN_ON(register_filesystem(&cgroup2_fs_type));
        WARN_ON(!proc_create_single("cgroups", 0, NULL, proc_cgroupstats_show));
+#ifdef CONFIG_CPUSETS
+       WARN_ON(register_filesystem(&cpuset_fs_type));
+#endif
 
        return 0;
 }
index 6a1942ed781c5b1712021299fb8227d389126c00..9806c8c8b50960b6ea87ed27489323e55c331bf6 100644 (file)
@@ -355,59 +355,6 @@ static inline bool is_in_v2_mode(void)
              (cpuset_cgrp_subsys.root->flags & CGRP_ROOT_CPUSET_V2_MODE);
 }
 
-/*
- * This is ugly, but preserves the userspace API for existing cpuset
- * users. If someone tries to mount the "cpuset" filesystem, we
- * silently switch it to mount "cgroup" instead
- */
-static int cpuset_get_tree(struct fs_context *fc)
-{
-       struct file_system_type *cgroup_fs;
-       struct fs_context *new_fc;
-       int ret;
-
-       cgroup_fs = get_fs_type("cgroup");
-       if (!cgroup_fs)
-               return -ENODEV;
-
-       new_fc = fs_context_for_mount(cgroup_fs, fc->sb_flags);
-       if (IS_ERR(new_fc)) {
-               ret = PTR_ERR(new_fc);
-       } else {
-               static const char agent_path[] = "/sbin/cpuset_release_agent";
-               ret = vfs_parse_fs_string(new_fc, "cpuset", NULL, 0);
-               if (!ret)
-                       ret = vfs_parse_fs_string(new_fc, "noprefix", NULL, 0);
-               if (!ret)
-                       ret = vfs_parse_fs_string(new_fc, "release_agent",
-                                       agent_path, sizeof(agent_path) - 1);
-               if (!ret)
-                       ret = vfs_get_tree(new_fc);
-               if (!ret) {     /* steal the result */
-                       fc->root = new_fc->root;
-                       new_fc->root = NULL;
-               }
-               put_fs_context(new_fc);
-       }
-       put_filesystem(cgroup_fs);
-       return ret;
-}
-
-static const struct fs_context_operations cpuset_fs_context_ops = {
-       .get_tree       = cpuset_get_tree,
-};
-
-static int cpuset_init_fs_context(struct fs_context *fc)
-{
-       fc->ops = &cpuset_fs_context_ops;
-       return 0;
-}
-
-static struct file_system_type cpuset_fs_type = {
-       .name                   = "cpuset",
-       .init_fs_context        = cpuset_init_fs_context,
-};
-
 /*
  * Return in pmask the portion of a cpusets's cpus_allowed that
  * are online.  If none are online, walk up the cpuset hierarchy
@@ -2853,13 +2800,11 @@ struct cgroup_subsys cpuset_cgrp_subsys = {
 /**
  * cpuset_init - initialize cpusets at system boot
  *
- * Description: Initialize top_cpuset and the cpuset internal file system,
+ * Description: Initialize top_cpuset
  **/
 
 int __init cpuset_init(void)
 {
-       int err = 0;
-
        BUG_ON(!alloc_cpumask_var(&top_cpuset.cpus_allowed, GFP_KERNEL));
        BUG_ON(!alloc_cpumask_var(&top_cpuset.effective_cpus, GFP_KERNEL));
        BUG_ON(!zalloc_cpumask_var(&top_cpuset.subparts_cpus, GFP_KERNEL));
@@ -2873,10 +2818,6 @@ int __init cpuset_init(void)
        set_bit(CS_SCHED_LOAD_BALANCE, &top_cpuset.flags);
        top_cpuset.relax_domain_level = -1;
 
-       err = register_filesystem(&cpuset_fs_type);
-       if (err < 0)
-               return err;
-
        BUG_ON(!alloc_cpumask_var(&cpus_attach, GFP_KERNEL));
 
        return 0;