]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
9p: fix new mount API cache option handling
authorEric Sandeen <sandeen@redhat.com>
Tue, 2 Dec 2025 22:34:51 +0000 (16:34 -0600)
committerDominique Martinet <asmadeus@codewreck.org>
Fri, 5 Dec 2025 12:54:05 +0000 (12:54 +0000)
After commit 4eb3117888a92, 9p needs to be able to accept numerical
cache= mount options as well as the string "shortcuts" because the option
is printed numerically in /proc/mounts rather than by string. This was
missed in the mount API conversion, which used an enum for the shortcuts
and therefore could not handle a numeric equivalent as an argument
to the cache option.

Fix this by removing the enum and reverting to the slightly more
open-coded option handling for Opt_cache, with the reinstated
get_cache_mode() helper.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Message-ID: <48cdeec9-5bb9-4c7a-a203-39bb8e0ef443@redhat.com>
Tested-by: Remi Pommarel <repk@triplefau.lt>
Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
fs/9p/v9fs.c

index 2f5c5f3123b73d502c838c52a13dc58fd5a97595..057487efaaeb2d59fbf4edbf9756b5beaa3c1fb5 100644 (file)
@@ -72,15 +72,6 @@ static const struct constant_table p9_versions[] = {
        {}
 };
 
-static const struct constant_table p9_cache_mode[] = {
-       { "loose",      CACHE_SC_LOOSE },
-       { "fscache",    CACHE_SC_FSCACHE },
-       { "mmap",       CACHE_SC_MMAP },
-       { "readahead",  CACHE_SC_READAHEAD },
-       { "none",       CACHE_SC_NONE },
-       {}
-};
-
 /*
  * This structure contains all parameters used for the core code,
  * the client, and all the transports.
@@ -97,7 +88,7 @@ const struct fs_parameter_spec v9fs_param_spec[] = {
        fsparam_flag    ("noxattr",     Opt_noxattr),
        fsparam_flag    ("directio",    Opt_directio),
        fsparam_flag    ("ignoreqv",    Opt_ignoreqv),
-       fsparam_enum    ("cache",       Opt_cache, p9_cache_mode),
+       fsparam_string  ("cache",       Opt_cache),
        fsparam_string  ("cachetag",    Opt_cachetag),
        fsparam_string  ("access",      Opt_access),
        fsparam_flag    ("posixacl",    Opt_posixacl),
@@ -124,6 +115,33 @@ const struct fs_parameter_spec v9fs_param_spec[] = {
        {}
 };
 
+/* Interpret mount options for cache mode */
+static int get_cache_mode(char *s)
+{
+       int version = -EINVAL;
+
+       if (!strcmp(s, "loose")) {
+               version = CACHE_SC_LOOSE;
+               p9_debug(P9_DEBUG_9P, "Cache mode: loose\n");
+       } else if (!strcmp(s, "fscache")) {
+               version = CACHE_SC_FSCACHE;
+               p9_debug(P9_DEBUG_9P, "Cache mode: fscache\n");
+       } else if (!strcmp(s, "mmap")) {
+               version = CACHE_SC_MMAP;
+               p9_debug(P9_DEBUG_9P, "Cache mode: mmap\n");
+       } else if (!strcmp(s, "readahead")) {
+               version = CACHE_SC_READAHEAD;
+               p9_debug(P9_DEBUG_9P, "Cache mode: readahead\n");
+       } else if (!strcmp(s, "none")) {
+               version = CACHE_SC_NONE;
+               p9_debug(P9_DEBUG_9P, "Cache mode: none\n");
+       } else if (kstrtoint(s, 0, &version) != 0) {
+               version = -EINVAL;
+               pr_info("Unknown Cache mode or invalid value %s\n", s);
+       }
+       return version;
+}
+
 /*
  * Display the mount options in /proc/mounts.
  */
@@ -269,8 +287,10 @@ int v9fs_parse_param(struct fs_context *fc, struct fs_parameter *param)
 #endif
                break;
        case Opt_cache:
-               session_opts->cache = result.uint_32;
-               p9_debug(P9_DEBUG_9P, "Cache mode: %s\n", param->string);
+               r = get_cache_mode(param->string);
+               if (r < 0)
+                       return r;
+               session_opts->cache = r;
                break;
        case Opt_access:
                s = param->string;