Commit 3e281113 authored by Eric Sandeen's avatar Eric Sandeen Committed by Dominique Martinet
Browse files

9p: fix new mount API cache option handling



After commit 4eb31178, 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: default avatarEric Sandeen <sandeen@redhat.com>
Message-ID: <48cdeec9-5bb9-4c7a-a203-39bb8e0ef443@redhat.com>
Tested-by: default avatarRemi Pommarel <repk@triplefau.lt>
Signed-off-by: default avatarDominique Martinet <asmadeus@codewreck.org>
parent f0445613
Loading
Loading
Loading
Loading
+32 −12
Original line number Diff line number Diff line
@@ -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;