|
2 | 2 | #include <linux/unistd.h> |
3 | 3 | #include <linux/kernel.h> |
4 | 4 | #include <linux/fs.h> |
5 | | -#include <linux/minix_fs.h> |
6 | | -#include <linux/romfs_fs.h> |
7 | 5 | #include <linux/initrd.h> |
8 | | -#include <linux/sched.h> |
9 | | -#include <linux/freezer.h> |
10 | | -#include <linux/kmod.h> |
11 | | -#include <uapi/linux/mount.h> |
12 | 6 |
|
13 | 7 | #include "do_mounts.h" |
14 | 8 |
|
15 | 9 | unsigned long initrd_start, initrd_end; |
16 | 10 | int initrd_below_start_ok; |
17 | | -static unsigned int real_root_dev; /* do_proc_dointvec cannot handle kdev_t */ |
18 | 11 | static int __initdata mount_initrd = 1; |
19 | 12 |
|
20 | 13 | phys_addr_t phys_initrd_start __initdata; |
21 | 14 | unsigned long phys_initrd_size __initdata; |
22 | 15 |
|
23 | | -#ifdef CONFIG_SYSCTL |
24 | | -static const struct ctl_table kern_do_mounts_initrd_table[] = { |
25 | | - { |
26 | | - .procname = "real-root-dev", |
27 | | - .data = &real_root_dev, |
28 | | - .maxlen = sizeof(int), |
29 | | - .mode = 0644, |
30 | | - .proc_handler = proc_dointvec, |
31 | | - }, |
32 | | -}; |
33 | | - |
34 | | -static __init int kernel_do_mounts_initrd_sysctls_init(void) |
35 | | -{ |
36 | | - register_sysctl_init("kernel", kern_do_mounts_initrd_table); |
37 | | - return 0; |
38 | | -} |
39 | | -late_initcall(kernel_do_mounts_initrd_sysctls_init); |
40 | | -#endif /* CONFIG_SYSCTL */ |
41 | | - |
42 | 16 | static int __init no_initrd(char *str) |
43 | 17 | { |
| 18 | + pr_warn("noinitrd option is deprecated and will be removed soon\n"); |
44 | 19 | mount_initrd = 0; |
45 | 20 | return 1; |
46 | 21 | } |
@@ -70,85 +45,19 @@ static int __init early_initrd(char *p) |
70 | 45 | } |
71 | 46 | early_param("initrd", early_initrd); |
72 | 47 |
|
73 | | -static int __init init_linuxrc(struct subprocess_info *info, struct cred *new) |
74 | | -{ |
75 | | - ksys_unshare(CLONE_FS | CLONE_FILES); |
76 | | - console_on_rootfs(); |
77 | | - /* move initrd over / and chdir/chroot in initrd root */ |
78 | | - init_chdir("/root"); |
79 | | - init_mount(".", "/", NULL, MS_MOVE, NULL); |
80 | | - init_chroot("."); |
81 | | - ksys_setsid(); |
82 | | - return 0; |
83 | | -} |
84 | | - |
85 | | -static void __init handle_initrd(char *root_device_name) |
86 | | -{ |
87 | | - struct subprocess_info *info; |
88 | | - static char *argv[] = { "linuxrc", NULL, }; |
89 | | - extern char *envp_init[]; |
90 | | - int error; |
91 | | - |
92 | | - pr_warn("using deprecated initrd support, will be removed soon.\n"); |
93 | | - |
94 | | - real_root_dev = new_encode_dev(ROOT_DEV); |
95 | | - create_dev("/dev/root.old", Root_RAM0); |
96 | | - /* mount initrd on rootfs' /root */ |
97 | | - mount_root_generic("/dev/root.old", root_device_name, |
98 | | - root_mountflags & ~MS_RDONLY); |
99 | | - init_mkdir("/old", 0700); |
100 | | - init_chdir("/old"); |
101 | | - |
102 | | - info = call_usermodehelper_setup("/linuxrc", argv, envp_init, |
103 | | - GFP_KERNEL, init_linuxrc, NULL, NULL); |
104 | | - if (!info) |
105 | | - return; |
106 | | - call_usermodehelper_exec(info, UMH_WAIT_PROC|UMH_FREEZABLE); |
107 | | - |
108 | | - /* move initrd to rootfs' /old */ |
109 | | - init_mount("..", ".", NULL, MS_MOVE, NULL); |
110 | | - /* switch root and cwd back to / of rootfs */ |
111 | | - init_chroot(".."); |
112 | | - |
113 | | - if (new_decode_dev(real_root_dev) == Root_RAM0) { |
114 | | - init_chdir("/old"); |
115 | | - return; |
116 | | - } |
117 | | - |
118 | | - init_chdir("/"); |
119 | | - ROOT_DEV = new_decode_dev(real_root_dev); |
120 | | - mount_root(root_device_name); |
121 | | - |
122 | | - printk(KERN_NOTICE "Trying to move old root to /initrd ... "); |
123 | | - error = init_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL); |
124 | | - if (!error) |
125 | | - printk("okay\n"); |
126 | | - else { |
127 | | - if (error == -ENOENT) |
128 | | - printk("/initrd does not exist. Ignored.\n"); |
129 | | - else |
130 | | - printk("failed\n"); |
131 | | - printk(KERN_NOTICE "Unmounting old root\n"); |
132 | | - init_umount("/old", MNT_DETACH); |
133 | | - } |
134 | | -} |
135 | | - |
136 | | -bool __init initrd_load(char *root_device_name) |
| 48 | +void __init initrd_load(void) |
137 | 49 | { |
138 | 50 | if (mount_initrd) { |
139 | 51 | create_dev("/dev/ram", Root_RAM0); |
140 | 52 | /* |
141 | | - * Load the initrd data into /dev/ram0. Execute it as initrd |
142 | | - * unless /dev/ram0 is supposed to be our actual root device, |
143 | | - * in that case the ram disk is just set up here, and gets |
144 | | - * mounted in the normal path. |
| 53 | + * Load the initrd data into /dev/ram0. |
145 | 54 | */ |
146 | | - if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) { |
147 | | - init_unlink("/initrd.image"); |
148 | | - handle_initrd(root_device_name); |
149 | | - return true; |
| 55 | + if (rd_load_image()) { |
| 56 | + pr_warn("using deprecated initrd support, will be removed in January 2027; " |
| 57 | + "use initramfs instead or (as a last resort) /sys/firmware/initrd; " |
| 58 | + "see section \"Workaround\" in " |
| 59 | + "https://lore.kernel.org/lkml/20251010094047.3111495-1-safinaskar@gmail.com\n"); |
150 | 60 | } |
151 | 61 | } |
152 | 62 | init_unlink("/initrd.image"); |
153 | | - return false; |
154 | 63 | } |
0 commit comments