]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/shmem: refactor to reuse vfs_parse_monolithic_sep for option parsing
authorGuo Weikang <guoweikang.kernel@gmail.com>
Thu, 5 Dec 2024 09:45:21 +0000 (17:45 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 14 Jan 2025 06:40:49 +0000 (22:40 -0800)
shmem_parse_options() is refactored to use vfs_parse_monolithic_sep() with
a custom separator function, shmem_next_opt().  This eliminates redundant
logic for parsing comma-separated options and ensures consistency with
other kernel code that uses the same interface.

The vfs_parse_monolithic_sep() helper was introduced in commit
e001d1447cd4 ("fs: factor out vfs_parse_monolithic_sep() helper").

Link: https://lkml.kernel.org/r/20241205094521.1244678-1-guoweikang.kernel@gmail.com
Signed-off-by: Guo Weikang <guoweikang.kernel@gmail.com>
Cc: Amir Goldstein <amir73il@gmail.com>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/shmem.c

index 80af54b0b5279609ffa3493e6e65e2699ad8a7fc..0892889744a2dc3d427e20aaa45c25a56f2d01b5 100644 (file)
@@ -4647,48 +4647,37 @@ bad_value:
        return invalfc(fc, "Bad value for '%s'", param->key);
 }
 
-static int shmem_parse_options(struct fs_context *fc, void *data)
+static char *shmem_next_opt(char **s)
 {
-       char *options = data;
+       char *sbegin = *s;
+       char *p;
 
-       if (options) {
-               int err = security_sb_eat_lsm_opts(options, &fc->security);
-               if (err)
-                       return err;
-       }
+       if (sbegin == NULL)
+               return NULL;
 
-       while (options != NULL) {
-               char *this_char = options;
-               for (;;) {
-                       /*
-                        * NUL-terminate this option: unfortunately,
-                        * mount options form a comma-separated list,
-                        * but mpol's nodelist may also contain commas.
-                        */
-                       options = strchr(options, ',');
-                       if (options == NULL)
-                               break;
-                       options++;
-                       if (!isdigit(*options)) {
-                               options[-1] = '\0';
-                               break;
-                       }
-               }
-               if (*this_char) {
-                       char *value = strchr(this_char, '=');
-                       size_t len = 0;
-                       int err;
-
-                       if (value) {
-                               *value++ = '\0';
-                               len = strlen(value);
-                       }
-                       err = vfs_parse_fs_string(fc, this_char, value, len);
-                       if (err < 0)
-                               return err;
+       /*
+        * NUL-terminate this option: unfortunately,
+        * mount options form a comma-separated list,
+        * but mpol's nodelist may also contain commas.
+        */
+       for (;;) {
+               p = strchr(*s, ',');
+               if (p == NULL)
+                       break;
+               *s = p + 1;
+               if (!isdigit(*(p+1))) {
+                       *p = '\0';
+                       return sbegin;
                }
        }
-       return 0;
+
+       *s = NULL;
+       return sbegin;
+}
+
+static int shmem_parse_monolithic(struct fs_context *fc, void *data)
+{
+       return vfs_parse_monolithic_sep(fc, data, shmem_next_opt);
 }
 
 /*
@@ -5038,7 +5027,7 @@ static const struct fs_context_operations shmem_fs_context_ops = {
        .free                   = shmem_free_fc,
        .get_tree               = shmem_get_tree,
 #ifdef CONFIG_TMPFS
-       .parse_monolithic       = shmem_parse_options,
+       .parse_monolithic       = shmem_parse_monolithic,
        .parse_param            = shmem_parse_one,
        .reconfigure            = shmem_reconfigure,
 #endif