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