diff options
author | Linus Torvalds <torvalds@home.transmeta.com> | 2003-04-25 21:43:07 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-04-25 21:43:07 -0700 |
commit | 82b1eaed788ce5619c6ffdf83aa0913c0066d4e8 (patch) | |
tree | 6daf2d9f5701fb317cf0426a0a715686b589a3e0 /init | |
parent | 7f15afe8354c8ae0976121738253bfa7328022ac (diff) | |
download | history-82b1eaed788ce5619c6ffdf83aa0913c0066d4e8.tar.gz |
Fix up some mixing of ramdisk/initrd. They have nothing in common,
but the build was confused by the fact that they did share some files.
Move INITRD code from do_mounts_rd.c to new file do_mounts_initrd.c.
Diffstat (limited to 'init')
-rw-r--r-- | init/Makefile | 1 | ||||
-rw-r--r-- | init/do_mounts_initrd.c | 115 | ||||
-rw-r--r-- | init/do_mounts_rd.c | 109 |
3 files changed, 116 insertions, 109 deletions
diff --git a/init/Makefile b/init/Makefile index eccdb205754d21..8c30e0e377da9b 100644 --- a/init/Makefile +++ b/init/Makefile @@ -6,6 +6,7 @@ obj-y := main.o version.o mounts.o initramfs.o mounts-y := do_mounts.o mounts-$(CONFIG_DEVFS_FS) += do_mounts_devfs.o mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o +mounts-$(CONFIG_BLK_DEV_INITRD) += do_mounts_initrd.o mounts-$(CONFIG_BLK_DEV_MD) += do_mounts_md.o # files to be removed upon make clean diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c new file mode 100644 index 00000000000000..1bf482c1406cef --- /dev/null +++ b/init/do_mounts_initrd.c @@ -0,0 +1,115 @@ + +#include <linux/kernel.h> +#include <linux/fs.h> +#include <linux/minix_fs.h> +#include <linux/ext2_fs.h> +#include <linux/romfs_fs.h> +#include <linux/initrd.h> + +#include "do_mounts.h" + +unsigned int real_root_dev; /* do_proc_dointvec cannot handle kdev_t */ +static int __initdata old_fd, root_fd; +static int __initdata mount_initrd = 1; + +static int __init no_initrd(char *str) +{ + mount_initrd = 0; + return 1; +} + +__setup("noinitrd", no_initrd); + +static int __init do_linuxrc(void * shell) +{ + static char *argv[] = { "linuxrc", NULL, }; + extern char * envp_init[]; + + close(old_fd);close(root_fd); + close(0);close(1);close(2); + setsid(); + (void) open("/dev/console",O_RDWR,0); + (void) dup(0); + (void) dup(0); + return execve(shell, argv, envp_init); +} + +static void __init handle_initrd(void) +{ + int error; + int i, pid; + + real_root_dev = ROOT_DEV; + create_dev("/dev/root.old", Root_RAM0, NULL); + /* mount initrd on rootfs' /root */ + mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY); + sys_mkdir("/old", 0700); + root_fd = open("/", 0, 0); + old_fd = open("/old", 0, 0); + /* move initrd over / and chdir/chroot in initrd root */ + sys_chdir("/root"); + sys_mount(".", "/", NULL, MS_MOVE, NULL); + sys_chroot("."); + mount_devfs_fs (); + + pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); + if (pid > 0) { + while (pid != waitpid(-1, &i, 0)) + yield(); + } + + /* move initrd to rootfs' /old */ + sys_fchdir(old_fd); + sys_mount("/", ".", NULL, MS_MOVE, NULL); + /* switch root and cwd back to / of rootfs */ + sys_fchdir(root_fd); + sys_chroot("."); + close(old_fd); + close(root_fd); + umount_devfs("/old/dev"); + + if (real_root_dev == Root_RAM0) { + sys_chdir("/old"); + return; + } + + ROOT_DEV = real_root_dev; + mount_root(); + + printk(KERN_NOTICE "Trying to move old root to /initrd ... "); + error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL); + if (!error) + printk("okay\n"); + else { + int fd = open("/dev/root.old", O_RDWR, 0); + printk("failed\n"); + printk(KERN_NOTICE "Unmounting old root\n"); + sys_umount("/old", MNT_DETACH); + printk(KERN_NOTICE "Trying to free ramdisk memory ... "); + if (fd < 0) { + error = fd; + } else { + error = sys_ioctl(fd, BLKFLSBUF, 0); + close(fd); + } + printk(!error ? "okay\n" : "failed\n"); + } +} + +int __init initrd_load(void) +{ + if (!mount_initrd) + return 0; + + create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, 0), NULL); + create_dev("/dev/initrd", MKDEV(RAMDISK_MAJOR, INITRD_MINOR), NULL); + /* Load the initrd data into /dev/ram0. Execute it as initrd unless + * /dev/ram0 is supposed to be our actual root device, in + * that case the ram disk is just set up here, and gets + * mounted in the normal path. */ + if (rd_load_image("/dev/initrd") && ROOT_DEV != Root_RAM0) { + handle_initrd(); + return 1; + } + return 0; +} diff --git a/init/do_mounts_rd.c b/init/do_mounts_rd.c index 0057b1c6f19b47..33dbb38ae80bbf 100644 --- a/init/do_mounts_rd.c +++ b/init/do_mounts_rd.c @@ -248,115 +248,6 @@ int __init rd_load_disk(int n) return rd_load_image("/dev/root"); } -#ifdef CONFIG_BLK_DEV_INITRD - -unsigned int real_root_dev; /* do_proc_dointvec cannot handle kdev_t */ -static int __initdata old_fd, root_fd; -static int __initdata mount_initrd = 1; - -static int __init no_initrd(char *str) -{ - mount_initrd = 0; - return 1; -} - -__setup("noinitrd", no_initrd); - -static int __init do_linuxrc(void * shell) -{ - static char *argv[] = { "linuxrc", NULL, }; - extern char * envp_init[]; - - close(old_fd);close(root_fd); - close(0);close(1);close(2); - setsid(); - (void) open("/dev/console",O_RDWR,0); - (void) dup(0); - (void) dup(0); - return execve(shell, argv, envp_init); -} - -static void __init handle_initrd(void) -{ - int error; - int i, pid; - - real_root_dev = ROOT_DEV; - create_dev("/dev/root.old", Root_RAM0, NULL); - /* mount initrd on rootfs' /root */ - mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY); - sys_mkdir("/old", 0700); - root_fd = open("/", 0, 0); - old_fd = open("/old", 0, 0); - /* move initrd over / and chdir/chroot in initrd root */ - sys_chdir("/root"); - sys_mount(".", "/", NULL, MS_MOVE, NULL); - sys_chroot("."); - mount_devfs_fs (); - - pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); - if (pid > 0) { - while (pid != waitpid(-1, &i, 0)) - yield(); - } - - /* move initrd to rootfs' /old */ - sys_fchdir(old_fd); - sys_mount("/", ".", NULL, MS_MOVE, NULL); - /* switch root and cwd back to / of rootfs */ - sys_fchdir(root_fd); - sys_chroot("."); - close(old_fd); - close(root_fd); - umount_devfs("/old/dev"); - - if (real_root_dev == Root_RAM0) { - sys_chdir("/old"); - return; - } - - ROOT_DEV = real_root_dev; - mount_root(); - - printk(KERN_NOTICE "Trying to move old root to /initrd ... "); - error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL); - if (!error) - printk("okay\n"); - else { - int fd = open("/dev/root.old", O_RDWR, 0); - printk("failed\n"); - printk(KERN_NOTICE "Unmounting old root\n"); - sys_umount("/old", MNT_DETACH); - printk(KERN_NOTICE "Trying to free ramdisk memory ... "); - if (fd < 0) { - error = fd; - } else { - error = sys_ioctl(fd, BLKFLSBUF, 0); - close(fd); - } - printk(!error ? "okay\n" : "failed\n"); - } -} - -int __init initrd_load(void) -{ - if (!mount_initrd) - return 0; - - create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, 0), NULL); - create_dev("/dev/initrd", MKDEV(RAMDISK_MAJOR, INITRD_MINOR), NULL); - /* Load the initrd data into /dev/ram0. Execute it as initrd unless - * /dev/ram0 is supposed to be our actual root device, in - * that case the ram disk is just set up here, and gets - * mounted in the normal path. */ - if (rd_load_image("/dev/initrd") && ROOT_DEV != Root_RAM0) { - handle_initrd(); - return 1; - } - return 0; -} -#endif - #ifdef BUILD_CRAMDISK /* |