diff --git a/init/initramfs.c b/init/initramfs.c index 2531811..3bc1ea3 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -575,11 +575,16 @@ static int __init populate_rootfs(void) if (err) panic(err); /* Failed to decompress INTERNAL initramfs */ if (initrd_start) { + unsigned len = initrd_end - initrd_start; #ifdef CONFIG_BLK_DEV_RAM int fd; + + if ((len > (100*(1 << 20))) && + ((nr_free_pages() << (PAGE_SHIFT-10)) < (768*(1 << 20))) + panic("here's a nickle, buy a better computer..."); + printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n"); - err = unpack_to_rootfs((char *)initrd_start, - initrd_end - initrd_start); + err = unpack_to_rootfs((char *)initrd_start, len); if (!err) { free_initrd(); return 0; @@ -592,15 +597,13 @@ static int __init populate_rootfs(void) fd = sys_open((const char __user __force *) "/initrd.image", O_WRONLY|O_CREAT, 0700); if (fd >= 0) { - sys_write(fd, (char *)initrd_start, - initrd_end - initrd_start); + sys_write(fd, (char *)initrd_start, len); sys_close(fd); free_initrd(); } #else printk(KERN_INFO "Unpacking initramfs...\n"); - err = unpack_to_rootfs((char *)initrd_start, - initrd_end - initrd_start); + err = unpack_to_rootfs((char *)initrd_start, len); if (err) printk(KERN_EMERG "Initramfs unpacking failed: %s\n", err); free_initrd();