]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - init/do_mounts.c
[PATCH] Fix race in efi variable delete code
[linux-2.6.git] / init / do_mounts.c
index b27c11064409a35812d9d35ba359e06f6d8c0ffb..dc1ec0803ef9b93b76c27b9db3a9d3e741f98280 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/security.h>
 #include <linux/delay.h>
 #include <linux/mount.h>
 #include <linux/security.h>
 #include <linux/delay.h>
 #include <linux/mount.h>
+#include <linux/device.h>
 
 #include <linux/nfs_fs.h>
 #include <linux/nfs_fs_sb.h>
 
 #include <linux/nfs_fs.h>
 #include <linux/nfs_fs_sb.h>
@@ -19,11 +20,10 @@ extern int get_filesystem_list(char * buf);
 
 int __initdata rd_doload;      /* 1 = load RAM disk, 0 = don't load */
 
 
 int __initdata rd_doload;      /* 1 = load RAM disk, 0 = don't load */
 
-int root_mountflags = MS_RDONLY | MS_VERBOSE;
+int root_mountflags = MS_RDONLY | MS_SILENT;
 char * __initdata root_device_name;
 static char __initdata saved_root_name[64];
 
 char * __initdata root_device_name;
 static char __initdata saved_root_name[64];
 
-/* this is initialized in init/main.c */
 dev_t ROOT_DEV;
 
 static int __init load_ramdisk(char *str)
 dev_t ROOT_DEV;
 
 static int __init load_ramdisk(char *str)
@@ -285,7 +285,11 @@ void __init mount_block_root(char *name, int flags)
 {
        char *fs_names = __getname();
        char *p;
 {
        char *fs_names = __getname();
        char *p;
+#ifdef CONFIG_BLOCK
        char b[BDEVNAME_SIZE];
        char b[BDEVNAME_SIZE];
+#else
+       const char *b = name;
+#endif
 
        get_fs_names(fs_names);
 retry:
 
        get_fs_names(fs_names);
 retry:
@@ -304,14 +308,24 @@ retry:
                 * Allow the user to distinguish between failed sys_open
                 * and bad superblock on root device.
                 */
                 * Allow the user to distinguish between failed sys_open
                 * and bad superblock on root device.
                 */
+#ifdef CONFIG_BLOCK
                __bdevname(ROOT_DEV, b);
                __bdevname(ROOT_DEV, b);
+#endif
                printk("VFS: Cannot open root device \"%s\" or %s\n",
                                root_device_name, b);
                printk("Please append a correct \"root=\" boot option\n");
 
                panic("VFS: Unable to mount root fs on %s", b);
        }
                printk("VFS: Cannot open root device \"%s\" or %s\n",
                                root_device_name, b);
                printk("Please append a correct \"root=\" boot option\n");
 
                panic("VFS: Unable to mount root fs on %s", b);
        }
-       panic("VFS: Unable to mount root fs on %s", __bdevname(ROOT_DEV, b));
+
+       printk("No filesystem could mount root, tried: ");
+       for (p = fs_names; *p; p += strlen(p)+1)
+               printk(" %s", p);
+       printk("\n");
+#ifdef CONFIG_BLOCK
+       __bdevname(ROOT_DEV, b);
+#endif
+       panic("VFS: Unable to mount root fs on %s", b);
 out:
        putname(fs_names);
 }
 out:
        putname(fs_names);
 }
@@ -321,7 +335,7 @@ static int __init mount_nfs_root(void)
 {
        void *data = nfs_root_data();
 
 {
        void *data = nfs_root_data();
 
-       create_dev("/dev/root", ROOT_DEV, NULL);
+       create_dev("/dev/root", ROOT_DEV);
        if (data &&
            do_mount_root("/dev/root", "nfs", root_mountflags, data) == 0)
                return 1;
        if (data &&
            do_mount_root("/dev/root", "nfs", root_mountflags, data) == 0)
                return 1;
@@ -382,8 +396,10 @@ void __init mount_root(void)
                        change_floppy("root floppy");
        }
 #endif
                        change_floppy("root floppy");
        }
 #endif
-       create_dev("/dev/root", ROOT_DEV, root_device_name);
+#ifdef CONFIG_BLOCK
+       create_dev("/dev/root", ROOT_DEV);
        mount_block_root("/dev/root", root_mountflags);
        mount_block_root("/dev/root", root_mountflags);
+#endif
 }
 
 /*
 }
 
 /*
@@ -393,18 +409,24 @@ void __init prepare_namespace(void)
 {
        int is_floppy;
 
 {
        int is_floppy;
 
-       mount_devfs();
-
        if (root_delay) {
                printk(KERN_INFO "Waiting %dsec before mounting root device...\n",
                       root_delay);
                ssleep(root_delay);
        }
 
        if (root_delay) {
                printk(KERN_INFO "Waiting %dsec before mounting root device...\n",
                       root_delay);
                ssleep(root_delay);
        }
 
+       /* wait for the known devices to complete their probing */
+       while (driver_probe_done() != 0)
+               msleep(100);
+
        md_run_setup();
 
        if (saved_root_name[0]) {
                root_device_name = saved_root_name;
        md_run_setup();
 
        if (saved_root_name[0]) {
                root_device_name = saved_root_name;
+               if (!strncmp(root_device_name, "mtd", 3)) {
+                       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;
                ROOT_DEV = name_to_dev_t(root_device_name);
                if (strncmp(root_device_name, "/dev/", 5) == 0)
                        root_device_name += 5;
@@ -420,10 +442,8 @@ void __init prepare_namespace(void)
 
        mount_root();
 out:
 
        mount_root();
 out:
-       umount_devfs("/dev");
        sys_mount(".", "/", NULL, MS_MOVE, NULL);
        sys_chroot(".");
        security_sb_post_mountroot();
        sys_mount(".", "/", NULL, MS_MOVE, NULL);
        sys_chroot(".");
        security_sb_post_mountroot();
-       mount_devfs_fs ();
 }
 
 }