diff options
Diffstat (limited to 'drivers/md/dm-verity-target.c')
| -rw-r--r-- | drivers/md/dm-verity-target.c | 42 | 
1 files changed, 30 insertions, 12 deletions
| diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 6b8e5bdd8526..d3e76aefc1a6 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -34,7 +34,7 @@  #define DM_VERITY_OPT_IGN_ZEROES	"ignore_zero_blocks"  #define DM_VERITY_OPT_AT_MOST_ONCE	"check_at_most_once" -#define DM_VERITY_OPTS_MAX		(2 + DM_VERITY_OPTS_FEC + \ +#define DM_VERITY_OPTS_MAX		(3 + DM_VERITY_OPTS_FEC + \  					 DM_VERITY_ROOT_HASH_VERIFICATION_OPTS)  static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE; @@ -893,6 +893,28 @@ out:  	return r;  } +static inline bool verity_is_verity_mode(const char *arg_name) +{ +	return (!strcasecmp(arg_name, DM_VERITY_OPT_LOGGING) || +		!strcasecmp(arg_name, DM_VERITY_OPT_RESTART) || +		!strcasecmp(arg_name, DM_VERITY_OPT_PANIC)); +} + +static int verity_parse_verity_mode(struct dm_verity *v, const char *arg_name) +{ +	if (v->mode) +		return -EINVAL; + +	if (!strcasecmp(arg_name, DM_VERITY_OPT_LOGGING)) +		v->mode = DM_VERITY_MODE_LOGGING; +	else if (!strcasecmp(arg_name, DM_VERITY_OPT_RESTART)) +		v->mode = DM_VERITY_MODE_RESTART; +	else if (!strcasecmp(arg_name, DM_VERITY_OPT_PANIC)) +		v->mode = DM_VERITY_MODE_PANIC; + +	return 0; +} +  static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v,  				 struct dm_verity_sig_opts *verify_args)  { @@ -916,16 +938,12 @@ static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v,  		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; - -		} else if (!strcasecmp(arg_name, DM_VERITY_OPT_PANIC)) { -			v->mode = DM_VERITY_MODE_PANIC; +		if (verity_is_verity_mode(arg_name)) { +			r = verity_parse_verity_mode(v, arg_name); +			if (r) { +				ti->error = "Conflicting error handling parameters"; +				return r; +			}  			continue;  		} else if (!strcasecmp(arg_name, DM_VERITY_OPT_IGN_ZEROES)) { @@ -1242,7 +1260,7 @@ bad:  static struct target_type verity_target = {  	.name		= "verity", -	.version	= {1, 7, 0}, +	.version	= {1, 8, 0},  	.module		= THIS_MODULE,  	.ctr		= verity_ctr,  	.dtr		= verity_dtr, | 
