diff options
Diffstat (limited to 'init')
-rw-r--r-- | init/main.c | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/init/main.c b/init/main.c index ff410063e4e1..f142d4035341 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -123,6 +123,7 @@ extern void softirq_init(void); | |||
123 | char saved_command_line[COMMAND_LINE_SIZE]; | 123 | char saved_command_line[COMMAND_LINE_SIZE]; |
124 | 124 | ||
125 | static char *execute_command; | 125 | static char *execute_command; |
126 | static char *ramdisk_execute_command; | ||
126 | 127 | ||
127 | /* Setup configured maximum number of CPUs to activate */ | 128 | /* Setup configured maximum number of CPUs to activate */ |
128 | static unsigned int max_cpus = NR_CPUS; | 129 | static unsigned int max_cpus = NR_CPUS; |
@@ -297,6 +298,18 @@ static int __init init_setup(char *str) | |||
297 | } | 298 | } |
298 | __setup("init=", init_setup); | 299 | __setup("init=", init_setup); |
299 | 300 | ||
301 | static int __init rdinit_setup(char *str) | ||
302 | { | ||
303 | unsigned int i; | ||
304 | |||
305 | ramdisk_execute_command = str; | ||
306 | /* See "auto" comment in init_setup */ | ||
307 | for (i = 1; i < MAX_INIT_ARGS; i++) | ||
308 | argv_init[i] = NULL; | ||
309 | return 1; | ||
310 | } | ||
311 | __setup("rdinit=", rdinit_setup); | ||
312 | |||
300 | extern void setup_arch(char **); | 313 | extern void setup_arch(char **); |
301 | 314 | ||
302 | #ifndef CONFIG_SMP | 315 | #ifndef CONFIG_SMP |
@@ -614,6 +627,7 @@ static void do_pre_smp_initcalls(void) | |||
614 | migration_init(); | 627 | migration_init(); |
615 | #endif | 628 | #endif |
616 | spawn_ksoftirqd(); | 629 | spawn_ksoftirqd(); |
630 | spawn_softlockup_task(); | ||
617 | } | 631 | } |
618 | 632 | ||
619 | static void run_init_process(char *init_filename) | 633 | static void run_init_process(char *init_filename) |
@@ -680,10 +694,14 @@ static int init(void * unused) | |||
680 | * check if there is an early userspace init. If yes, let it do all | 694 | * check if there is an early userspace init. If yes, let it do all |
681 | * the work | 695 | * the work |
682 | */ | 696 | */ |
683 | if (sys_access((const char __user *) "/init", 0) == 0) | 697 | |
684 | execute_command = "/init"; | 698 | if (!ramdisk_execute_command) |
685 | else | 699 | ramdisk_execute_command = "/init"; |
700 | |||
701 | if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) { | ||
702 | ramdisk_execute_command = NULL; | ||
686 | prepare_namespace(); | 703 | prepare_namespace(); |
704 | } | ||
687 | 705 | ||
688 | /* | 706 | /* |
689 | * Ok, we have completed the initial bootup, and | 707 | * Ok, we have completed the initial bootup, and |
@@ -700,17 +718,24 @@ static int init(void * unused) | |||
700 | 718 | ||
701 | (void) sys_dup(0); | 719 | (void) sys_dup(0); |
702 | (void) sys_dup(0); | 720 | (void) sys_dup(0); |
703 | 721 | ||
722 | if (ramdisk_execute_command) { | ||
723 | run_init_process(ramdisk_execute_command); | ||
724 | printk(KERN_WARNING "Failed to execute %s\n", | ||
725 | ramdisk_execute_command); | ||
726 | } | ||
727 | |||
704 | /* | 728 | /* |
705 | * We try each of these until one succeeds. | 729 | * We try each of these until one succeeds. |
706 | * | 730 | * |
707 | * The Bourne shell can be used instead of init if we are | 731 | * The Bourne shell can be used instead of init if we are |
708 | * trying to recover a really broken machine. | 732 | * trying to recover a really broken machine. |
709 | */ | 733 | */ |
710 | 734 | if (execute_command) { | |
711 | if (execute_command) | ||
712 | run_init_process(execute_command); | 735 | run_init_process(execute_command); |
713 | 736 | printk(KERN_WARNING "Failed to execute %s. Attempting " | |
737 | "defaults...\n", execute_command); | ||
738 | } | ||
714 | run_init_process("/sbin/init"); | 739 | run_init_process("/sbin/init"); |
715 | run_init_process("/etc/init"); | 740 | run_init_process("/etc/init"); |
716 | run_init_process("/bin/init"); | 741 | run_init_process("/bin/init"); |