-Index: linux-2.6.31.5/drivers/mtd/devices/block2mtd.c
-===================================================================
---- linux-2.6.31.5.orig/drivers/mtd/devices/block2mtd.c 2009-11-07 13:52:05.000000000 +0100
-+++ linux-2.6.31.5/drivers/mtd/devices/block2mtd.c 2009-11-07 13:52:17.000000000 +0100
+--- a/arch/x86/kernel/vmlinux.lds.S
++++ b/arch/x86/kernel/vmlinux.lds.S
+@@ -244,6 +244,12 @@ SECTIONS
+ __initcall_end = .;
+ }
+
++ .root_initcall.init : AT(ADDR(.root_initcall.init) - LOAD_OFFSET) {
++ __root_initcall_start = .;
++ INITCALLS_ROOT
++ __root_initcall_end = .;
++ }
++
+ .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
+ __con_initcall_start = .;
+ *(.con_initcall.init)
+--- a/drivers/mtd/devices/block2mtd.c
++++ b/drivers/mtd/devices/block2mtd.c
@@ -18,10 +18,18 @@
#include <linux/buffer_head.h>
#include <linux/mutex.h>
/* Info for the block device */
struct block2mtd_dev {
-@@ -33,10 +41,34 @@
+@@ -33,10 +41,34 @@ struct block2mtd_dev {
char devname[0];
};
static struct page *page_read(struct address_space *mapping, int index)
{
-@@ -511,7 +543,9 @@
+@@ -511,7 +543,9 @@ static int block2mtd_setup2(const char *
if (token[2] && (strlen(token[2]) + 1 > 80))
parse_err("mtd device name too long");
return 0;
}
-Index: linux-2.6.31.5/include/asm-generic/vmlinux.lds.h
-===================================================================
---- linux-2.6.31.5.orig/include/asm-generic/vmlinux.lds.h 2009-11-07 13:52:04.000000000 +0100
-+++ linux-2.6.31.5/include/asm-generic/vmlinux.lds.h 2009-11-07 13:52:17.000000000 +0100
+--- a/include/asm-generic/vmlinux.lds.h
++++ b/include/asm-generic/vmlinux.lds.h
@@ -622,12 +622,14 @@
*(.initcall4s.init) \
*(.initcall5.init) \
#define INIT_CALLS \
VMLINUX_SYMBOL(__initcall_start) = .; \
INITCALLS \
-Index: linux-2.6.31.5/init/do_mounts.c
-===================================================================
---- linux-2.6.31.5.orig/init/do_mounts.c 2009-10-23 00:57:56.000000000 +0200
-+++ linux-2.6.31.5/init/do_mounts.c 2009-11-07 13:52:17.000000000 +0100
-@@ -176,16 +176,8 @@
+--- a/init/do_mounts.c
++++ b/init/do_mounts.c
+@@ -176,16 +176,8 @@ static int __init fs_names_setup(char *s
return 1;
}
static void __init get_fs_names(char *page)
{
-@@ -366,23 +358,6 @@
+@@ -366,23 +358,6 @@ void __init prepare_namespace(void)
{
int is_floppy;
if (saved_root_name[0]) {
root_device_name = saved_root_name;
if (!strncmp(root_device_name, "mtd", 3) ||
-Index: linux-2.6.31.5/init/main.c
-===================================================================
---- linux-2.6.31.5.orig/init/main.c 2009-11-07 13:52:16.000000000 +0100
-+++ linux-2.6.31.5/init/main.c 2009-11-07 14:00:29.000000000 +0100
+--- a/init/main.c
++++ b/init/main.c
@@ -79,6 +79,7 @@
#ifdef CONFIG_X86_LOCAL_APIC
#include <asm/smp.h>
static int kernel_init(void *);
-@@ -784,12 +785,13 @@
+@@ -779,12 +780,13 @@ int do_one_initcall(initcall_t fn)
extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[];
do_one_initcall(*call);
/* Make sure there is no pending stuff from the initcall sequence */
-@@ -812,7 +814,7 @@
+@@ -807,7 +809,7 @@ static void __init do_basic_setup(void)
driver_init();
init_irq_proc();
do_ctors();
}
static void __init do_pre_smp_initcalls(void)
-@@ -873,6 +875,13 @@
+@@ -868,6 +870,13 @@ static noinline int init_post(void)
panic("No init found. Try passing init= option to kernel.");
}
static int __init kernel_init(void * unused)
{
lock_kernel();
-@@ -917,7 +926,16 @@
+@@ -912,7 +921,16 @@ static int __init kernel_init(void * unu
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
ramdisk_execute_command = NULL;
+ }
+ while (driver_probe_done() != 0)
+ msleep(100);
-+ md_run_setup();
+ do_initcalls(__root_initcall_start, __root_initcall_end);
++ md_run_setup();
+ prepare_namespace();
}