initmpfs: use initramfs if rootfstype= or root= specified
authorRob Landley <[email protected]>
Wed, 11 Sep 2013 21:26:13 +0000 (14:26 -0700)
committerLinus Torvalds <[email protected]>
Wed, 11 Sep 2013 22:59:38 +0000 (15:59 -0700)
Command line option rootfstype=ramfs to obtain old initramfs behavior, and
use ramfs instead of tmpfs for stub when root= defined (for cosmetic
reasons).

[[email protected]: coding-style fixes]
Signed-off-by: Rob Landley <[email protected]>
Cc: Jeff Layton <[email protected]>
Cc: Jens Axboe <[email protected]>
Cc: Stephen Warren <[email protected]>
Cc: Rusty Russell <[email protected]>
Cc: Jim Cromie <[email protected]>
Cc: Sam Ravnborg <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: "Eric W. Biederman" <[email protected]>
Cc: Alexander Viro <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Documentation/filesystems/ramfs-rootfs-initramfs.txt
init/do_mounts.c

index 59b4a0962e0f54df08399c2364b8161ac1b6434a..b176928e69631f5efe3cb37506b3eb375cc3e23a 100644 (file)
@@ -79,6 +79,10 @@ to just make sure certain lists can't become empty.
 Most systems just mount another filesystem over rootfs and ignore it.  The
 amount of space an empty instance of ramfs takes up is tiny.
 
+If CONFIG_TMPFS is enabled, rootfs will use tmpfs instead of ramfs by
+default.  To force ramfs, add "rootfstype=ramfs" to the kernel command
+line.
+
 What is initramfs?
 ------------------
 
index e27908b949d48cb2a208837e7eafbe11c7b00fc8..a51cddc2ff8c184e7a7034585190a9fad8ad270b 100644 (file)
@@ -591,16 +591,20 @@ out:
        sys_chroot(".");
 }
 
+static bool is_tmpfs;
 static struct dentry *rootfs_mount(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data)
 {
        static unsigned long once;
+       void *fill = ramfs_fill_super;
 
        if (test_and_set_bit(0, &once))
                return ERR_PTR(-ENODEV);
 
-       return mount_nodev(fs_type, flags, data,
-               IS_ENABLED(CONFIG_TMPFS) ? shmem_fill_super : ramfs_fill_super);
+       if (IS_ENABLED(CONFIG_TMPFS) && is_tmpfs)
+               fill = shmem_fill_super;
+
+       return mount_nodev(fs_type, flags, data, fill);
 }
 
 static struct file_system_type rootfs_fs_type = {
@@ -616,10 +620,13 @@ int __init init_rootfs(void)
        if (err)
                return err;
 
-       if (IS_ENABLED(CONFIG_TMPFS))
+       if (IS_ENABLED(CONFIG_TMPFS) && !saved_root_name[0] &&
+               (!root_fs_names || strstr(root_fs_names, "tmpfs"))) {
                err = shmem_init();
-       else
+               is_tmpfs = true;
+       } else {
                err = init_ramfs_fs();
+       }
 
        if (err)
                unregister_filesystem(&rootfs_fs_type);