This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / init / do_mounts.c
index 7f87ff7..94aeec7 100644 (file)
@@ -6,6 +6,8 @@
 #include <linux/suspend.h>
 #include <linux/root_dev.h>
 #include <linux/security.h>
+#include <linux/delay.h>
+#include <linux/mount.h>
 
 #include <linux/nfs_fs.h>
 #include <linux/nfs_fs_sb.h>
@@ -17,15 +19,12 @@ extern int get_filesystem_list(char * buf);
 
 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];
 
-/* this is initialized in init/main.c */
 dev_t ROOT_DEV;
 
-EXPORT_SYMBOL(ROOT_DEV);
-
 static int __init load_ramdisk(char *str)
 {
        rd_doload = simple_strtol(str,NULL,0) & 3;
@@ -52,7 +51,7 @@ static int __init readwrite(char *str)
 __setup("ro", readonly);
 __setup("rw", readwrite);
 
-static dev_t __init try_name(char *name, int part)
+static dev_t try_name(char *name, int part)
 {
        char path[64];
        char buf[32];
@@ -127,14 +126,14 @@ fail:
  *        used when disk name of partitioned disk ends on a digit.
  *
  *     If name doesn't have fall into the categories above, we return 0.
- *     Driverfs is used to check if something is a disk name - it has
+ *     Sysfs is used to check if something is a disk name - it has
  *     all known disks under bus/block/devices.  If the disk name
- *     contains slashes, name of driverfs node has them replaced with
- *     bangs.  try_name() does the actual checks, assuming that driverfs
+ *     contains slashes, name of sysfs node has them replaced with
+ *     bangs.  try_name() does the actual checks, assuming that sysfs
  *     is mounted on rootfs /sys.
  */
 
-dev_t __init name_to_dev_t(char *name)
+dev_t name_to_dev_t(char *name)
 {
        char s[32];
        char *p;
@@ -142,7 +141,7 @@ dev_t __init name_to_dev_t(char *name)
        int part;
 
 #ifdef CONFIG_SYSFS
-       sys_mkdir("/sys", 0700);
+       int mkdir_err = sys_mkdir("/sys", 0700);
        if (sys_mount("sysfs", "/sys", "sysfs", 0, NULL) < 0)
                goto out;
 #endif
@@ -197,7 +196,8 @@ done:
 #ifdef CONFIG_SYSFS
        sys_umount("/sys", 0);
 out:
-       sys_rmdir("/sys");
+       if (!mkdir_err)
+               sys_rmdir("/sys");
 #endif
        return res;
 fail:
@@ -227,8 +227,16 @@ static int __init fs_names_setup(char *str)
        return 1;
 }
 
+static unsigned int __initdata root_delay;
+static int __init root_delay_setup(char *str)
+{
+       root_delay = simple_strtoul(str, NULL, 0);
+       return 1;
+}
+
 __setup("rootflags=", root_data_setup);
 __setup("rootfstype=", fs_names_setup);
+__setup("rootdelay=", root_delay_setup);
 
 static void __init get_fs_names(char *page)
 {
@@ -302,6 +310,11 @@ retry:
 
                panic("VFS: Unable to mount root fs on %s", b);
        }
+
+       printk("No filesystem could mount root, tried: ");
+       for (p = fs_names; *p; p += strlen(p)+1)
+               printk(" %s", p);
+       printk("\n");
        panic("VFS: Unable to mount root fs on %s", __bdevname(ROOT_DEV, b));
 out:
        putname(fs_names);
@@ -312,7 +325,7 @@ static int __init mount_nfs_root(void)
 {
        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;
@@ -373,7 +386,7 @@ void __init mount_root(void)
                        change_floppy("root floppy");
        }
 #endif
-       create_dev("/dev/root", ROOT_DEV, root_device_name);
+       create_dev("/dev/root", ROOT_DEV);
        mount_block_root("/dev/root", root_mountflags);
 }
 
@@ -384,12 +397,20 @@ void __init prepare_namespace(void)
 {
        int is_floppy;
 
-       mount_devfs();
+       if (root_delay) {
+               printk(KERN_INFO "Waiting %dsec before mounting root device...\n",
+                      root_delay);
+               ssleep(root_delay);
+       }
 
        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;
@@ -405,10 +426,8 @@ void __init prepare_namespace(void)
 
        mount_root();
 out:
-       umount_devfs("/dev");
        sys_mount(".", "/", NULL, MS_MOVE, NULL);
        sys_chroot(".");
        security_sb_post_mountroot();
-       mount_devfs_fs ();
 }