don't bother with explicit length argument for __lookup_constant()
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 16 Dec 2019 18:45:41 +0000 (13:45 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 7 Feb 2020 19:47:52 +0000 (14:47 -0500)
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>
fs/fs_context.c
fs/fs_parser.c
include/linux/fs_parser.h

index 9097421..ea97a24 100644 (file)
@@ -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[] = {
index d032ac4..065ce6c 100644 (file)
@@ -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;
 
index 5c91a0a..14bdaac 100644 (file)
@@ -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,