summaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2008-07-20 13:01:28 -0700
committerArjan van de Ven <arjan@linux.intel.com>2008-07-20 13:01:28 -0700
commitdb62cd29f9b9142c19c574ca00916f66ff22ed4a (patch)
treebf063512bd9dac36a5b7fd3fff4b5c9a1f5b4f7c /init
parenta06e1c2b448b317bc141934879cbbbed8319b4d4 (diff)
fastboot: retry mounting the root fs if we can't find init
currently we wait until all device init is done before trying to mount the root fs, and to consequently execute init. In preparation for relaxing the first delay, this patch adds a retry attempt in case /sbin/init is not found. Before retrying, the code will wait for all device init to complete. While this patch by itself doesn't gain boot time yet (it needs follow on patches), the alternative already is to panic()... Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Diffstat (limited to 'init')
-rw-r--r--init/main.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/init/main.c b/init/main.c
index 3575b842442b..73785a4b2735 100644
--- a/init/main.c
+++ b/init/main.c
@@ -853,6 +853,7 @@ static void run_init_process(char *init_filename)
*/
static int noinline init_post(void)
{
+ int retry_count = 1;
free_initmem();
unlock_kernel();
mark_rodata_ro();
@@ -873,6 +874,7 @@ static int noinline init_post(void)
ramdisk_execute_command);
}
+retry:
/*
* We try each of these until one succeeds.
*
@@ -885,6 +887,23 @@ static int noinline init_post(void)
"defaults...\n", execute_command);
}
run_init_process("/sbin/init");
+
+ if (retry_count > 0) {
+ retry_count--;
+ /*
+ * We haven't found init yet... potentially because the device
+ * is still being probed. We need to
+ * - flush keventd and friends
+ * - wait for the known devices to complete their probing
+ * - try to mount the root fs again
+ */
+ flush_scheduled_work();
+ while (driver_probe_done() != 0)
+ msleep(100);
+ prepare_namespace();
+ goto retry;
+ }
+
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");