cpuset: move mount -t cpuset logics into cgroup.c
... 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>
This commit is contained in:
parent
46cf047a94
commit
d5f68d330c
|
@ -2225,6 +2225,50 @@ static struct file_system_type cgroup2_fs_type = {
|
||||||
.fs_flags = FS_USERNS_MOUNT,
|
.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,
|
int cgroup_path_ns_locked(struct cgroup *cgrp, char *buf, size_t buflen,
|
||||||
struct cgroup_namespace *ns)
|
struct cgroup_namespace *ns)
|
||||||
{
|
{
|
||||||
|
@ -5710,6 +5754,9 @@ int __init cgroup_init(void)
|
||||||
WARN_ON(register_filesystem(&cgroup_fs_type));
|
WARN_ON(register_filesystem(&cgroup_fs_type));
|
||||||
WARN_ON(register_filesystem(&cgroup2_fs_type));
|
WARN_ON(register_filesystem(&cgroup2_fs_type));
|
||||||
WARN_ON(!proc_create_single("cgroups", 0, NULL, proc_cgroupstats_show));
|
WARN_ON(!proc_create_single("cgroups", 0, NULL, proc_cgroupstats_show));
|
||||||
|
#ifdef CONFIG_CPUSETS
|
||||||
|
WARN_ON(register_filesystem(&cpuset_fs_type));
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -355,59 +355,6 @@ static inline bool is_in_v2_mode(void)
|
||||||
(cpuset_cgrp_subsys.root->flags & CGRP_ROOT_CPUSET_V2_MODE);
|
(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
|
* Return in pmask the portion of a cpusets's cpus_allowed that
|
||||||
* are online. If none are online, walk up the cpuset hierarchy
|
* 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
|
* 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 __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.cpus_allowed, GFP_KERNEL));
|
||||||
BUG_ON(!alloc_cpumask_var(&top_cpuset.effective_cpus, GFP_KERNEL));
|
BUG_ON(!alloc_cpumask_var(&top_cpuset.effective_cpus, GFP_KERNEL));
|
||||||
BUG_ON(!zalloc_cpumask_var(&top_cpuset.subparts_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);
|
set_bit(CS_SCHED_LOAD_BALANCE, &top_cpuset.flags);
|
||||||
top_cpuset.relax_domain_level = -1;
|
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));
|
BUG_ON(!alloc_cpumask_var(&cpus_attach, GFP_KERNEL));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue