This source file includes following definitions.
- load_ramdisk
- readonly
- readwrite
- match_dev_by_uuid
- devt_from_partuuid
- match_dev_by_label
- name_to_dev_t
- root_dev_setup
- rootwait_setup
- root_data_setup
- fs_names_setup
- root_delay_setup
- get_fs_names
- do_mount_root
- mount_block_root
- mount_nfs_root
- change_floppy
- mount_root
- prepare_namespace
- rootfs_init_fs_context
- init_rootfs
1
2 #include <linux/module.h>
3 #include <linux/sched.h>
4 #include <linux/ctype.h>
5 #include <linux/fd.h>
6 #include <linux/tty.h>
7 #include <linux/suspend.h>
8 #include <linux/root_dev.h>
9 #include <linux/security.h>
10 #include <linux/delay.h>
11 #include <linux/genhd.h>
12 #include <linux/mount.h>
13 #include <linux/device.h>
14 #include <linux/init.h>
15 #include <linux/fs.h>
16 #include <linux/initrd.h>
17 #include <linux/async.h>
18 #include <linux/fs_struct.h>
19 #include <linux/slab.h>
20 #include <linux/ramfs.h>
21 #include <linux/shmem_fs.h>
22
23 #include <linux/nfs_fs.h>
24 #include <linux/nfs_fs_sb.h>
25 #include <linux/nfs_mount.h>
26 #include <uapi/linux/mount.h>
27
28 #include "do_mounts.h"
29
30 int __initdata rd_doload;
31
32 int root_mountflags = MS_RDONLY | MS_SILENT;
33 static char * __initdata root_device_name;
34 static char __initdata saved_root_name[64];
35 static int root_wait;
36
37 dev_t ROOT_DEV;
38
39 static int __init load_ramdisk(char *str)
40 {
41 rd_doload = simple_strtol(str,NULL,0) & 3;
42 return 1;
43 }
44 __setup("load_ramdisk=", load_ramdisk);
45
46 static int __init readonly(char *str)
47 {
48 if (*str)
49 return 0;
50 root_mountflags |= MS_RDONLY;
51 return 1;
52 }
53
54 static int __init readwrite(char *str)
55 {
56 if (*str)
57 return 0;
58 root_mountflags &= ~MS_RDONLY;
59 return 1;
60 }
61
62 __setup("ro", readonly);
63 __setup("rw", readwrite);
64
65 #ifdef CONFIG_BLOCK
66 struct uuidcmp {
67 const char *uuid;
68 int len;
69 };
70
71
72
73
74
75
76
77
78 static int match_dev_by_uuid(struct device *dev, const void *data)
79 {
80 const struct uuidcmp *cmp = data;
81 struct hd_struct *part = dev_to_part(dev);
82
83 if (!part->info)
84 goto no_match;
85
86 if (strncasecmp(cmp->uuid, part->info->uuid, cmp->len))
87 goto no_match;
88
89 return 1;
90 no_match:
91 return 0;
92 }
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 static dev_t devt_from_partuuid(const char *uuid_str)
109 {
110 dev_t res = 0;
111 struct uuidcmp cmp;
112 struct device *dev = NULL;
113 struct gendisk *disk;
114 struct hd_struct *part;
115 int offset = 0;
116 bool clear_root_wait = false;
117 char *slash;
118
119 cmp.uuid = uuid_str;
120
121 slash = strchr(uuid_str, '/');
122
123 if (slash) {
124 char c = 0;
125
126 if (sscanf(slash + 1,
127 "PARTNROFF=%d%c", &offset, &c) != 1) {
128 clear_root_wait = true;
129 goto done;
130 }
131 cmp.len = slash - uuid_str;
132 } else {
133 cmp.len = strlen(uuid_str);
134 }
135
136 if (!cmp.len) {
137 clear_root_wait = true;
138 goto done;
139 }
140
141 dev = class_find_device(&block_class, NULL, &cmp,
142 &match_dev_by_uuid);
143 if (!dev)
144 goto done;
145
146 res = dev->devt;
147
148
149 if (!offset)
150 goto no_offset;
151
152 res = 0;
153 disk = part_to_disk(dev_to_part(dev));
154 part = disk_get_part(disk, dev_to_part(dev)->partno + offset);
155 if (part) {
156 res = part_devt(part);
157 put_device(part_to_dev(part));
158 }
159
160 no_offset:
161 put_device(dev);
162 done:
163 if (clear_root_wait) {
164 pr_err("VFS: PARTUUID= is invalid.\n"
165 "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n");
166 if (root_wait)
167 pr_err("Disabling rootwait; root= is invalid.\n");
168 root_wait = 0;
169 }
170 return res;
171 }
172
173
174
175
176
177
178
179
180 static int match_dev_by_label(struct device *dev, const void *data)
181 {
182 const char *label = data;
183 struct hd_struct *part = dev_to_part(dev);
184
185 if (part->info && !strcmp(label, part->info->volname))
186 return 1;
187
188 return 0;
189 }
190 #endif
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222 dev_t name_to_dev_t(const char *name)
223 {
224 char s[32];
225 char *p;
226 dev_t res = 0;
227 int part;
228
229 #ifdef CONFIG_BLOCK
230 if (strncmp(name, "PARTUUID=", 9) == 0) {
231 name += 9;
232 res = devt_from_partuuid(name);
233 if (!res)
234 goto fail;
235 goto done;
236 } else if (strncmp(name, "PARTLABEL=", 10) == 0) {
237 struct device *dev;
238
239 dev = class_find_device(&block_class, NULL, name + 10,
240 &match_dev_by_label);
241 if (!dev)
242 goto fail;
243
244 res = dev->devt;
245 put_device(dev);
246 goto done;
247 }
248 #endif
249
250 if (strncmp(name, "/dev/", 5) != 0) {
251 unsigned maj, min, offset;
252 char dummy;
253
254 if ((sscanf(name, "%u:%u%c", &maj, &min, &dummy) == 2) ||
255 (sscanf(name, "%u:%u:%u:%c", &maj, &min, &offset, &dummy) == 3)) {
256 res = MKDEV(maj, min);
257 if (maj != MAJOR(res) || min != MINOR(res))
258 goto fail;
259 } else {
260 res = new_decode_dev(simple_strtoul(name, &p, 16));
261 if (*p)
262 goto fail;
263 }
264 goto done;
265 }
266
267 name += 5;
268 res = Root_NFS;
269 if (strcmp(name, "nfs") == 0)
270 goto done;
271 res = Root_RAM0;
272 if (strcmp(name, "ram") == 0)
273 goto done;
274
275 if (strlen(name) > 31)
276 goto fail;
277 strcpy(s, name);
278 for (p = s; *p; p++)
279 if (*p == '/')
280 *p = '!';
281 res = blk_lookup_devt(s, 0);
282 if (res)
283 goto done;
284
285
286
287
288
289 while (p > s && isdigit(p[-1]))
290 p--;
291 if (p == s || !*p || *p == '0')
292 goto fail;
293
294
295 part = simple_strtoul(p, NULL, 10);
296 *p = '\0';
297 res = blk_lookup_devt(s, part);
298 if (res)
299 goto done;
300
301
302 if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p')
303 goto fail;
304 p[-1] = '\0';
305 res = blk_lookup_devt(s, part);
306 if (res)
307 goto done;
308
309 fail:
310 return 0;
311 done:
312 return res;
313 }
314 EXPORT_SYMBOL_GPL(name_to_dev_t);
315
316 static int __init root_dev_setup(char *line)
317 {
318 strlcpy(saved_root_name, line, sizeof(saved_root_name));
319 return 1;
320 }
321
322 __setup("root=", root_dev_setup);
323
324 static int __init rootwait_setup(char *str)
325 {
326 if (*str)
327 return 0;
328 root_wait = 1;
329 return 1;
330 }
331
332 __setup("rootwait", rootwait_setup);
333
334 static char * __initdata root_mount_data;
335 static int __init root_data_setup(char *str)
336 {
337 root_mount_data = str;
338 return 1;
339 }
340
341 static char * __initdata root_fs_names;
342 static int __init fs_names_setup(char *str)
343 {
344 root_fs_names = str;
345 return 1;
346 }
347
348 static unsigned int __initdata root_delay;
349 static int __init root_delay_setup(char *str)
350 {
351 root_delay = simple_strtoul(str, NULL, 0);
352 return 1;
353 }
354
355 __setup("rootflags=", root_data_setup);
356 __setup("rootfstype=", fs_names_setup);
357 __setup("rootdelay=", root_delay_setup);
358
359 static void __init get_fs_names(char *page)
360 {
361 char *s = page;
362
363 if (root_fs_names) {
364 strcpy(page, root_fs_names);
365 while (*s++) {
366 if (s[-1] == ',')
367 s[-1] = '\0';
368 }
369 } else {
370 int len = get_filesystem_list(page);
371 char *p, *next;
372
373 page[len] = '\0';
374 for (p = page-1; p; p = next) {
375 next = strchr(++p, '\n');
376 if (*p++ != '\t')
377 continue;
378 while ((*s++ = *p++) != '\n')
379 ;
380 s[-1] = '\0';
381 }
382 }
383 *s = '\0';
384 }
385
386 static int __init do_mount_root(char *name, char *fs, int flags, void *data)
387 {
388 struct super_block *s;
389 int err = ksys_mount(name, "/root", fs, flags, data);
390 if (err)
391 return err;
392
393 ksys_chdir("/root");
394 s = current->fs->pwd.dentry->d_sb;
395 ROOT_DEV = s->s_dev;
396 printk(KERN_INFO
397 "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
398 s->s_type->name,
399 sb_rdonly(s) ? " readonly" : "",
400 MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
401 return 0;
402 }
403
404 void __init mount_block_root(char *name, int flags)
405 {
406 struct page *page = alloc_page(GFP_KERNEL);
407 char *fs_names = page_address(page);
408 char *p;
409 #ifdef CONFIG_BLOCK
410 char b[BDEVNAME_SIZE];
411 #else
412 const char *b = name;
413 #endif
414
415 get_fs_names(fs_names);
416 retry:
417 for (p = fs_names; *p; p += strlen(p)+1) {
418 int err = do_mount_root(name, p, flags, root_mount_data);
419 switch (err) {
420 case 0:
421 goto out;
422 case -EACCES:
423 case -EINVAL:
424 continue;
425 }
426
427
428
429
430
431 #ifdef CONFIG_BLOCK
432 __bdevname(ROOT_DEV, b);
433 #endif
434 printk("VFS: Cannot open root device \"%s\" or %s: error %d\n",
435 root_device_name, b, err);
436 printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");
437
438 printk_all_partitions();
439 #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
440 printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "
441 "explicit textual name for \"root=\" boot option.\n");
442 #endif
443 panic("VFS: Unable to mount root fs on %s", b);
444 }
445 if (!(flags & SB_RDONLY)) {
446 flags |= SB_RDONLY;
447 goto retry;
448 }
449
450 printk("List of all partitions:\n");
451 printk_all_partitions();
452 printk("No filesystem could mount root, tried: ");
453 for (p = fs_names; *p; p += strlen(p)+1)
454 printk(" %s", p);
455 printk("\n");
456 #ifdef CONFIG_BLOCK
457 __bdevname(ROOT_DEV, b);
458 #endif
459 panic("VFS: Unable to mount root fs on %s", b);
460 out:
461 put_page(page);
462 }
463
464 #ifdef CONFIG_ROOT_NFS
465
466 #define NFSROOT_TIMEOUT_MIN 5
467 #define NFSROOT_TIMEOUT_MAX 30
468 #define NFSROOT_RETRY_MAX 5
469
470 static int __init mount_nfs_root(void)
471 {
472 char *root_dev, *root_data;
473 unsigned int timeout;
474 int try, err;
475
476 err = nfs_root_data(&root_dev, &root_data);
477 if (err != 0)
478 return 0;
479
480
481
482
483
484
485 timeout = NFSROOT_TIMEOUT_MIN;
486 for (try = 1; ; try++) {
487 err = do_mount_root(root_dev, "nfs",
488 root_mountflags, root_data);
489 if (err == 0)
490 return 1;
491 if (try > NFSROOT_RETRY_MAX)
492 break;
493
494
495 ssleep(timeout);
496 timeout <<= 1;
497 if (timeout > NFSROOT_TIMEOUT_MAX)
498 timeout = NFSROOT_TIMEOUT_MAX;
499 }
500 return 0;
501 }
502 #endif
503
504 #if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD)
505 void __init change_floppy(char *fmt, ...)
506 {
507 struct termios termios;
508 char buf[80];
509 char c;
510 int fd;
511 va_list args;
512 va_start(args, fmt);
513 vsprintf(buf, fmt, args);
514 va_end(args);
515 fd = ksys_open("/dev/root", O_RDWR | O_NDELAY, 0);
516 if (fd >= 0) {
517 ksys_ioctl(fd, FDEJECT, 0);
518 ksys_close(fd);
519 }
520 printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf);
521 fd = ksys_open("/dev/console", O_RDWR, 0);
522 if (fd >= 0) {
523 ksys_ioctl(fd, TCGETS, (long)&termios);
524 termios.c_lflag &= ~ICANON;
525 ksys_ioctl(fd, TCSETSF, (long)&termios);
526 ksys_read(fd, &c, 1);
527 termios.c_lflag |= ICANON;
528 ksys_ioctl(fd, TCSETSF, (long)&termios);
529 ksys_close(fd);
530 }
531 }
532 #endif
533
534 void __init mount_root(void)
535 {
536 #ifdef CONFIG_ROOT_NFS
537 if (ROOT_DEV == Root_NFS) {
538 if (mount_nfs_root())
539 return;
540
541 printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");
542 ROOT_DEV = Root_FD0;
543 }
544 #endif
545 #ifdef CONFIG_BLK_DEV_FD
546 if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
547
548 if (rd_doload==2) {
549 if (rd_load_disk(1)) {
550 ROOT_DEV = Root_RAM1;
551 root_device_name = NULL;
552 }
553 } else
554 change_floppy("root floppy");
555 }
556 #endif
557 #ifdef CONFIG_BLOCK
558 {
559 int err = create_dev("/dev/root", ROOT_DEV);
560
561 if (err < 0)
562 pr_emerg("Failed to create /dev/root: %d\n", err);
563 mount_block_root("/dev/root", root_mountflags);
564 }
565 #endif
566 }
567
568
569
570
571 void __init prepare_namespace(void)
572 {
573 int is_floppy;
574
575 if (root_delay) {
576 printk(KERN_INFO "Waiting %d sec before mounting root device...\n",
577 root_delay);
578 ssleep(root_delay);
579 }
580
581
582
583
584
585
586
587
588 wait_for_device_probe();
589
590 md_run_setup();
591
592 if (saved_root_name[0]) {
593 root_device_name = saved_root_name;
594 if (!strncmp(root_device_name, "mtd", 3) ||
595 !strncmp(root_device_name, "ubi", 3)) {
596 mount_block_root(root_device_name, root_mountflags);
597 goto out;
598 }
599 ROOT_DEV = name_to_dev_t(root_device_name);
600 if (strncmp(root_device_name, "/dev/", 5) == 0)
601 root_device_name += 5;
602 }
603
604 if (initrd_load())
605 goto out;
606
607
608 if ((ROOT_DEV == 0) && root_wait) {
609 printk(KERN_INFO "Waiting for root device %s...\n",
610 saved_root_name);
611 while (driver_probe_done() != 0 ||
612 (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
613 msleep(5);
614 async_synchronize_full();
615 }
616
617 is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
618
619 if (is_floppy && rd_doload && rd_load_disk(0))
620 ROOT_DEV = Root_RAM0;
621
622 mount_root();
623 out:
624 devtmpfs_mount("dev");
625 ksys_mount(".", "/", NULL, MS_MOVE, NULL);
626 ksys_chroot(".");
627 }
628
629 static bool is_tmpfs;
630 static int rootfs_init_fs_context(struct fs_context *fc)
631 {
632 if (IS_ENABLED(CONFIG_TMPFS) && is_tmpfs)
633 return shmem_init_fs_context(fc);
634
635 return ramfs_init_fs_context(fc);
636 }
637
638 struct file_system_type rootfs_fs_type = {
639 .name = "rootfs",
640 .init_fs_context = rootfs_init_fs_context,
641 .kill_sb = kill_litter_super,
642 };
643
644 void __init init_rootfs(void)
645 {
646 if (IS_ENABLED(CONFIG_TMPFS) && !saved_root_name[0] &&
647 (!root_fs_names || strstr(root_fs_names, "tmpfs")))
648 is_tmpfs = true;
649 }