Blame view
init/do_mounts_initrd.c
3.47 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
c67e5382f init: disable spa... |
2 3 4 5 6 7 8 9 10 |
/* * Many of the syscalls used in this file expect some of the arguments * to be __user pointers not __kernel pointers. To limit the sparse * noise, turn off sparse checking for this file. */ #ifdef __CHECKER__ #undef __CHECKER__ #warning "Sparse checking disabled for this file" #endif |
1da177e4c Linux-2.6.12-rc2 |
11 12 13 14 |
#include <linux/unistd.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/minix_fs.h> |
1da177e4c Linux-2.6.12-rc2 |
15 16 17 |
#include <linux/romfs_fs.h> #include <linux/initrd.h> #include <linux/sched.h> |
7dfb71030 [PATCH] Add inclu... |
18 |
#include <linux/freezer.h> |
ba4df2808 don't bother with... |
19 |
#include <linux/kmod.h> |
1da177e4c Linux-2.6.12-rc2 |
20 21 22 23 24 25 |
#include "do_mounts.h" unsigned long initrd_start, initrd_end; int initrd_below_start_ok; unsigned int real_root_dev; /* do_proc_dointvec cannot handle kdev_t */ |
1da177e4c Linux-2.6.12-rc2 |
26 27 28 29 30 31 32 33 34 |
static int __initdata mount_initrd = 1; static int __init no_initrd(char *str) { mount_initrd = 0; return 1; } __setup("noinitrd", no_initrd); |
ba4df2808 don't bother with... |
35 |
static int init_linuxrc(struct subprocess_info *info, struct cred *new) |
1da177e4c Linux-2.6.12-rc2 |
36 |
{ |
ba4df2808 don't bother with... |
37 |
sys_unshare(CLONE_FS | CLONE_FILES); |
43b168202 make sure that /l... |
38 39 40 41 |
/* stdin/stdout/stderr for /linuxrc */ sys_open("/dev/console", O_RDWR, 0); sys_dup(0); sys_dup(0); |
ba4df2808 don't bother with... |
42 43 44 45 |
/* move initrd over / and chdir/chroot in initrd root */ sys_chdir("/root"); sys_mount(".", "/", NULL, MS_MOVE, NULL); sys_chroot("."); |
1da177e4c Linux-2.6.12-rc2 |
46 |
sys_setsid(); |
ba4df2808 don't bother with... |
47 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
48 49 50 51 |
} static void __init handle_initrd(void) { |
907ed1328 usermodehelper: s... |
52 |
struct subprocess_info *info; |
ba4df2808 don't bother with... |
53 54 |
static char *argv[] = { "linuxrc", NULL, }; extern char *envp_init[]; |
1da177e4c Linux-2.6.12-rc2 |
55 |
int error; |
1da177e4c Linux-2.6.12-rc2 |
56 57 |
real_root_dev = new_encode_dev(ROOT_DEV); |
bdaf85293 [PATCH] devfs: Re... |
58 |
create_dev("/dev/root.old", Root_RAM0); |
1da177e4c Linux-2.6.12-rc2 |
59 60 61 |
/* mount initrd on rootfs' /root */ mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY); sys_mkdir("/old", 0700); |
ba4df2808 don't bother with... |
62 |
sys_chdir("/old"); |
1da177e4c Linux-2.6.12-rc2 |
63 |
|
bb813f4c9 init, block: try ... |
64 65 |
/* try loading default modules from initrd */ load_default_modules(); |
8baabde66 Freezer: Fix s2di... |
66 67 68 69 70 |
/* * In case that a resume from disk is carried out by linuxrc or one of * its children, we need to tell the freezer not to wait for us. */ current->flags |= PF_FREEZER_SKIP; |
907ed1328 usermodehelper: s... |
71 72 73 74 75 |
info = call_usermodehelper_setup("/linuxrc", argv, envp_init, GFP_KERNEL, init_linuxrc, NULL, NULL); if (!info) return; call_usermodehelper_exec(info, UMH_WAIT_PROC); |
8baabde66 Freezer: Fix s2di... |
76 77 |
current->flags &= ~PF_FREEZER_SKIP; |
1da177e4c Linux-2.6.12-rc2 |
78 79 |
/* move initrd to rootfs' /old */ |
ba4df2808 don't bother with... |
80 |
sys_mount("..", ".", NULL, MS_MOVE, NULL); |
1da177e4c Linux-2.6.12-rc2 |
81 |
/* switch root and cwd back to / of rootfs */ |
ba4df2808 don't bother with... |
82 |
sys_chroot(".."); |
1da177e4c Linux-2.6.12-rc2 |
83 84 85 86 87 |
if (new_decode_dev(real_root_dev) == Root_RAM0) { sys_chdir("/old"); return; } |
ba4df2808 don't bother with... |
88 |
sys_chdir("/"); |
1da177e4c Linux-2.6.12-rc2 |
89 90 91 92 93 94 95 96 97 98 |
ROOT_DEV = new_decode_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 "); else { int fd = sys_open("/dev/root.old", O_RDWR, 0); |
f220ab2a5 [PATCH] Improper ... |
99 100 101 102 103 104 |
if (error == -ENOENT) printk("/initrd does not exist. Ignored. "); else printk("failed "); |
1da177e4c Linux-2.6.12-rc2 |
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
printk(KERN_NOTICE "Unmounting old root "); 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); sys_close(fd); } printk(!error ? "okay " : "failed "); } } |
f057f3b22 init/do_mounts: i... |
120 |
bool __init initrd_load(void) |
1da177e4c Linux-2.6.12-rc2 |
121 122 |
{ if (mount_initrd) { |
bdaf85293 [PATCH] devfs: Re... |
123 |
create_dev("/dev/ram", Root_RAM0); |
1da177e4c Linux-2.6.12-rc2 |
124 125 126 127 128 129 130 131 132 |
/* * 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("/initrd.image") && ROOT_DEV != Root_RAM0) { sys_unlink("/initrd.image"); handle_initrd(); |
f057f3b22 init/do_mounts: i... |
133 |
return true; |
1da177e4c Linux-2.6.12-rc2 |
134 135 136 |
} } sys_unlink("/initrd.image"); |
f057f3b22 init/do_mounts: i... |
137 |
return false; |
1da177e4c Linux-2.6.12-rc2 |
138 |
} |