From: Christoph Hellwig <hch@lst.de>
To: viro@zeniv.linux.org.uk
Cc: Vivek Goyal <vgoyal@redhat.com>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
virtio-fs@redhat.com
Subject: [PATCH 2/2] init: allow mounting arbitrary non-blockdevice filesystems as root
Date: Mon, 21 Jun 2021 08:26:57 +0200 [thread overview]
Message-ID: <20210621062657.3641879-3-hch@lst.de> (raw)
In-Reply-To: <20210621062657.3641879-1-hch@lst.de>
Currently the only non-blockdevice filesystems that can be used as the
initial root filesystem are NFS and CIFS, which use the magic
"root=/dev/nfs" and "root=/dev/cifs" syntax that requires the root
device file system details to come from filesystem specific kernel
command line options.
Add a little bit of new code that allows to just pass arbitrary
string mount options to any non-blockdevice filesystems so that it can
be mounted as the root file system.
For example a virtiofs root file system can be mounted using the
following syntax:
"root=myfs rootfstype=virtiofs rw"
Based on an earlier patch from Vivek Goyal <vgoyal@redhat.com>.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
init/do_mounts.c | 43 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/init/do_mounts.c b/init/do_mounts.c
index ec32de3ad52b..bdeb90b8d669 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -534,6 +534,45 @@ static int __init mount_cifs_root(void)
}
#endif
+static bool __init fs_is_nodev(char *fstype)
+{
+ struct file_system_type *fs = get_fs_type(fstype);
+ bool ret = false;
+
+ if (fs) {
+ ret = !(fs->fs_flags & FS_REQUIRES_DEV);
+ put_filesystem(fs);
+ }
+
+ return ret;
+}
+
+static int __init mount_nodev_root(void)
+{
+ char *fs_names, *fstype;
+ int err = -EINVAL;
+
+ fs_names = (void *)__get_free_page(GFP_KERNEL);
+ if (!fs_names)
+ return -EINVAL;
+ split_fs_names(fs_names, root_fs_names);
+
+ for (fstype = fs_names; *fstype; fstype += strlen(fstype) + 1) {
+ if (!fs_is_nodev(fstype))
+ continue;
+ err = do_mount_root(root_device_name, fstype, root_mountflags,
+ root_mount_data);
+ if (!err)
+ break;
+ if (err != -EACCES && err != -EINVAL)
+ panic("VFS: Unable to mount root \"%s\" (%s), err=%d\n",
+ root_device_name, fstype, err);
+ }
+
+ free_page((unsigned long)fs_names);
+ return err;
+}
+
void __init mount_root(void)
{
#ifdef CONFIG_ROOT_NFS
@@ -550,6 +589,10 @@ void __init mount_root(void)
return;
}
#endif
+ if (ROOT_DEV == 0 && root_device_name && root_fs_names) {
+ if (mount_nodev_root() == 0)
+ return;
+ }
#ifdef CONFIG_BLOCK
{
int err = create_dev("/dev/root", ROOT_DEV);
--
2.30.2
next prev parent reply other threads:[~2021-06-21 6:28 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-21 6:26 support booting of arbitrary non-blockdevice file systems v2 Christoph Hellwig
2021-06-21 6:26 ` [PATCH 1/2] init: split get_fs_names Christoph Hellwig
2021-06-21 14:46 ` Al Viro
2021-06-21 14:51 ` Al Viro
2021-06-21 14:53 ` Christoph Hellwig
2021-06-21 14:59 ` Al Viro
2021-06-21 15:09 ` Matthew Wilcox
2021-06-21 15:22 ` Christoph Hellwig
2021-06-21 6:26 ` Christoph Hellwig [this message]
2021-06-21 13:31 ` [Virtio-fs] support booting of arbitrary non-blockdevice file systems v2 Stefan Hajnoczi
2021-06-21 14:35 ` Vivek Goyal
2021-06-22 8:12 ` [PATCH 3/2] fs: simplify get_filesystem_list / get_all_fs_names Christoph Hellwig
2021-06-22 8:36 ` [Virtio-fs] " Stefan Hajnoczi
2021-06-29 20:50 ` Vivek Goyal
2021-06-30 5:36 ` Christoph Hellwig
2021-06-30 17:33 ` Vivek Goyal
2021-07-07 21:04 ` Vivek Goyal
2021-07-07 21:06 ` Vivek Goyal
2021-07-08 12:59 ` Vivek Goyal
2021-07-12 18:21 ` Vivek Goyal
2021-07-13 5:40 ` Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2021-06-17 15:36 support booting of arbitrary non-blockdevice file systems Christoph Hellwig
2021-06-17 15:36 ` [PATCH 2/2] init: allow mounting arbitrary non-blockdevice filesystems as root Christoph Hellwig
2021-06-17 16:26 ` Vivek Goyal
2021-06-18 13:20 ` Christoph Hellwig
2021-06-18 14:10 ` Vivek Goyal
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=20210621062657.3641879-3-hch@lst.de \
--to=hch@lst.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=vgoyal@redhat.com \
--cc=viro@zeniv.linux.org.uk \
--cc=virtio-fs@redhat.com \
/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.