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
341static void __init get_fs_names(char *page)
342{
343 char *s = page;
344
345 if (root_fs_names) {
346 strcpy(page, root_fs_names);
347 while (*s++) {
348 if (s[-1] == ',')
349 s[-1] = '\0';
350 }
351 } else {
352 int len = get_filesystem_list(page);
353 char *p, *next;
354
355 page[len] = '\0';
356 for (p = page-1; p; p = next) {
357 next = strchr(++p, '\n');
358 if (*p++ != '\t')
359 continue;
360 while ((*s++ = *p++) != '\n')
361 ;
362 s[-1] = '\0';
363 }
364 }
365 *s = '\0';
366}
367
368static int __init do_mount_root(const char *name, const char *fs,
369 const int flags, const void *data)
370{
371 struct super_block *s;
372 struct page *p = NULL;
373 char *data_page = NULL;
374 int ret;
375
376 if (data) {
377
378 p = alloc_page(GFP_KERNEL);
379 if (!p)
380 return -ENOMEM;
381 data_page = page_address(p);
382
383 strncpy(data_page, data, PAGE_SIZE);
384 }
385
386 ret = init_mount(name, "/root", fs, flags, data_page);
387 if (ret)
388 goto out;
389
390 init_chdir("/root");
391 s = current->fs->pwd.dentry->d_sb;
392 ROOT_DEV = s->s_dev;
393 printk(KERN_INFO
394 "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
395 s->s_type->name,
396 sb_rdonly(s) ? " readonly" : "",
397 MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
398
399out:
400 if (p)
401 put_page(p);
402 return ret;
403}
404
405void __init mount_block_root(char *name, int flags)
406{
407 struct page *page = alloc_page(GFP_KERNEL);
408 char *fs_names = page_address(page);
409 char *p;
410 char b[BDEVNAME_SIZE];
411
412 scnprintf(b, BDEVNAME_SIZE, "unknown-block(%u,%u)",
413 MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
414 get_fs_names(fs_names);
415retry:
416 for (p = fs_names; *p; p += strlen(p)+1) {
417 int err = do_mount_root(name, p, flags, root_mount_data);
418 switch (err) {
419 case 0:
420 goto out;
421 case -EACCES:
422 case -EINVAL:
423 continue;
424 }
425
426
427
428
429
430 printk("VFS: Cannot open root device \"%s\" or %s: error %d\n",
431 root_device_name, b, err);
432 printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");
433
434 printk_all_partitions();
435#ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
436 printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "
437 "explicit textual name for \"root=\" boot option.\n");
438#endif
439 panic("VFS: Unable to mount root fs on %s", b);
440 }
441 if (!(flags & SB_RDONLY)) {
442 flags |= SB_RDONLY;
443 goto retry;
444 }
445
446 printk("List of all partitions:\n");
447 printk_all_partitions();
448 printk("No filesystem could mount root, tried: ");
449 for (p = fs_names; *p; p += strlen(p)+1)
450 printk(" %s", p);
451 printk("\n");
452 panic("VFS: Unable to mount root fs on %s", b);
453out:
454 put_page(page);
455}
456
457#ifdef CONFIG_ROOT_NFS
458
459#define NFSROOT_TIMEOUT_MIN 5
460#define NFSROOT_TIMEOUT_MAX 30
461#define NFSROOT_RETRY_MAX 5
462
463static int __init mount_nfs_root(void)
464{
465 char *root_dev, *root_data;
466 unsigned int timeout;
467 int try, err;
468
469 err = nfs_root_data(&root_dev, &root_data);
470 if (err != 0)
471 return 0;
472
473
474
475
476
477
478 timeout = NFSROOT_TIMEOUT_MIN;
479 for (try = 1; ; try++) {
480 err = do_mount_root(root_dev, "nfs",
481 root_mountflags, root_data);
482 if (err == 0)
483 return 1;
484 if (try > NFSROOT_RETRY_MAX)
485 break;
486
487
488 ssleep(timeout);
489 timeout <<= 1;
490 if (timeout > NFSROOT_TIMEOUT_MAX)
491 timeout = NFSROOT_TIMEOUT_MAX;
492 }
493 return 0;
494}
495#endif
496
497#ifdef CONFIG_CIFS_ROOT
498
499extern int cifs_root_data(char **dev, char **opts);
500
501#define CIFSROOT_TIMEOUT_MIN 5
502#define CIFSROOT_TIMEOUT_MAX 30
503#define CIFSROOT_RETRY_MAX 5
504
505static int __init mount_cifs_root(void)
506{
507 char *root_dev, *root_data;
508 unsigned int timeout;
509 int try, err;
510
511 err = cifs_root_data(&root_dev, &root_data);
512 if (err != 0)
513 return 0;
514
515 timeout = CIFSROOT_TIMEOUT_MIN;
516 for (try = 1; ; try++) {
517 err = do_mount_root(root_dev, "cifs", root_mountflags,
518 root_data);
519 if (err == 0)
520 return 1;
521 if (try > CIFSROOT_RETRY_MAX)
522 break;
523
524 ssleep(timeout);
525 timeout <<= 1;
526 if (timeout > CIFSROOT_TIMEOUT_MAX)
527 timeout = CIFSROOT_TIMEOUT_MAX;
528 }
529 return 0;
530}
531#endif
532
533void __init mount_root(void)
534{
535#ifdef CONFIG_ROOT_NFS
536 if (ROOT_DEV == Root_NFS) {
537 if (!mount_nfs_root())
538 printk(KERN_ERR "VFS: Unable to mount root fs via NFS.\n");
539 return;
540 }
541#endif
542#ifdef CONFIG_CIFS_ROOT
543 if (ROOT_DEV == Root_CIFS) {
544 if (!mount_cifs_root())
545 printk(KERN_ERR "VFS: Unable to mount root fs via SMB.\n");
546 return;
547 }
548#endif
549#ifdef CONFIG_BLOCK
550 {
551 int err = create_dev("/dev/root", ROOT_DEV);
552
553 if (err < 0)
554 pr_emerg("Failed to create /dev/root: %d\n", err);
555 mount_block_root("/dev/root", root_mountflags);
556 }
557#endif
558}
559
560
561
562
563void __init prepare_namespace(void)
564{
565 if (root_delay) {
566 printk(KERN_INFO "Waiting %d sec before mounting root device...\n",
567 root_delay);
568 ssleep(root_delay);
569 }
570
571
572
573
574
575
576
577
578 wait_for_device_probe();
579
580 md_run_setup();
581
582 if (saved_root_name[0]) {
583 root_device_name = saved_root_name;
584 if (!strncmp(root_device_name, "mtd", 3) ||
585 !strncmp(root_device_name, "ubi", 3)) {
586 mount_block_root(root_device_name, root_mountflags);
587 goto out;
588 }
589 ROOT_DEV = name_to_dev_t(root_device_name);
590 if (strncmp(root_device_name, "/dev/", 5) == 0)
591 root_device_name += 5;
592 }
593
594 if (initrd_load())
595 goto out;
596
597
598 if ((ROOT_DEV == 0) && root_wait) {
599 printk(KERN_INFO "Waiting for root device %s...\n",
600 saved_root_name);
601 while (driver_probe_done() != 0 ||
602 (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
603 msleep(5);
604 async_synchronize_full();
605 }
606
607 mount_root();
608out:
609 devtmpfs_mount();
610 init_mount(".", "/", NULL, MS_MOVE, NULL);
611 init_chroot(".");
612}
613
614static bool is_tmpfs;
615static int rootfs_init_fs_context(struct fs_context *fc)
616{
617 if (IS_ENABLED(CONFIG_TMPFS) && is_tmpfs)
618 return shmem_init_fs_context(fc);
619
620 return ramfs_init_fs_context(fc);
621}
622
623struct file_system_type rootfs_fs_type = {
624 .name = "rootfs",
625 .init_fs_context = rootfs_init_fs_context,
626 .kill_sb = kill_litter_super,
627};
628
629void __init init_rootfs(void)
630{
631 if (IS_ENABLED(CONFIG_TMPFS) && !saved_root_name[0] &&
632 (!root_fs_names || strstr(root_fs_names, "tmpfs")))
633 is_tmpfs = true;
634}
635