linux-doc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] 9p: add support for root file systems
@ 2021-05-05 12:07 Changbin Du
  2021-05-05 12:07 ` [PATCH 1/3] " Changbin Du
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Changbin Du @ 2021-05-05 12:07 UTC (permalink / raw)
  To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet
  Cc: Jonathan Corbet, linux-doc, Changbin Du

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"


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 +++++++++++++++++
 fs/9p/Kconfig                               |  6 ++
 fs/9p/Makefile                              |  1 +
 fs/9p/v9fsroot.c                            | 64 +++++++++++++++++++++
 include/linux/root_dev.h                    |  1 +
 init/do_mounts.c                            | 46 +++++++++++++++
 9 files changed, 183 insertions(+), 1 deletion(-)
 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


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] 9p: add support for root file systems
  2021-05-05 12:07 [PATCH 0/3] 9p: add support for root file systems Changbin Du
@ 2021-05-05 12:07 ` Changbin Du
  2021-05-05 12:50   ` Dominique Martinet
  2021-05-05 12:07 ` [PATCH 2/3] 9p: doc: move to a new dedicated folder Changbin Du
  2021-05-05 12:07 ` [PATCH 3/3] 9p: doc: add v9fsroot description Changbin Du
  2 siblings, 1 reply; 7+ messages in thread
From: Changbin Du @ 2021-05-05 12:07 UTC (permalink / raw)
  To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet
  Cc: Jonathan Corbet, linux-doc, Changbin Du

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 <changbin.du@gmail.com>
---
 fs/9p/Kconfig            |  6 ++++
 fs/9p/Makefile           |  1 +
 fs/9p/v9fsroot.c         | 64 ++++++++++++++++++++++++++++++++++++++++
 include/linux/root_dev.h |  1 +
 init/do_mounts.c         | 46 +++++++++++++++++++++++++++++
 5 files changed, 118 insertions(+)
 create mode 100644 fs/9p/v9fsroot.c

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..7dd91cc3814f
--- /dev/null
+++ b/fs/9p/v9fsroot.c
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * SMB root file system support
+ *
+ * Copyright (c) 2021 Changbin Du <changbin.du@gmail.com>
+ */
+#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;
+
+	ROOT_DEV = Root_V9FS;
+
+	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)) {
+			printk(KERN_ERR "Root-V9FS: path too long\n");
+			return 1;
+		}
+		strlcpy(root_dev, line, len);
+		if (*s) {
+			int n = snprintf(root_opts,
+					 sizeof(root_opts), "%s,%s",
+					 DEFAULT_MNT_OPTS, s + 1);
+			if (n >= sizeof(root_opts)) {
+				printk(KERN_ERR "Root-V9FS: mount options string too long\n");
+				root_opts[sizeof(root_opts)-1] = '\0';
+				return 1;
+			}
+		}
+	}
+
+	return 1;
+}
+
+__setup("v9fsroot=", v9fs_root_setup);
+
+int __init v9fs_root_data(char **dev, char **opts)
+{
+	if (!root_dev[0]) {
+		printk(KERN_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..60af89983a6b 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,43 @@ 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 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 (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 +591,13 @@ void __init mount_root(void)
 		return;
 	}
 #endif
+#ifdef CONFIG_9P_FS_ROOT
+	if (ROOT_DEV == Root_V9FS) {
+		if (!mount_v9fs_root())
+			printk(KERN_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


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] 9p: doc: move to a new dedicated folder
  2021-05-05 12:07 [PATCH 0/3] 9p: add support for root file systems Changbin Du
  2021-05-05 12:07 ` [PATCH 1/3] " Changbin Du
@ 2021-05-05 12:07 ` Changbin Du
  2021-05-05 12:07 ` [PATCH 3/3] 9p: doc: add v9fsroot description Changbin Du
  2 siblings, 0 replies; 7+ messages in thread
From: Changbin Du @ 2021-05-05 12:07 UTC (permalink / raw)
  To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet
  Cc: Jonathan Corbet, linux-doc, Changbin Du

