init: early_userspace: Mount Early Services partition early

Early Services needs early services partition to be mounted
early and launching of early init should happen early.

Change-Id: I2f2a79b9be00b48eb293d0f22a92f80474a32c03
Signed-off-by: Venkata Rao Kakani <vkakani@codeaurora.org>
tirimbino
Venkata Rao Kakani 5 years ago committed by Gerrit - the friendly Code Review server
parent 4d044fea97
commit cb7c1ddc02
  1. 8
      Makefile
  2. 1
      include/linux/init.h
  3. 80
      init/do_mounts.c
  4. 1
      init/main.c

@ -430,6 +430,14 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-Werror-implicit-function-declaration \
-Wno-format-security \
-std=gnu89
ifeq ($(TARGET_BOARD_TYPE),auto)
KBUILD_CFLAGS += -DCONFIG_PLATFORM_AUTO
endif
ifeq ($(CONFIG_EARLY_INIT),true)
KBUILD_CFLAGS += -DCONFIG_EARLY_SERVICES
endif
KBUILD_CPPFLAGS := -D__KERNEL__
KBUILD_AFLAGS_KERNEL :=
KBUILD_CFLAGS_KERNEL :=

@ -133,6 +133,7 @@ extern unsigned int reset_devices;
/* used by init/main.c */
void setup_arch(char **);
void prepare_namespace(void);
void __init launch_early_services(void);
void __init load_default_modules(void);
int __init init_rootfs(void);

@ -42,7 +42,13 @@ int root_mountflags = MS_RDONLY | MS_SILENT;
static char * __initdata root_device_name;
static char __initdata saved_root_name[64];
static int root_wait;
#ifdef CONFIG_EARLY_SERVICES
static char saved_modem_name[64] __initdata;
static char saved_early_userspace[64] __initdata;
static char init_prog[128] = "/early_services/init_early";
static char *init_prog_argv[2] = { init_prog, NULL };
#define EARLY_SERVICES_MOUNT_POINT "/early_services"
#endif
dev_t ROOT_DEV;
static int __init load_ramdisk(char *str)
@ -299,6 +305,22 @@ static int __init root_dev_setup(char *line)
__setup("root=", root_dev_setup);
#ifdef CONFIG_EARLY_SERVICES
static int __init modem_dev_setup(char *line)
{
strlcpy(saved_modem_name, line, sizeof(saved_modem_name));
return 1;
}
__setup("modem=", modem_dev_setup);
static int __init early_userspace_setup(char *line)
{
strlcpy(saved_early_userspace, line, sizeof(saved_early_userspace));
return 1;
}
__setup("early_userspace=", early_userspace_setup);
#endif
static int __init rootwait_setup(char *str)
{
if (*str)
@ -387,7 +409,22 @@ static int __init do_mount_root(char *name, char *fs, int flags, void *data)
return 0;
}
#ifdef CONFIG_EARLY_SERVICES
static int __init do_mount_part(char *name, char *fs, int flags,
void *data, char *mnt_point)
{
int err;
err = sys_mount((char __user *)name, (char __user *)mnt_point,
(char __user *)fs, (unsigned long)flags,
(void __user *)data);
if (err) {
pr_err("Mount Partition [%s] failed[%d]\n", name, err);
return err;
}
return 0;
}
#endif
void __init mount_block_root(char *name, int flags)
{
struct page *page = alloc_page(GFP_KERNEL);
@ -552,6 +589,47 @@ void __init mount_root(void)
#endif
}
#ifdef CONFIG_EARLY_SERVICES
static int __init mount_partition(char *part_name, char *mnt_point)
{
struct page *page = alloc_page(GFP_KERNEL);
char *fs_names = page_address(page);
char *p;
int err = -EPERM;
get_fs_names(fs_names);
for (p = fs_names; *p; p += strlen(p)+1) {
err = do_mount_part(part_name, p, root_mountflags,
NULL, mnt_point);
switch (err) {
case 0:
return err;
case -EACCES:
case -EINVAL:
continue;
}
printk_all_partitions();
return err;
}
return err;
}
void __init launch_early_services(void)
{
int rc = 0;
rc = mount_partition(saved_early_userspace, EARLY_SERVICES_MOUNT_POINT);
place_marker("Early Services Partition ready");
if (!rc) {
rc = call_usermodehelper(init_prog, init_prog_argv, NULL, 0);
if (!rc)
pr_info("early_init launched\n");
else
pr_err("early_init failed\n");
}
}
#else
void __init launch_early_services(void) { }
#endif
/*
* Prepare the namespace - decide what/where to mount, load ramdisks, etc.
*/

@ -1092,6 +1092,7 @@ static noinline void __init kernel_init_freeable(void)
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
ramdisk_execute_command = NULL;
prepare_namespace();
launch_early_services();
}
/*

Loading…
Cancel
Save