From: Marco Stornelli <[email protected]>
Pramfs can be used even as root filesystem.
Signed-off-by: Marco Stornelli <[email protected]>
---
diff -uprN linux-2.6.30-orig/init/do_mounts.c linux-2.6.30/init/do_mounts.c
--- linux-2.6.30-orig/init/do_mounts.c 2009-06-10 05:05:27.000000000 +0200
+++ linux-2.6.30/init/do_mounts.c 2009-06-13 12:50:36.000000000 +0200
@@ -299,6 +299,17 @@ static int __init mount_nfs_root(void)
}
#endif
+#ifdef CONFIG_ROOT_PRAMFS
+static int __init mount_pramfs_root(void)
+{
+ create_dev("/dev/root", ROOT_DEV);
+ if (do_mount_root("/dev/root", "pramfs",
+ root_mountflags, root_mount_data) == 0)
+ return 1;
+ return 0;
+}
+#endif
+
#if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD)
void __init change_floppy(char *fmt, ...)
{
@@ -331,6 +342,15 @@ void __init change_floppy(char *fmt, ...
void __init mount_root(void)
{
+#ifdef CONFIG_ROOT_PRAMFS
+ if (MAJOR(ROOT_DEV) == MEM_MAJOR) {
+ if (mount_pramfs_root())
+ return;
+
+ printk(KERN_ERR "VFS: Unable to mount root fs via PRAMFS, trying floppy.\n");
+ ROOT_DEV = Root_FD0;
+ }
+#endif
#ifdef CONFIG_ROOT_NFS
if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {
if (mount_nfs_root())
On Saturday 13 June 2009, Marco wrote:
> void __init mount_root(void)
> {
> +#ifdef CONFIG_ROOT_PRAMFS
> + if (MAJOR(ROOT_DEV) == MEM_MAJOR) {
> + if (mount_pramfs_root())
> + return;
> +
> + printk(KERN_ERR "VFS: Unable to mount root fs via PRAMFS, trying floppy.\n");
> + ROOT_DEV = Root_FD0;
> + }
> +#endif
AFAICT, this will prevent booting from /dev/ram0 with a regular file system,
because that also uses MAJOR(ROOT_DEV) == 1.
Arnd <><
Arnd Bergmann wrote:
> On Saturday 13 June 2009, Marco wrote:
>> void __init mount_root(void)
>> {
>> +#ifdef CONFIG_ROOT_PRAMFS
>> + if (MAJOR(ROOT_DEV) == MEM_MAJOR) {
>> + if (mount_pramfs_root())
>> + return;
>> +
>> + printk(KERN_ERR "VFS: Unable to mount root fs via PRAMFS, trying floppy.\n");
>> + ROOT_DEV = Root_FD0;
>> + }
>> +#endif
>
> AFAICT, this will prevent booting from /dev/ram0 with a regular file system,
> because that also uses MAJOR(ROOT_DEV) == 1.
>
> Arnd <><
>
Mmm...MEM_MAJOR and RAMDISK_MAJOR have the same value and pramfs works
in memory. We could simply use /dev/null (there was an error in the
submitted kconfig description, my intention was to use /dev/mem). In
that case I can use UNNAMED_MAJOR. PRAMFS root option is not enabled if
it's already enabled the NFS one. What do you think?
Marco
On Sun, 2009-06-14 at 10:21 +0200, Marco wrote:
>
> Mmm...MEM_MAJOR and RAMDISK_MAJOR have the same value and pramfs works
> in memory. We could simply use /dev/null (there was an error in the
> submitted kconfig description, my intention was to use /dev/mem). In
> that case I can use UNNAMED_MAJOR. PRAMFS root option is not enabled
> if it's already enabled the NFS one. What do you think?
Why use a major number at all? See how we handle mtd and ubi devices in
prepare_namespace() -- can't you do something similar?
--
David Woodhouse Open Source Technology Centre
[email protected] Intel Corporation
David Woodhouse wrote:
> On Sun, 2009-06-14 at 10:21 +0200, Marco wrote:
>> Mmm...MEM_MAJOR and RAMDISK_MAJOR have the same value and pramfs works
>> in memory. We could simply use /dev/null (there was an error in the
>> submitted kconfig description, my intention was to use /dev/mem). In
>> that case I can use UNNAMED_MAJOR. PRAMFS root option is not enabled
>> if it's already enabled the NFS one. What do you think?
>
> Why use a major number at all? See how we handle mtd and ubi devices in
> prepare_namespace() -- can't you do something similar?
>
I can look at it.
Marco
David Woodhouse wrote:
> On Sun, 2009-06-14 at 10:21 +0200, Marco wrote:
>> Mmm...MEM_MAJOR and RAMDISK_MAJOR have the same value and pramfs works
>> in memory. We could simply use /dev/null (there was an error in the
>> submitted kconfig description, my intention was to use /dev/mem). In
>> that case I can use UNNAMED_MAJOR. PRAMFS root option is not enabled
>> if it's already enabled the NFS one. What do you think?
>
> Why use a major number at all? See how we handle mtd and ubi devices in
> prepare_namespace() -- can't you do something similar?
>
Do you suggest me something similar? Why not. I though that mtd and ubi
were only special cases.
if (saved_root_name[0]) {
root_device_name = saved_root_name;
if (!strncmp(root_device_name, "mtd", 3) ||
!strncmp(root_device_name, "ubi", 3) ||
--------> !strncmp(root_device_name, "pram", 4)) {
mount_block_root(root_device_name, root_mountflags);
goto out;
}
ROOT_DEV = name_to_dev_t(root_device_name);
if (strncmp(root_device_name, "/dev/", 5) == 0)
root_device_name += 5;
}