Later we will add another documentation for v9fs.

Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
 Documentation/filesystems/index.rst         |  2 +-
 Documentation/filesystems/{ => v9fs}/9p.rst |  0
 Documentation/filesystems/v9fs/index.rst    | 11 +++++++++++
 3 files changed, 12 insertions(+), 1 deletion(-)
 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
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] 9p: doc: add v9fsroot description
  2021-05-05 12:07 [PATCH 0/3] 9p: add support for root file systems Changbin Du
  2021-05-05 12:07 ` [PATCH 1/3] " Changbin Du
  2021-05-05 12:07 ` [PATCH 2/3] 9p: doc: move to a new dedicated folder Changbin Du
@ 2021-05-05 12:07 ` Changbin Du
  2 siblings, 0 replies; 7+ messages in thread
From: Changbin Du @ 2021-05-05 12:07 UTC (permalink / raw)
  To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet
  Cc: Jonathan Corbet, linux-doc, Changbin Du

This documentation is modified from cifs/cifsroot.rst.

Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
 Documentation/filesystems/v9fs/index.rst    |  1 +
 Documentation/filesystems/v9fs/v9fsroot.rst | 52 +++++++++++++++++++++
 2 files changed, 53 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 <changbin.du@gmail.com>
+
+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.
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] 9p: add support for root file systems
  2021-05-05 12:07 ` [PATCH 1/3] " Changbin Du
@ 2021-05-05 12:50   ` Dominique Martinet
  2021-05-05 15:10     ` Enrico Weigelt, metux IT consult
  2021-05-06 16:04     ` Changbin Du
  0 siblings, 2 replies; 7+ messages in thread
From: Dominique Martinet @ 2021-05-05 12:50 UTC (permalink / raw)
  To: Changbin Du
  Cc: Eric Van Hensbergen, Latchesar Ionkov, Jonathan Corbet,
	linux-doc, v9fs-developer, linux-fsdevel

Why has this only been sent to direct maintainers and linux-doc@vger ?
Please resend to at least v9fs-developer@sf, linux-fs@vger and whoever
get_maintainer.pl deems appropriate for init/do_mounts.c changes
(added the two lists to this mail)


As a whole for the series: I'm personally not sure I'd encourage this,
it can currently be done with an initrd if someone cares enough and if
we're going to add all remote filesystems that way there's going to be
no end to it.

That being said, I'm not 100% opposed to it if there is demand; but I'll
expect you to help with whatever bug reports people come up with using
this option.


Changbin Du wrote on Wed, May 05, 2021 at 08:07:46PM +0800:
> diff --git a/fs/9p/v9fsroot.c b/fs/9p/v9fsroot.c
> new file mode 100644
> index 000000000000..7dd91cc3814f
> --- /dev/null
> +++ b/fs/9p/v9fsroot.c
> @@ -0,0 +1,64 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * SMB root file system support

copy-paste error from fs/cifs/cifsroot.c

> + *
> + * Copyright (c) 2021 Changbin Du <changbin.du@gmail.com>
> + */
> +#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;
> +
> +	ROOT_DEV = Root_V9FS;
> +
> +	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)) {
> +			printk(KERN_ERR "Root-V9FS: path too long\n");

9p has its own p9_debug helper; it's a bit awkward because even
P9_DEBUG_ERROR right now is not displayed by default so I'm not against
pr_err or pr_warn for important messages (I'd like to replace all such
messages by either at some point), but at least stick to pr_xyz(...)
rather than printk(KERN_XYZ...)

> +			return 1;
> +		}
> +		strlcpy(root_dev, line, len);
> +		if (*s) {
> +			int n = snprintf(root_opts,
> +					 sizeof(root_opts), "%s,%s",
> +					 DEFAULT_MNT_OPTS, s + 1);

Did you actually run with this? DEFAULT_MNT_OPTS is not defined here.

> +			if (n >= sizeof(root_opts)) {
> +				printk(KERN_ERR "Root-V9FS: mount options string too long\n");
> +				root_opts[sizeof(root_opts)-1] = '\0';
> +				return 1;
> +			}
> +		}
> +	}
> +
> +	return 1;

I'm also surprised this only ever returns 1, the cifs codes does the
same but I'd be surprised the mount can work without a tag so there
certainly should be some difference between working and not working?

I'd also expect ROOT_DEV to only be set on success, this doesn't make
sense to trigger 9p mounting mechanisms with something that can't be
mounted, leading to a long timeout (5+10+15+30*2 seconds) before a hard
error when the hard error can be given right away.

> +}
> +
> +__setup("v9fsroot=", v9fs_root_setup);
> +
> +int __init v9fs_root_data(char **dev, char **opts)
> +{
> +	if (!root_dev[0]) {
> +		printk(KERN_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..60af89983a6b 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,43 @@ 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 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 (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 +591,13 @@ void __init mount_root(void)
>  		return;
>  	}
>  #endif
> +#ifdef CONFIG_9P_FS_ROOT
> +	if (ROOT_DEV == Root_V9FS) {
> +		if (!mount_v9fs_root())
> +			printk(KERN_ERR "VFS: Unable to mount root fs via 9p.\n");
> +		return;
> +	}
> +#endif
>  #ifdef CONFIG_BLOCK
>  	{
>  		int err = create_dev("/dev/root", ROOT_DEV);
-- 
Dominique

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] 9p: add support for root file systems
  2021-05-05 12:50   ` Dominique Martinet
