Commit 34264ae3 authored by Al Viro's avatar Al Viro
Browse files

don't bother with explicit length argument for __lookup_constant()



Have the arrays of constant_table self-terminated (by NULL ->name
in the final entry).  Simplifies lookup_constant() and allows to
reuse the search for enum params as well.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 5eede625
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ static const struct constant_table common_set_sb_flag[] = {
	{ "posixacl",	SB_POSIXACL },
	{ "ro",		SB_RDONLY },
	{ "sync",	SB_SYNCHRONOUS },
	{ },
};

static const struct constant_table common_clear_sb_flag[] = {
@@ -53,6 +54,7 @@ static const struct constant_table common_clear_sb_flag[] = {
	{ "nomand",	SB_MANDLOCK },
	{ "rw",		SB_RDONLY },
	{ "silent",	SB_SILENT },
	{ },
};

static const char *const forbidden_sb_flag[] = {
+18 −15
Original line number Diff line number Diff line
@@ -20,27 +20,31 @@ static const struct constant_table bool_names[] = {
	{ "no",		false },
	{ "true",	true },
	{ "yes",	true },
	{ },
};

static const struct constant_table *
__lookup_constant(const struct constant_table *tbl, const char *name)
{
	for ( ; tbl->name; tbl++)
		if (strcmp(name, tbl->name) == 0)
			return tbl;
	return NULL;
}

/**
 * lookup_constant - Look up a constant by name in an ordered table
 * @tbl: The table of constants to search.
 * @tbl_size: The size of the table.
 * @name: The name to look up.
 * @not_found: The value to return if the name is not found.
 */
int __lookup_constant(const struct constant_table *tbl, size_t tbl_size,
		      const char *name, int not_found)
int lookup_constant(const struct constant_table *tbl, const char *name, int not_found)
{
	unsigned int i;

	for (i = 0; i < tbl_size; i++)
		if (strcmp(name, tbl[i].name) == 0)
			return tbl[i].value;
	const struct constant_table *p = __lookup_constant(tbl, name);

	return not_found;
	return p ? p->value : not_found;
}
EXPORT_SYMBOL(__lookup_constant);
EXPORT_SYMBOL(lookup_constant);

static const struct fs_parameter_spec *fs_lookup_key(
	const struct fs_parameter_description *desc,
@@ -189,12 +193,11 @@ int fs_parse(struct fs_context *fc,
		goto maybe_okay;

	case fs_param_is_enum:
		for (e = p->data; e->name; e++) {
			if (strcmp(e->name, param->string) == 0) {
		e = __lookup_constant(p->data, param->string);
		if (e) {
			result->uint_32 = e->value;
			goto okay;
		}
		}
		goto bad_value;

	case fs_param_is_string:
+1 −3
Original line number Diff line number Diff line
@@ -83,9 +83,7 @@ extern int fs_lookup_param(struct fs_context *fc,
			   bool want_bdev,
			   struct path *_path);

extern int __lookup_constant(const struct constant_table tbl[], size_t tbl_size,
			     const char *name, int not_found);
#define lookup_constant(t, n, nf) __lookup_constant(t, ARRAY_SIZE(t), (n), (nf))
extern int lookup_constant(const struct constant_table tbl[], const char *name, int not_found);

#ifdef CONFIG_VALIDATE_FS_PARSER
extern bool validate_constant_table(const struct constant_table *tbl, size_t tbl_size,