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 @@ -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) {