@ 2021-05-05 15:10     ` Enrico Weigelt, metux IT consult
  2021-05-06 16:04     ` Changbin Du
  1 sibling, 0 replies; 7+ messages in thread
From: Enrico Weigelt, metux IT consult @ 2021-05-05 15:10 UTC (permalink / raw)
  To: Dominique Martinet, Changbin Du
  Cc: Eric Van Hensbergen, Latchesar Ionkov, Jonathan Corbet,
	linux-doc, v9fs-developer, linux-fsdevel

On 05.05.21 14:50, Dominique Martinet wrote:

> As a whole for the series: I'm personally not sure I'd encourage this,
> it can currently be done with an initrd if someone cares enough and if
> we're going to add all remote filesystems that way there's going to be
> no end to it.

personally, I'd be *very* interested in that, especially for specially
tailored vm grid workloads. please keep me in the loop.


--mtx

-- 
---
Hinweis: unverschlüsselte E-Mails können leicht abgehört und manipuliert
werden ! Für eine vertrauliche Kommunikation senden Sie bitte ihren
GPG/PGP-Schlüssel zu.
---
Enrico Weigelt, metux IT consult
Free software and Linux embedded engineering
info@metux.net -- +49-151-27565287

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] 9p: add support for root file systems
  2021-05-05 12:50   ` Dominique Martinet
  2021-05-05 15:10     ` Enrico Weigelt, metux IT consult
