From: Remi Pommarel <repk@triplefau.lt>
To: Dominique Martinet <asmadeus@codewreck.org>
Cc: Eric Sandeen <sandeen@redhat.com>,
v9fs@lists.linux.dev, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, ericvh@kernel.org,
lucho@ionkov.net, linux_oss@crudebyte.com, eadavis@qq.com
Subject: Re: [PATCH V3 4/4] 9p: convert to the new mount API
Date: Wed, 26 Nov 2025 21:16:14 +0100 [thread overview]
Message-ID: <aSdgDkbVe5xAT291@pilgrim> (raw)
In-Reply-To: <aOzT2-e8_p92WfP-@codewreck.org>
Hi Eric, Dominique,
On Mon, Oct 13, 2025 at 07:26:35PM +0900, Dominique Martinet wrote:
> Hi Eric,
>
> Thanks for this V3!
>
> I find it much cleaner, hopefully will be easier to debug :)
> ... Which turned out to be needed right away, trying with qemu's 9p
> export "mount -t 9p -o trans=virtio tmp /mnt" apparently calls
> p9_virtio_create() with fc->source == NULL, instead of the expected
> "tmp" string
> (FWIW I tried '-o trans=tcp 127.0.0.1' and I got the same problem in
> p9_fd_create_tcp(), might be easier to test with diod if that's what you
> used)
>
> Looking at other filesystems (e.g. fs/nfs/fs_context.c but others are
> the same) it looks like they all define a fsparam_string "source" option
> explicitly?...
>
> Something like this looks like it works to do (+ probably make the error
> more verbose? nothing in dmesg hints at why mount returns EINVAL...)
> -----
> diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
> index 6c07635f5776..999d54a0c7d9 100644
> --- a/fs/9p/v9fs.c
> +++ b/fs/9p/v9fs.c
> @@ -34,6 +34,8 @@ struct kmem_cache *v9fs_inode_cache;
> */
>
> enum {
> + /* Mount-point source */
> + Opt_source,
> /* Options that take integer arguments */
> Opt_debug, Opt_dfltuid, Opt_dfltgid, Opt_afid,
> /* String options */
> @@ -82,6 +84,7 @@ static const struct constant_table p9_cache_mode[] = {
> * the client, and all the transports.
> */
> const struct fs_parameter_spec v9fs_param_spec[] = {
> + fsparam_string ("source", Opt_source),
> fsparam_u32hex ("debug", Opt_debug),
> fsparam_uid ("dfltuid", Opt_dfltuid),
> fsparam_gid ("dfltgid", Opt_dfltgid),
> @@ -210,6 +213,14 @@ int v9fs_parse_param(struct fs_context *fc, struct fs_parameter *param)
> }
>
> switch (opt) {
> + case Opt_source:
> + if (fc->source) {
> + pr_info("p9: multiple sources not supported\n");
> + return -EINVAL;
> + }
> + fc->source = param->string;
> + param->string = NULL;
> + break;
> case Opt_debug:
> session_opts->debug = result.uint_32;
> #ifdef CONFIG_NET_9P_DEBUG
> -----
While testing this series to mount a QEMU's 9p directory with
trans=virtio, I encountered a few issues. The same fix as above was
necessary, but further regressions were also observed.
Previously, using msize=2048k would silently fail to parse the option,
but the mount would still proceed. With this series, the parsing error
now prevents the mount entirely. While I prefer the new behavior, I know
there is a strict rule to not break userspace, so are we not breaking
userspace here?
Another more important issue is that I was not able to successfully
mount a 9p as rootfs with the command line below:
'root=/dev/root rw rootfstype=9p rootflags=trans=virtio,cache=loose'
The issue arises because init systems typically remount root as
read-only (mount -oremount,ro /). This process retrieves the current
mount options via v9fs_show_options(), then attempts to remount with
those options plus ro. However, v9fs_show_options() formats the cache
option as an integer but v9fs_parse_param() expect cache option to be
a string (fsparam_enum) causing remount to fail. The patch below fix the
issue for the cache option, but pretty sure all fsparam_enum options
should be fixed.
----
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
index a58abe69ec7a..e4e8304e5934 100644
--- a/fs/9p/v9fs.c
+++ b/fs/9p/v9fs.c
@@ -120,6 +120,21 @@ const struct fs_parameter_spec v9fs_param_spec[] = {
{}
};
+static char const *p9_cache_to_str(enum p9_cache_shortcuts sc)
+{
+ char const *cache = "none";
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(p9_cache_mode); ++i) {
+ if (p9_cache_mode[i].value == sc) {
+ cache = p9_cache_mode[i].name;
+ break;
+ }
+ }
+
+ return cache;
+}
+
/*
* Display the mount options in /proc/mounts.
*/
@@ -144,7 +159,7 @@ int v9fs_show_options(struct seq_file *m, struct dentry *root)
if (v9ses->nodev)
seq_puts(m, ",nodevmap");
if (v9ses->cache)
- seq_printf(m, ",cache=%x", v9ses->cache);
+ seq_printf(m, ",cache=%s", p9_cache_to_str(v9ses->cache));
#ifdef CONFIG_9P_FSCACHE
if (v9ses->cachetag && (v9ses->cache & CACHE_FSCACHE))
seq_printf(m, ",cachetag=%s", v9ses->cachetag);
----
However same question as above arise with this patch. Previously cat
/proc/mounts would format cache as an hexadecimal value while now it is
the enum value name string. Would this be considered userspace
breakage?
Thanks,
--
Remi
next prev parent reply other threads:[~2025-11-26 21:55 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-10 21:36 [PATCH V3 0/4] 9p: Convert to the new mount API Eric Sandeen
2025-10-10 21:36 ` [PATCH V3 1/4] fs/fs_parse: add back fsparam_u32hex Eric Sandeen
2025-10-10 21:36 ` [PATCH V3 2/4] net/9p: move structures and macros to header files Eric Sandeen
2025-10-10 21:36 ` [PATCH V3 3/4] 9p: create a v9fs_context structure to hold parsed options Eric Sandeen
2025-10-10 21:36 ` [PATCH V3 4/4] 9p: convert to the new mount API Eric Sandeen
2025-10-13 10:26 ` Dominique Martinet
2025-10-13 18:46 ` Eric Sandeen
2025-10-13 19:04 ` Dominique Martinet
2025-11-26 20:16 ` Remi Pommarel [this message]
2025-11-26 22:43 ` Dominique Martinet
2025-12-01 22:36 ` Eric Sandeen
2025-12-02 1:04 ` Dominique Martinet
2025-12-02 22:12 ` Eric Sandeen
2025-12-03 15:13 ` Dominique Martinet
2025-12-03 16:23 ` Eric Sandeen
2025-12-05 11:53 ` Remi Pommarel
2025-12-05 12:56 ` Dominique Martinet
2025-12-02 22:30 ` [PATCH V3 5/4] 9p: fix cache option printing in v9fs_show_options Eric Sandeen
2025-12-02 23:13 ` Al Viro
2025-12-03 1:09 ` Eric Sandeen
2025-12-03 15:04 ` Dominique Martinet
2025-12-03 18:04 ` Al Viro
2025-12-02 22:34 ` [PATCH V3 6/4] 9p: fix new mount API cache option handling Eric Sandeen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aSdgDkbVe5xAT291@pilgrim \
--to=repk@triplefau.lt \
--cc=asmadeus@codewreck.org \
--cc=eadavis@qq.com \
--cc=ericvh@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux_oss@crudebyte.com \
--cc=lucho@ionkov.net \
--cc=sandeen@redhat.com \
--cc=v9fs@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.