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

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

cgroup2: switch to option-by-option parsing



[again, carved out of patch by dhowells]
[NB: we probably want to handle "source" in parse_param here]

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 8d2451f4
Loading
Loading
Loading
Loading
+33 −29
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@
#include <linux/proc_ns.h>
#include <linux/nsproxy.h>
#include <linux/file.h>
#include <linux/fs_parser.h>
#include <linux/sched/cputime.h>
#include <linux/psi.h>
#include <net/sock.h>
@@ -1772,27 +1773,38 @@ int cgroup_show_path(struct seq_file *sf, struct kernfs_node *kf_node,
	return len;
}

static int parse_cgroup_root_flags(char *data, unsigned int *root_flags)
{
	char *token;
enum cgroup2_param {
	Opt_nsdelegate,
	nr__cgroup2_params
};

	*root_flags = 0;
static const struct fs_parameter_spec cgroup2_param_specs[] = {
	fsparam_flag  ("nsdelegate",		Opt_nsdelegate),
	{}
};

	if (!data || *data == '\0')
		return 0;
static const struct fs_parameter_description cgroup2_fs_parameters = {
	.name		= "cgroup2",
	.specs		= cgroup2_param_specs,
};

	while ((token = strsep(&data, ",")) != NULL) {
		if (!strcmp(token, "nsdelegate")) {
			*root_flags |= CGRP_ROOT_NS_DELEGATE;
			continue;
		}
static int cgroup2_parse_param(struct fs_context *fc, struct fs_parameter *param)
{
	struct cgroup_fs_context *ctx = cgroup_fc2context(fc);
	struct fs_parse_result result;
	int opt;

		pr_err("cgroup2: unknown option \"%s\"\n", token);
		return -EINVAL;
	}
	opt = fs_parse(fc, &cgroup2_fs_parameters, param, &result);
	if (opt < 0)
		return opt;

	switch (opt) {
	case Opt_nsdelegate:
		ctx->flags |= CGRP_ROOT_NS_DELEGATE;
		return 0;
	}
	return -EINVAL;
}

static void apply_cgroup_root_flags(unsigned int root_flags)
{
@@ -2074,15 +2086,6 @@ static void cgroup_fs_context_free(struct fs_context *fc)
	kfree(ctx);
}

static int cgroup_parse_monolithic(struct fs_context *fc, void *data)
{
	struct cgroup_fs_context *ctx = cgroup_fc2context(fc);

	if (data)
		security_sb_eat_lsm_opts(data, &fc->security);
	return parse_cgroup_root_flags(data, &ctx->flags);
}

static int cgroup_get_tree(struct fs_context *fc)
{
	struct cgroup_namespace *ns = current->nsproxy->cgroup_ns;
@@ -2108,7 +2111,7 @@ static int cgroup_get_tree(struct fs_context *fc)

static const struct fs_context_operations cgroup_fs_context_ops = {
	.free		= cgroup_fs_context_free,
	.parse_monolithic = cgroup_parse_monolithic,
	.parse_param	= cgroup2_parse_param,
	.get_tree	= cgroup_get_tree,
	.reconfigure	= cgroup_reconfigure,
};
@@ -2176,6 +2179,7 @@ struct file_system_type cgroup_fs_type = {
static struct file_system_type cgroup2_fs_type = {
	.name			= "cgroup2",
	.init_fs_context	= cgroup_init_fs_context,
	.parameters		= &cgroup2_fs_parameters,
	.kill_sb		= cgroup_kill_sb,
	.fs_flags		= FS_USERNS_MOUNT,
};