Commit ffdfc409 authored by Olof Johansson's avatar Olof Johansson Committed by Linus Torvalds

[PATCH] Add rdinit parameter to pick early userspace init

Since early userspace was added, there's no way to override which init to
run from it.  Some people tack on an extra cpio archive with a link from
/init depending on what they want to run, but that's sometimes impractical.

Changing the "init=" to also override the early userspace isn't feasible,
since it is still used to indicate what init to run from disk when early
userspace has completed doing whatever it's doing (i.e.  load filesystem
modules and drivers).

Instead, introduce "rdinit=" and make it override the default "/init" if
specified.
Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2b579bee
...@@ -1174,6 +1174,11 @@ running once the system is up. ...@@ -1174,6 +1174,11 @@ running once the system is up.
New name for the ramdisk parameter. New name for the ramdisk parameter.
See Documentation/ramdisk.txt. See Documentation/ramdisk.txt.
rdinit= [KNL]
Format: <full_path>
Run specified binary instead of /init from the ramdisk,
used for early userspace startup. See initrd.
reboot= [BUGS=IA-32,BUGS=ARM,BUGS=IA-64] Rebooting mode reboot= [BUGS=IA-32,BUGS=ARM,BUGS=IA-64] Rebooting mode
Format: <reboot_mode>[,<reboot_mode2>[,...]] Format: <reboot_mode>[,<reboot_mode2>[,...]]
See arch/*/kernel/reboot.c. See arch/*/kernel/reboot.c.
......
...@@ -123,6 +123,7 @@ extern void softirq_init(void); ...@@ -123,6 +123,7 @@ extern void softirq_init(void);
char saved_command_line[COMMAND_LINE_SIZE]; char saved_command_line[COMMAND_LINE_SIZE];
static char *execute_command; static char *execute_command;
static char *ramdisk_execute_command;
/* Setup configured maximum number of CPUs to activate */ /* Setup configured maximum number of CPUs to activate */
static unsigned int max_cpus = NR_CPUS; static unsigned int max_cpus = NR_CPUS;
...@@ -297,6 +298,18 @@ static int __init init_setup(char *str) ...@@ -297,6 +298,18 @@ static int __init init_setup(char *str)
} }
__setup("init=", init_setup); __setup("init=", init_setup);
static int __init rdinit_setup(char *str)
{
unsigned int i;
ramdisk_execute_command = str;
/* See "auto" comment in init_setup */
for (i = 1; i < MAX_INIT_ARGS; i++)
argv_init[i] = NULL;
return 1;
}
__setup("rdinit=", rdinit_setup);
extern void setup_arch(char **); extern void setup_arch(char **);
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
...@@ -681,10 +694,14 @@ static int init(void * unused) ...@@ -681,10 +694,14 @@ static int init(void * unused)
* check if there is an early userspace init. If yes, let it do all * check if there is an early userspace init. If yes, let it do all
* the work * the work
*/ */
if (sys_access((const char __user *) "/init", 0) == 0)
execute_command = "/init"; if (!ramdisk_execute_command)
else ramdisk_execute_command = "/init";
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
ramdisk_execute_command = NULL;
prepare_namespace(); prepare_namespace();
}
/* /*
* Ok, we have completed the initial bootup, and * Ok, we have completed the initial bootup, and
...@@ -702,6 +719,12 @@ static int init(void * unused) ...@@ -702,6 +719,12 @@ static int init(void * unused)
(void) sys_dup(0); (void) sys_dup(0);
(void) sys_dup(0); (void) sys_dup(0);
if (ramdisk_execute_command) {
run_init_process(ramdisk_execute_command);
printk(KERN_WARNING "Failed to execute %s\n",
ramdisk_execute_command);
}
/* /*
* We try each of these until one succeeds. * We try each of these until one succeeds.
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment