Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5f68d33 authored by Al Viro's avatar Al Viro
Browse files

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 46cf047a
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -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;
}
+1 −60
Original line number Diff line number Diff line
@@ -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;