summaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorJeffy Chen <jeffy.chen@rock-chips.com>2018-12-15 21:24:07 +0800
committerTao Huang <huangtao@rock-chips.com>2018-12-18 14:50:55 +0800
commitff12055f9820ac8af620050f5d75e157a9a2fca3 (patch)
tree256376285ccda3954bdf7375b8736ee56ab124fa /init
parentb41c3c70fb533e1602d65c851af2b606be7523e9 (diff)
init/initramfs: Add dump_initrd command line option
Add a dump_initrd option to allow dumping /initrd.image after successful unpack. Require BLK_DEV_RAM=y. Change-Id: I77a41867afa7b4a51604a5153792a49efbab6189 Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Diffstat (limited to 'init')
-rw-r--r--init/initramfs.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/init/initramfs.c b/init/initramfs.c
index 3340bf219a20..d53138c40639 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -525,6 +525,17 @@ static int __init retain_initrd_param(char *str)
}
__setup("retain_initrd", retain_initrd_param);
+static int __initdata do_dump_initrd;
+
+static int __init dump_initrd_param(char *str)
+{
+ if (*str)
+ return 0;
+ do_dump_initrd = 1;
+ return 1;
+}
+__setup("dump_initrd", dump_initrd_param);
+
extern char __initramfs_start[];
extern unsigned long __initramfs_size;
#include <linux/initrd.h>
@@ -642,6 +653,9 @@ static int __init populate_rootfs(void)
err = unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start);
if (!err) {
+ if (do_dump_initrd)
+ goto dump;
+
free_initrd();
goto done;
} else {
@@ -650,6 +664,7 @@ static int __init populate_rootfs(void)
}
printk(KERN_INFO "rootfs image is not initramfs (%s)"
"; looks like an initrd\n", err);
+ dump:
fd = sys_open("/initrd.image",
O_WRONLY|O_CREAT, 0700);
if (fd >= 0) {