|
@@ -810,10 +810,26 @@ static int run_init_process(const char *init_filename)
|
|
|
(const char __user *const __user *)envp_init);
|
|
|
}
|
|
|
|
|
|
+static int try_to_run_init_process(const char *init_filename)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = run_init_process(init_filename);
|
|
|
+
|
|
|
+ if (ret && ret != -ENOENT) {
|
|
|
+ pr_err("Starting init: %s exists but couldn't execute it (error %d)\n",
|
|
|
+ init_filename, ret);
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static noinline void __init kernel_init_freeable(void);
|
|
|
|
|
|
static int __ref kernel_init(void *unused)
|
|
|
{
|
|
|
+ int ret;
|
|
|
+
|
|
|
kernel_init_freeable();
|
|
|
/* need to finish all async __init code before freeing the memory */
|
|
|
async_synchronize_full();
|
|
@@ -825,9 +841,11 @@ static int __ref kernel_init(void *unused)
|
|
|
flush_delayed_fput();
|
|
|
|
|
|
if (ramdisk_execute_command) {
|
|
|
- if (!run_init_process(ramdisk_execute_command))
|
|
|
+ ret = run_init_process(ramdisk_execute_command);
|
|
|
+ if (!ret)
|
|
|
return 0;
|
|
|
- pr_err("Failed to execute %s\n", ramdisk_execute_command);
|
|
|
+ pr_err("Failed to execute %s (error %d)\n",
|
|
|
+ ramdisk_execute_command, ret);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -837,18 +855,19 @@ static int __ref kernel_init(void *unused)
|
|
|
* trying to recover a really broken machine.
|
|
|
*/
|
|
|
if (execute_command) {
|
|
|
- if (!run_init_process(execute_command))
|
|
|
+ ret = run_init_process(execute_command);
|
|
|
+ if (!ret)
|
|
|
return 0;
|
|
|
- pr_err("Failed to execute %s. Attempting defaults...\n",
|
|
|
- execute_command);
|
|
|
+ pr_err("Failed to execute %s (error %d). Attempting defaults...\n",
|
|
|
+ execute_command, ret);
|
|
|
}
|
|
|
- if (!run_init_process("/sbin/init") ||
|
|
|
- !run_init_process("/etc/init") ||
|
|
|
- !run_init_process("/bin/init") ||
|
|
|
- !run_init_process("/bin/sh"))
|
|
|
+ if (!try_to_run_init_process("/sbin/init") ||
|
|
|
+ !try_to_run_init_process("/etc/init") ||
|
|
|
+ !try_to_run_init_process("/bin/init") ||
|
|
|
+ !try_to_run_init_process("/bin/sh"))
|
|
|
return 0;
|
|
|
|
|
|
- panic("No init found. Try passing init= option to kernel. "
|
|
|
+ panic("No working init found. Try passing init= option to kernel. "
|
|
|
"See Linux Documentation/init.txt for guidance.");
|
|
|
}
|
|
|
|