@ 2021-05-06 16:04     ` Changbin Du
  1 sibling, 0 replies; 7+ messages in thread
From: Changbin Du @ 2021-05-06 16:04 UTC (permalink / raw)
  To: Dominique Martinet
  Cc: Changbin Du, Eric Van Hensbergen, Latchesar Ionkov,
	Jonathan Corbet, linux-doc, v9fs-developer, linux-fsdevel, lkml

On Wed, May 05, 2021 at 09:50:50PM +0900, Dominique Martinet wrote:
> Why has this only been sent to direct maintainers and linux-doc@vger ?
> Please resend to at least v9fs-developer@sf, linux-fs@vger and whoever
> get_maintainer.pl deems appropriate for init/do_mounts.c changes
> (added the two lists to this mail)
>
I made a typing mistake and then...

> 
> As a whole for the series: I'm personally not sure I'd encourage this,
> it can currently be done with an initrd if someone cares enough and if
> we're going to add all remote filesystems that way there's going to be
> no end to it.
> 
> That being said, I'm not 100% opposed to it if there is demand; but I'll
> expect you to help with whatever bug reports people come up with using
> this option.
> 
No problem, I can help with any issues related to this. It is worth doint this
especially for some virtulizaion scenarioes.

> 
> Changbin Du wrote on Wed, May 05, 2021 at 08:07:46PM +0800:
> > diff --git a/fs/9p/v9fsroot.c b/fs/9p/v9fsroot.c
> > new file mode 100644
> > index 000000000000..7dd91cc3814f
> > --- /dev/null
> > +++ b/fs/9p/v9fsroot.c
> > @@ -0,0 +1,64 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * SMB root file system support
> 
> copy-paste error from fs/cifs/cifsroot.c
> 
Sorry, I'll fix it.

> > + *
> > + * Copyright (c) 2021 Changbin Du <changbin.du@gmail.com>
> > + */
> > +#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;
> > +
> > +	ROOT_DEV = Root_V9FS;
> > +
> > +	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)) {
> > +			printk(KERN_ERR "Root-V9FS: path too long\n");
> 
> 9p has its own p9_debug helper; it's a bit awkward because even
> P9_DEBUG_ERROR right now is not displayed by default so I'm not against
> pr_err or pr_warn for important messages (I'd like to replace all such
> messages by either at some point), but at least stick to pr_xyz(...)
> rather than printk(KERN_XYZ...)
> 
okay, will use pr_err() instead then.

> > +			return 1;
> > +		}
> > +		strlcpy(root_dev, line, len);
> > +		if (*s) {
> > +			int n = snprintf(root_opts,
> > +					 sizeof(root_opts), "%s,%s",
> > +					 DEFAULT_MNT_OPTS, s + 1);
> 
> Did you actually run with this? DEFAULT_MNT_OPTS is not defined here.
> 
oops, my bad that I forgot to test the latest change.

> > +			if (n >= sizeof(root_opts)) {
> > +				printk(KERN_ERR "Root-V9FS: mount options string too long\n");
> > +				root_opts[sizeof(root_opts)-1] = '\0';
> > +				return 1;
> > +			}
> > +		}
> > +	}
> > +
> > +	return 1;
> 
> I'm also surprised this only ever returns 1, the cifs codes does the
> same but I'd be surprised the mount can work without a tag so there
> certainly should be some difference between working and not working?
>
I think this returns 1 just means the "v9fsroot=" kernel parameter is handled
so do not need further processing. But this doesn't mean the mount options can
work.

> I'd also expect ROOT_DEV to only be set on success, this doesn't make
> sense to trigger 9p mounting mechanisms with something that can't be
> mounted, leading to a long timeout (5+10+15+30*2 seconds) before a hard
> error when the hard error can be given right away.
> 
Sure, will only set ROOT_DEV after basic option checking.

> > +}
> > +
> > +__setup("v9fsroot=", v9fs_root_setup);
> > +
> > +int __init v9fs_root_data(char **dev, char **opts)
> > +{
> > +	if (!root_dev[0]) {
> > +		printk(KERN_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..60af89983a6b 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,43 @@ 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 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 (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 +591,13 @@ void __init mount_root(void)
> >  		return;
> >  	}
> >  #endif
> > +#ifdef CONFIG_9P_FS_ROOT
> > +	if (ROOT_DEV == Root_V9FS) {
> > +		if (!mount_v9fs_root())
> > +			printk(KERN_ERR "VFS: Unable to mount root fs via 9p.\n");
> > +		return;
> > +	}
> > +#endif
> >  #ifdef CONFIG_BLOCK
> >  	{
> >  		int err = create_dev("/dev/root", ROOT_DEV);
> -- 
> Dominique

-- 
Cheers,
Changbin Du

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-05-06 16:04 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-05 12:07 [PATCH 0/3] 9p: add support for root file systems Changbin Du
2021-05-05 12:07 ` [PATCH 1/3] " Changbin Du
2021-05-05 12:50   ` Dominique Martinet
2021-05-05 15:10     ` Enrico Weigelt, metux IT consult
2021-05-06 16:04     ` Changbin Du
2021-05-05 12:07 ` [PATCH 2/3] 9p: doc: move to a new dedicated folder Changbin Du
2021-05-05 12:07 ` [PATCH 3/3] 9p: doc: add v9fsroot description Changbin Du

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).