Merge branch 'linus' into cont_syslog
[safe/jmp/linux-2.6] / init / do_mounts.c
index a1de1bf..02e3ca4 100644 (file)
 #include <linux/device.h>
 #include <linux/init.h>
 #include <linux/fs.h>
+#include <linux/initrd.h>
+#include <linux/async.h>
+#include <linux/fs_struct.h>
+#include <linux/slab.h>
 
 #include <linux/nfs_fs.h>
 #include <linux/nfs_fs_sb.h>
@@ -22,7 +26,7 @@
 int __initdata rd_doload;      /* 1 = load RAM disk, 0 = don't load */
 
 int root_mountflags = MS_RDONLY | MS_SILENT;
-char * __initdata root_device_name;
+static char * __initdata root_device_name;
 static char __initdata saved_root_name[64];
 static int __initdata root_wait;
 
@@ -219,16 +223,17 @@ static int __init do_mount_root(char *name, char *fs, int flags, void *data)
 
        sys_chdir("/root");
        ROOT_DEV = current->fs->pwd.mnt->mnt_sb->s_dev;
-       printk("VFS: Mounted root (%s filesystem)%s.\n",
+       printk("VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
               current->fs->pwd.mnt->mnt_sb->s_type->name,
               current->fs->pwd.mnt->mnt_sb->s_flags & MS_RDONLY ?
-              " readonly" : "");
+              " readonly" : "", MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
        return 0;
 }
 
 void __init mount_block_root(char *name, int flags)
 {
-       char *fs_names = __getname();
+       char *fs_names = __getname_gfp(GFP_KERNEL
+               | __GFP_NOTRACK_FALSE_POSITIVE);
        char *p;
 #ifdef CONFIG_BLOCK
        char b[BDEVNAME_SIZE];
@@ -262,6 +267,10 @@ retry:
                printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");
 
                printk_all_partitions();
+#ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
+               printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "
+                      "explicit textual name for \"root=\" boot option.\n");
+#endif
                panic("VFS: Unable to mount root fs on %s", b);
        }
 
@@ -364,9 +373,14 @@ void __init prepare_namespace(void)
                ssleep(root_delay);
        }
 
-       /* wait for the known devices to complete their probing */
-       while (driver_probe_done() != 0)
-               msleep(100);
+       /*
+        * wait for the known devices to complete their probing
+        *
+        * Note: this is a potential source of long boot delays.
+        * For example, it is not atypical to wait 5 seconds here
+        * for the touchpad of a laptop to initialize.
+        */
+       wait_for_device_probe();
 
        md_run_setup();
 
@@ -392,6 +406,7 @@ void __init prepare_namespace(void)
                while (driver_probe_done() != 0 ||
                        (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
                        msleep(100);
+               async_synchronize_full();
        }
 
        is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
@@ -401,7 +416,7 @@ void __init prepare_namespace(void)
 
        mount_root();
 out:
+       devtmpfs_mount("dev");
        sys_mount(".", "/", NULL, MS_MOVE, NULL);
        sys_chroot(".");
 }
-