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