2021-05-08 00:00:33

by Changbin Du

[permalink] [raw]
Subject: [PATCH v2 0/3] 9p: add support for root file systems

Just like cifs and nfs, this short series enables rootfs support for 9p.
Bellow is an example which mounts v9fs with tag 'r' as rootfs in qemu
guest via virtio transport.

$ qemu-system-x86_64 -enable-kvm -cpu host -m 1024 \
-virtfs local,path=$rootfs_dir,mount_tag=r,security_model=passthrough,id=r \
-kernel /path/to/linux/arch/x86/boot/bzImage -nographic \
-append "root=/dev/v9fs v9fsroot=r,trans=virtio rw console=ttyS0 3"

v2:
o use pr_err instead of printk.
o ROOT_DEV is only set after checking.
o cleanup DEFAULT_MNT_OPTS.
o do not retry mount for fd and virtio transport.

Changbin Du (3):
9p: add support for root file systems
9p: doc: move to a new dedicated folder
9p: doc: add v9fsroot description

Documentation/filesystems/index.rst | 2 +-
Documentation/filesystems/{ => v9fs}/9p.rst | 0
Documentation/filesystems/v9fs/index.rst | 12 ++++
Documentation/filesystems/v9fs/v9fsroot.rst | 52 +++++++++++++++++
MAINTAINERS | 8 ++-
fs/9p/Kconfig | 6 ++
fs/9p/Makefile | 1 +
fs/9p/v9fsroot.c | 64 +++++++++++++++++++++
include/linux/root_dev.h | 1 +
init/do_mounts.c | 54 +++++++++++++++++
10 files changed, 198 insertions(+), 2 deletions(-)
rename Documentation/filesystems/{ => v9fs}/9p.rst (100%)
create mode 100644 Documentation/filesystems/v9fs/index.rst
create mode 100644 Documentation/filesystems/v9fs/v9fsroot.rst
create mode 100644 fs/9p/v9fsroot.c

--
2.30.2


2021-05-08 00:01:09

by Changbin Du

[permalink] [raw]
Subject: [PATCH v2 1/3] 9p: add support for root file systems

This introduces a new kernel command-line option called 'v9fsroot='
which will tell the kernel to mount the root file system by
utilizing the 9p protocol.

This allows us to mount host folder as rootfs for guest linux in qemu.
Bellow is an example which mounts v9fs with tag 'r' as rootfs in qemu
guest via virtio transport.

$ qemu-system-x86_64 -enable-kvm -cpu host -m 1024 \
-virtfs local,path=$rootfs_dir,mount_tag=r,security_model=passthrough,id=r \
-kernel /path/to/linux/arch/x86/boot/bzImage -nographic \
-append "root=/dev/v9fs v9fsroot=r,trans=virtio rw console=ttyS0 3"

Signed-off-by: Changbin Du <[email protected]>

---
v2:
o use pr_err instead of printk.
o ROOT_DEV is only set after checking.
o cleanup DEFAULT_MNT_OPTS.
o do not retry mount for fd and virtio transport.
---
MAINTAINERS | 5 ++++
fs/9p/Kconfig | 6 ++++
fs/9p/Makefile | 1 +
fs/9p/v9fsroot.c | 64 ++++++++++++++++++++++++++++++++++++++++
include/linux/root_dev.h | 1 +
init/do_mounts.c | 54 +++++++++++++++++++++++++++++++++
6 files changed, 131 insertions(+)
create mode 100644 fs/9p/v9fsroot.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 65d200e6e68b..c9f9c89bad13 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -239,6 +239,11 @@ F: include/trace/events/9p.h
F: include/uapi/linux/virtio_9p.h
F: net/9p/

+9P FILE SYSTEM ROOTFS SUPPORT
+R: Changbin Du <[email protected]>
+S: Supported
+F: fs/9p/v9fsroot.c
+
A8293 MEDIA DRIVER
M: Antti Palosaari <[email protected]>
L: [email protected]
diff --git a/fs/9p/Kconfig b/fs/9p/Kconfig
index 09fd4a185fd2..71c5a49f9a27 100644
--- a/fs/9p/Kconfig
+++ b/fs/9p/Kconfig
@@ -42,3 +42,9 @@ config 9P_FS_SECURITY

