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

Commit 0190e477 authored by Sami Tolvanen's avatar Sami Tolvanen Committed by Gerrit - the friendly Code Review server
Browse files

UPSTREAM: dm verity: separate function for parsing opt args



(cherry-picked from 753c1fd02807cb43a1c5d01d75d454054d46bdad)

Move optional argument parsing into a separate function to make it
easier to add more of them without making verity_ctr even longer.

Bug: 21893453

Change-Id: I754603a026d8fa305c9b2e3b2b9dd4b3a95014b1
Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Git-commit: 32df92db
Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git


Signed-off-by: default avatarImran Khan <kimran@codeaurora.org>
parent c0d10bb4
Loading
Loading
Loading
Loading
+43 −28
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@
#define DM_VERITY_OPT_LOGGING		"ignore_corruption"
#define DM_VERITY_OPT_RESTART		"restart_on_corruption"

#define DM_VERITY_OPTS_MAX		1

static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE;

module_param_named(prefetch_cluster, dm_verity_prefetch_cluster, uint, S_IRUGO | S_IWUSR);
@@ -739,6 +741,44 @@ static void verity_dtr(struct dm_target *ti)
	kfree(v);
}

static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v)
{
	int r;
	unsigned argc;
	struct dm_target *ti = v->ti;
	const char *arg_name;

	static struct dm_arg _args[] = {
		{0, DM_VERITY_OPTS_MAX, "Invalid number of feature args"},
	};

	r = dm_read_arg_group(_args, as, &argc, &ti->error);
	if (r)
		return -EINVAL;

	if (!argc)
		return 0;

	do {
		arg_name = dm_shift_arg(as);
		argc--;

		if (!strcasecmp(arg_name, DM_VERITY_OPT_LOGGING)) {
			v->mode = DM_VERITY_MODE_LOGGING;
			continue;

		} else if (!strcasecmp(arg_name, DM_VERITY_OPT_RESTART)) {
			v->mode = DM_VERITY_MODE_RESTART;
			continue;
		}

		ti->error = "Unrecognized verity feature request";
		return -EINVAL;
	} while (argc && !r);

	return r;
}

/*
 * Target parameters:
 *	<version>	The current format is version 1.
@@ -757,18 +797,13 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
{
	struct dm_verity *v;
	struct dm_arg_set as;
	const char *opt_string;
	unsigned int num, opt_params;
	unsigned int num;
	unsigned long long num_ll;
	int r;
	int i;
	sector_t hash_position;
	char dummy;

	static struct dm_arg _args[] = {
		{0, 1, "Invalid number of feature args"},
	};

	v = kzalloc(sizeof(struct dm_verity), GFP_KERNEL);
	if (!v) {
		ti->error = "Cannot allocate verity structure";
@@ -913,30 +948,10 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
		as.argc = argc;
		as.argv = argv;

		r = dm_read_arg_group(_args, &as, &opt_params, &ti->error);
		if (r)
			goto bad;

		while (opt_params) {
			opt_params--;
			opt_string = dm_shift_arg(&as);
			if (!opt_string) {
				ti->error = "Not enough feature arguments";
				r = -EINVAL;
				goto bad;
			}

			if (!strcasecmp(opt_string, DM_VERITY_OPT_LOGGING))
				v->mode = DM_VERITY_MODE_LOGGING;
			else if (!strcasecmp(opt_string, DM_VERITY_OPT_RESTART))
				v->mode = DM_VERITY_MODE_RESTART;
			else {
				ti->error = "Invalid feature arguments";
				r = -EINVAL;
		r = verity_parse_opt_args(&as, v);
		if (r < 0)
			goto bad;
	}
		}
	}

	v->hash_per_block_bits =
		__fls((1 << v->hash_dev_block_bits) / v->digest_size);