summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2019-12-16 21:45:41 +0300
committerAl Viro <viro@zeniv.linux.org.uk>2020-02-07 22:47:52 +0300
commit34264ae3fa22429ec4fd9151602342d1f21486eb (patch)
tree687392b53b9d246d3ec1193abcade23ad85186b5
parent5eede625297f4d21dc12ea7a7418fd21672f131d (diff)
downloadlinux-34264ae3fa22429ec4fd9151602342d1f21486eb.tar.xz
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: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/fs_context.c2
-rw-r--r--fs/fs_parser.c33
-rw-r--r--include/linux/fs_parser.h4
3 files changed, 21 insertions, 18 deletions
diff --git a/fs/fs_context.c b/fs/fs_context.c
index 9097421cbba5..ea97a2411e83 100644
--- a/fs/fs_context.c
+++ b/fs/fs_context.c
@@ -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[] = {
diff --git a/fs/fs_parser.c b/fs/fs_parser.c
index d032ac4a758d..065ce6c22587 100644
--- a/fs/fs_parser.c
+++ b/fs/fs_parser.c
@@ -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;
+ const struct constant_table *p = __lookup_constant(tbl, name);
- for (i = 0; i < tbl_size; i++)
- if (strcmp(name, tbl[i].name) == 0)
- return tbl[i].value;
-
- 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,11 +193,10 @@ 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) {
- result->uint_32 = e->value;
- goto okay;
- }
+ e = __lookup_constant(p->data, param->string);
+ if (e) {
+ result->uint_32 = e->value;
+ goto okay;
}
goto bad_value;
diff --git a/include/linux/fs_parser.h b/include/linux/fs_parser.h
index 5c91a0ac4446..14bdaacf1218 100644
--- a/include/linux/fs_parser.h
+++ b/include/linux/fs_parser.h
@@ -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,