If you are not using a security module that requires using
extended attributes for file security labels, say N.
+
+config 9P_FS_ROOT
+ bool "9p root file system"
+ depends on 9P_FS=y
+ help
+ Enables root file system support over 9p protocol.
diff --git a/fs/9p/Makefile b/fs/9p/Makefile
index e7800a5c7395..bc2a4ef10049 100644
--- a/fs/9p/Makefile
+++ b/fs/9p/Makefile
@@ -15,3 +15,4 @@ obj-$(CONFIG_9P_FS) := 9p.o

9p-$(CONFIG_9P_FSCACHE) += cache.o
9p-$(CONFIG_9P_FS_POSIX_ACL) += acl.o
+9p-$(CONFIG_9P_FS_ROOT) += v9fsroot.o
diff --git a/fs/9p/v9fsroot.c b/fs/9p/v9fsroot.c
new file mode 100644
index 000000000000..6c9f7e335c1a
--- /dev/null
+++ b/fs/9p/v9fsroot.c
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * 9p root file system support
+ *
+ * Copyright (c) 2021 Changbin Du <[email protected]>
+ */
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/types.h>
+#include <linux/ctype.h>
+#include <linux/string.h>
+#include <linux/root_dev.h>
+#include <linux/kernel.h>
+
+static char root_dev[2048] __initdata = "";
+static char root_opts[1024] __initdata = "";
+
+/* v9fsroot=<path>[,options] */
+static int __init v9fs_root_setup(char *line)
+{
+ char *s;
+ int len;
+
+ if (strlen(line) >= 1) {
+ /* make s point to ',' or '\0' at end of line */
+ s = strchrnul(line, ',');
+ /* len is strlen(unc) + '\0' */
+ len = s - line + 1;
+ if (len > sizeof(root_dev)) {
+ pr_err("Root-V9FS: path too long\n");
+ return 1;
+ }
+ strscpy(root_dev, line, len);
+
+ if (*s) {
+ int n = snprintf(root_opts,
+ sizeof(root_opts), "%s",
+ s + 1);
+ if (n >= sizeof(root_opts)) {
+ pr_err("Root-V9FS: mount options string too long\n");
+ root_opts[sizeof(root_opts)-1] = '\0';
+ return 1;
+ }
+ }
+ }
+
+ ROOT_DEV = Root_V9FS;
+ return 1;
+}
+
+__setup("v9fsroot=", v9fs_root_setup);
+
+int __init v9fs_root_data(char **dev, char **opts)
+{
+ if (!root_dev[0]) {
+ pr_err("Root-V9FS: no rootdev specified\n");
+ return -1;
+ }
+
+ *dev = root_dev;
+ *opts = root_opts;
+
+ return 0;
+}
diff --git a/include/linux/root_dev.h b/include/linux/root_dev.h
index 4e78651371ba..becd0ee2ff87 100644
--- a/include/linux/root_dev.h
+++ b/include/linux/root_dev.h
@@ -9,6 +9,7 @@
enum {
Root_NFS = MKDEV(UNNAMED_MAJOR, 255),
Root_CIFS = MKDEV(UNNAMED_MAJOR, 254),
+ Root_V9FS = MKDEV(UNNAMED_MAJOR, 253),
Root_RAM0 = MKDEV(RAMDISK_MAJOR, 0),
Root_RAM1 = MKDEV(RAMDISK_MAJOR, 1),
Root_FD0 = MKDEV(FLOPPY_MAJOR, 0),
diff --git a/init/do_mounts.c b/init/do_mounts.c
index a78e44ee6adb..3f18be0dea0e 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -287,6 +287,8 @@ dev_t name_to_dev_t(const char *name)
return Root_NFS;
if (strcmp(name, "/dev/cifs") == 0)
return Root_CIFS;
+ if (strcmp(name, "/dev/v9fs") == 0)
+ return Root_V9FS;
if (strcmp(name, "/dev/ram") == 0)
return Root_RAM0;
#ifdef CONFIG_BLOCK
@@ -536,6 +538,51 @@ static int __init mount_cifs_root(void)
}
#endif

+#ifdef CONFIG_9P_FS_ROOT
+
+extern int v9fs_root_data(char **dev, char **opts);
+
+#define V9FSROOT_TIMEOUT_MIN 5
+#define V9FSROOT_TIMEOUT_MAX 30
+#define V9FSROOT_RETRY_MAX 5
+
+static bool v9fs_need_retry(char *mount_opts)
+{
+ if (strstr(mount_opts, "trans=virtio") || strstr(mount_opts, "trans=fd"))
+ return false;
+ return true;
+}
+
+static int __init mount_v9fs_root(void)
+{
+ char *root_dev, *root_data;
+ unsigned int timeout;
+ int try, err;
+
+ err = v9fs_root_data(&root_dev, &root_data);
+ if (err != 0)
+ return 0;
+
+ timeout = V9FSROOT_TIMEOUT_MIN;
+ for (try = 1; ; try++) {
+ err = do_mount_root(root_dev, "9p",
+ root_mountflags, root_data);
+ if (err == 0)
+ return 1;
+
+ if (!v9fs_need_retry(root_data) || try > V9FSROOT_RETRY_MAX)
+ break;
+
+ /* Wait, in case the server refused us immediately */
+ ssleep(timeout);
+ timeout <<= 1;
+ if (timeout > V9FSROOT_TIMEOUT_MAX)
+ timeout = V9FSROOT_TIMEOUT_MAX;
+ }
+ return 0;
+}
+#endif
+
void __init mount_root(void)
{
#ifdef CONFIG_ROOT_NFS
@@ -552,6 +599,13 @@ void __init mount_root(void)
return;
}
#endif
+#ifdef CONFIG_9P_FS_ROOT
+ if (ROOT_DEV == Root_V9FS) {
+ if (!mount_v9fs_root())
+ pr_err("VFS: Unable to mount root fs via 9p.\n");
+ return;
+ }
+#endif
#ifdef CONFIG_BLOCK
{
int err = create_dev("/dev/root", ROOT_DEV);
--
2.30.2

2021-05-08 00:02:02

by Changbin Du

[permalink] [raw]
Subject: [PATCH v2 2/3] 9p: doc: move to a new dedicated folder

Later we will add another documentation for v9fs.

Signed-off-by: Changbin Du <[email protected]>
---
Documentation/filesystems/index.rst | 2 +-
Documentation/filesystems/{ => v9fs}/9p.rst | 0
Documentation/filesystems/v9fs/index.rst | 11 +++++++++++
MAINTAINERS | 2 +-
4 files changed, 13 insertions(+), 2 deletions(-)
rename Documentation/filesystems/{ => v9fs}/9p.rst (100%)
create mode 100644 Documentation/filesystems/v9fs/index.rst

diff --git a/Documentation/filesystems/index.rst b/Documentation/filesystems/index.rst
index d4853cb919d2..e53992636a49 100644
--- a/Documentation/filesystems/index.rst
+++ b/Documentation/filesystems/index.rst
@@ -63,7 +63,7 @@ Documentation for filesystem implementations.
.. toctree::
:maxdepth: 2

- 9p
+ v9fs/index
adfs
affs
afs
diff --git a/Documentation/filesystems/9p.rst b/Documentation/filesystems/v9fs/9p.rst
similarity index 100%
rename from Documentation/filesystems/9p.rst
rename to Documentation/filesystems/v9fs/9p.rst
diff --git a/Documentation/filesystems/v9fs/index.rst b/Documentation/filesystems/v9fs/index.rst
new file mode 100644
index 000000000000..a1e45b89e2a2
--- /dev/null
+++ b/Documentation/filesystems/v9fs/index.rst
@@ -0,0 +1,11 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+====
+v9fs
+====
+
+.. toctree::
+ :maxdepth: 6
+ :numbered:
+
+ 9p
diff --git a/MAINTAINERS b/MAINTAINERS
index c9f9c89bad13..2d22e2af4d10 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -232,7 +232,7 @@ W: http://swik.net/v9fs
Q: http://patchwork.kernel.org/project/v9fs-devel/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git
T: git git://github.com/martinetd/linux.git
-F: Documentation/filesystems/9p.rst
+F: Documentation/filesystems/v9fs/
F: fs/9p/
F: include/net/9p/
F: include/trace/events/9p.h
--
2.30.2

2021-05-08 00:04:34

by Changbin Du

[permalink] [raw]
Subject: [PATCH v2 3/3] 9p: doc: add v9fsroot description

This documentation is modified from cifs/cifsroot.rst.

Signed-off-by: Changbin Du <[email protected]>
---
Documentation/filesystems/v9fs/index.rst | 1 +
Documentation/filesystems/v9fs/v9fsroot.rst | 52 +++++++++++++++++++++
MAINTAINERS | 1 +
3 files changed, 54 insertions(+)
create mode 100644 Documentation/filesystems/v9fs/v9fsroot.rst

diff --git a/Documentation/filesystems/v9fs/index.rst b/Documentation/filesystems/v9fs/index.rst
index a1e45b89e2a2..65e1ceb04c9c 100644
--- a/Documentation/filesystems/v9fs/index.rst
+++ b/Documentation/filesystems/v9fs/index.rst
@@ -9,3 +9,4 @@ v9fs
:numbered:

9p
+ v9fsroot
diff --git a/Documentation/filesystems/v9fs/v9fsroot.rst b/Documentation/filesystems/v9fs/v9fsroot.rst
new file mode 100644
index 000000000000..ce6b3c85e301
--- /dev/null
+++ b/Documentation/filesystems/v9fs/v9fsroot.rst
@@ -0,0 +1,52 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+==========================================
+Mounting root file system via v9fs (9p.ko)
+==========================================
+
+:Author: Changbin Du <[email protected]>
+
+The CONFIG_9P_FS_ROOT option enables experimental root file system
+support for v9fs.
+
+It introduces a new kernel command-line option called 'v9fsroot='
+which will tell the kernel to mount the root file system by
+utilizing the 9p protocol.
+
+
+Kernel command line
+===================
+
+::
+
+ root=/dev/v9fs
+
+This is just a virtual device that basically tells the kernel to mount
+the root file system via 9p protocol.
+
+::
+
+ v9fsroot=<path>[,options]
+
+Enables the kernel to mount the root file system via 9p specified in this
+option.
+
+path
+ Could be a remote file server, Plan 9 From User Space applications
+ or mount tag of virtio transport.
+
+options
+ Optional mount options.
+
+Examples
+========
+Test it under QEMU on a kernel built with CONFIG_9P_FS_ROOT and
+CONFIG_IP_PNP options enabled::
+
+ # qemu-system-x86_64 -enable-kvm -cpu host -m 1024 \
+ -virtfs local,path=$rootfs_dir,mount_tag=r,security_model=passthrough,id=r \
+ -kernel /path/to/linux/arch/x86/boot/bzImage -nographic \
+ -append "root=/dev/v9fs v9fsroot=r,trans=virtio rw console=ttyS0 3"
+
+The above example mounts v9fs with tag 'r' as rootfs in qemu guest via
+virtio transport.
diff --git a/MAINTAINERS b/MAINTAINERS
index 2d22e2af4d10..8c585d387f61 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -243,6 +243,7 @@ F: net/9p/
R: Changbin Du <[email protected]>
S: Supported
F: fs/9p/v9fsroot.c
+F: Documentation/filesystems/v9fs/v9fsroot.rst

A8293 MEDIA DRIVER
M: Antti Palosaari <[email protected]>
--
2.30.2