init: refactor name_to_dev_t
[linux-2.6-microblaze.git] / init / do_mounts.c
1 // SPDX-License-Identifier: GPL-2.0-only
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
31 int root_mountflags = MS_RDONLY | MS_SILENT;
32 static char * __initdata root_device_name;
33 static char __initdata saved_root_name[64];
34 static int root_wait;
35
36 dev_t ROOT_DEV;
37
38 static 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
45 static int __init readonly(char *str)
46 {
47         if (*str)
48                 return 0;
49         root_mountflags |= MS_RDONLY;
50         return 1;
51 }
52
53 static 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
65 struct uuidcmp {
66         const char *uuid;
67         int len;
68 };
69
70 /**
71  * match_dev_by_uuid - callback for finding a partition using its uuid
72  * @dev:        device passed in by the caller
73  * @data:       opaque pointer to the desired struct uuidcmp to match
74  *
75  * Returns 1 if the device matches, and 0 otherwise.
76  */
77 static int match_dev_by_uuid(struct device *dev, const void *data)
78 {
79         const struct uuidcmp *cmp = data;
80         struct hd_struct *part = dev_to_part(dev);
81
82         if (!part->info)
83                 goto no_match;
84
85         if (strncasecmp(cmp->uuid, part->info->uuid, cmp->len))
86                 goto no_match;
87
88         return 1;
89 no_match:
90         return 0;
91 }
92
93 /**
94  * devt_from_partuuid - looks up the dev_t of a partition by its UUID
95  * @uuid_str:   char array containing ascii UUID
96  *
97  * The function will return the first partition which contains a matching
98  * UUID value in its partition_meta_info struct.  This does not search
99  * by filesystem UUIDs.
100  *
101  * If @uuid_str is followed by a "/PARTNROFF=%d", then the number will be
102  * extracted and used as an offset from the partition identified by the UUID.
103  *
104  * Returns the matching dev_t on success or 0 on failure.
105  */
106 static dev_t devt_from_partuuid(const char *uuid_str)
107 {
108         dev_t res = 0;
109         struct uuidcmp cmp;
110         struct device *dev = NULL;
111         struct gendisk *disk;
112         struct hd_struct *part;
113         int offset = 0;
114         bool clear_root_wait = false;
115         char *slash;
116
117         cmp.uuid = uuid_str;
118
119         slash = strchr(uuid_str, '/');
120         /* Check for optional partition number offset attributes. */
121         if (slash) {
122                 char c = 0;
123                 /* Explicitly fail on poor PARTUUID syntax. */
124                 if (sscanf(slash + 1,
125                            "PARTNROFF=%d%c", &offset, &c) != 1) {
126                         clear_root_wait = true;
127                         goto done;
128                 }
129                 cmp.len = slash - uuid_str;
130         } else {
131                 cmp.len = strlen(uuid_str);
132         }
133
134         if (!cmp.len) {
135                 clear_root_wait = true;
136                 goto done;
137         }
138
139         dev = class_find_device(&block_class, NULL, &cmp,
140                                 &match_dev_by_uuid);
141         if (!dev)
142                 goto done;
143
144         res = dev->devt;
145
146         /* Attempt to find the partition by offset. */
147         if (!offset)
148                 goto no_offset;
149
150         res = 0;
151         disk = part_to_disk(dev_to_part(dev));
152         part = disk_get_part(disk, dev_to_part(dev)->partno + offset);
153         if (part) {
154                 res = part_devt(part);
155                 put_device(part_to_dev(part));
156         }
157
158 no_offset:
159         put_device(dev);
160 done:
161         if (clear_root_wait) {
162                 pr_err("VFS: PARTUUID= is invalid.\n"
163                        "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n");
164                 if (root_wait)
165                         pr_err("Disabling rootwait; root= is invalid.\n");
166                 root_wait = 0;
167         }
168         return res;
169 }
170
171 /**
172  * match_dev_by_label - callback for finding a partition using its label
173  * @dev:        device passed in by the caller
174  * @data:       opaque pointer to the label to match
175  *
176  * Returns 1 if the device matches, and 0 otherwise.
177  */
178 static int match_dev_by_label(struct device *dev, const void *data)
179 {
180         const char *label = data;
181         struct hd_struct *part = dev_to_part(dev);
182
183         if (part->info && !strcmp(label, part->info->volname))
184                 return 1;
185
186         return 0;
187 }
188
189 static dev_t devt_from_partlabel(const char *label)
190 {
191         struct device *dev;
192         dev_t devt = 0;
193
194         dev = class_find_device(&block_class, NULL, label, &match_dev_by_label);
195         if (dev) {
196                 devt = dev->devt;
197                 put_device(dev);
198         }
199
200         return devt;
201 }
202
203 static dev_t devt_from_devname(const char *name)
204 {
205         dev_t devt = 0;
206         int part;
207         char s[32];
208         char *p;
209
210         if (strlen(name) > 31)
211                 return 0;
212         strcpy(s, name);
213         for (p = s; *p; p++) {
214                 if (*p == '/')
215                         *p = '!';
216         }
217
218         devt = blk_lookup_devt(s, 0);
219         if (devt)
220                 return devt;
221
222         /*
223          * Try non-existent, but valid partition, which may only exist after
224          * opening the device, like partitioned md devices.
225          */
226         while (p > s && isdigit(p[-1]))
227                 p--;
228         if (p == s || !*p || *p == '0')
229                 return 0;
230
231         /* try disk name without <part number> */
232         part = simple_strtoul(p, NULL, 10);
233         *p = '\0';
234         devt = blk_lookup_devt(s, part);
235         if (devt)
236                 return devt;
237
238         /* try disk name without p<part number> */
239         if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p')
240                 return 0;
241         p[-1] = '\0';
242         return blk_lookup_devt(s, part);
243 }
244 #endif /* CONFIG_BLOCK */
245
246 static dev_t devt_from_devnum(const char *name)
247 {
248         unsigned maj, min, offset;
249         dev_t devt = 0;
250         char *p, dummy;
251
252         if (sscanf(name, "%u:%u%c", &maj, &min, &dummy) == 2 ||
253             sscanf(name, "%u:%u:%u:%c", &maj, &min, &offset, &dummy) == 3) {
254                 devt = MKDEV(maj, min);
255                 if (maj != MAJOR(devt) || min != MINOR(devt))
256                         return 0;
257         } else {
258                 devt = new_decode_dev(simple_strtoul(name, &p, 16));
259                 if (*p)
260                         return 0;
261         }
262
263         return devt;
264 }
265
266 /*
267  *      Convert a name into device number.  We accept the following variants:
268  *
269  *      1) <hex_major><hex_minor> device number in hexadecimal represents itself
270  *         no leading 0x, for example b302.
271  *      2) /dev/nfs represents Root_NFS (0xff)
272  *      3) /dev/<disk_name> represents the device number of disk
273  *      4) /dev/<disk_name><decimal> represents the device number
274  *         of partition - device number of disk plus the partition number
275  *      5) /dev/<disk_name>p<decimal> - same as the above, that form is
276  *         used when disk name of partitioned disk ends on a digit.
277  *      6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
278  *         unique id of a partition if the partition table provides it.
279  *         The UUID may be either an EFI/GPT UUID, or refer to an MSDOS
280  *         partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero-
281  *         filled hex representation of the 32-bit "NT disk signature", and PP
282  *         is a zero-filled hex representation of the 1-based partition number.
283  *      7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to
284  *         a partition with a known unique id.
285  *      8) <major>:<minor> major and minor number of the device separated by
286  *         a colon.
287  *      9) PARTLABEL=<name> with name being the GPT partition label.
288  *         MSDOS partitions do not support labels!
289  *      10) /dev/cifs represents Root_CIFS (0xfe)
290  *
291  *      If name doesn't have fall into the categories above, we return (0,0).
292  *      block_class is used to check if something is a disk name. If the disk
293  *      name contains slashes, the device name has them replaced with
294  *      bangs.
295  */
296 dev_t name_to_dev_t(const char *name)
297 {
298         if (strcmp(name, "/dev/nfs") == 0)
299                 return Root_NFS;
300         if (strcmp(name, "/dev/cifs") == 0)
301                 return Root_CIFS;
302         if (strcmp(name, "/dev/ram") == 0)
303                 return Root_RAM0;
304 #ifdef CONFIG_BLOCK
305         if (strncmp(name, "PARTUUID=", 9) == 0)
306                 return devt_from_partuuid(name + 9);
307         if (strncmp(name, "PARTLABEL=", 10) == 0)
308                 return devt_from_partlabel(name + 10);
309         if (strncmp(name, "/dev/", 5) == 0)
310                 return devt_from_devname(name + 5);
311 #endif
312         return devt_from_devnum(name);
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(const char *name, const char *fs,
387                                  const int flags, const void *data)
388 {
389         struct super_block *s;
390         struct page *p = NULL;
391         char *data_page = NULL;
392         int ret;
393
394         if (data) {
395                 /* init_mount() requires a full page as fifth argument */
396                 p = alloc_page(GFP_KERNEL);
397                 if (!p)
398                         return -ENOMEM;
399                 data_page = page_address(p);
400                 /* zero-pad. init_mount() will make sure it's terminated */
401                 strncpy(data_page, data, PAGE_SIZE);
402         }
403
404         ret = init_mount(name, "/root", fs, flags, data_page);
405         if (ret)
406                 goto out;
407
408         init_chdir("/root");
409         s = current->fs->pwd.dentry->d_sb;
410         ROOT_DEV = s->s_dev;
411         printk(KERN_INFO
412                "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
413                s->s_type->name,
414                sb_rdonly(s) ? " readonly" : "",
415                MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
416
417 out:
418         if (p)
419                 put_page(p);
420         return ret;
421 }
422
423 void __init mount_block_root(char *name, int flags)
424 {
425         struct page *page = alloc_page(GFP_KERNEL);
426         char *fs_names = page_address(page);
427         char *p;
428         char b[BDEVNAME_SIZE];
429
430         scnprintf(b, BDEVNAME_SIZE, "unknown-block(%u,%u)",
431                   MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
432         get_fs_names(fs_names);
433 retry:
434         for (p = fs_names; *p; p += strlen(p)+1) {
435                 int err = do_mount_root(name, p, flags, root_mount_data);
436                 switch (err) {
437                         case 0:
438                                 goto out;
439                         case -EACCES:
440                         case -EINVAL:
441                                 continue;
442                 }
443                 /*
444                  * Allow the user to distinguish between failed sys_open
445                  * and bad superblock on root device.
446                  * and give them a list of the available devices
447                  */
448                 printk("VFS: Cannot open root device \"%s\" or %s: error %d\n",
449                                 root_device_name, b, err);
450                 printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");
451
452                 printk_all_partitions();
453 #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
454                 printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "
455                        "explicit textual name for \"root=\" boot option.\n");
456 #endif
457                 panic("VFS: Unable to mount root fs on %s", b);
458         }
459         if (!(flags & SB_RDONLY)) {
460                 flags |= SB_RDONLY;
461                 goto retry;
462         }
463
464         printk("List of all partitions:\n");
465         printk_all_partitions();
466         printk("No filesystem could mount root, tried: ");
467         for (p = fs_names; *p; p += strlen(p)+1)
468                 printk(" %s", p);
469         printk("\n");
470         panic("VFS: Unable to mount root fs on %s", b);
471 out:
472         put_page(page);
473 }
474  
475 #ifdef CONFIG_ROOT_NFS
476
477 #define NFSROOT_TIMEOUT_MIN     5
478 #define NFSROOT_TIMEOUT_MAX     30
479 #define NFSROOT_RETRY_MAX       5
480
481 static int __init mount_nfs_root(void)
482 {
483         char *root_dev, *root_data;
484         unsigned int timeout;
485         int try, err;
486
487         err = nfs_root_data(&root_dev, &root_data);
488         if (err != 0)
489                 return 0;
490
491         /*
492          * The server or network may not be ready, so try several
493          * times.  Stop after a few tries in case the client wants
494          * to fall back to other boot methods.
495          */
496         timeout = NFSROOT_TIMEOUT_MIN;
497         for (try = 1; ; try++) {
498                 err = do_mount_root(root_dev, "nfs",
499                                         root_mountflags, root_data);
500                 if (err == 0)
501                         return 1;
502                 if (try > NFSROOT_RETRY_MAX)
503                         break;
504
505                 /* Wait, in case the server refused us immediately */
506                 ssleep(timeout);
507                 timeout <<= 1;
508                 if (timeout > NFSROOT_TIMEOUT_MAX)
509                         timeout = NFSROOT_TIMEOUT_MAX;
510         }
511         return 0;
512 }
513 #endif
514
515 #ifdef CONFIG_CIFS_ROOT
516
517 extern int cifs_root_data(char **dev, char **opts);
518
519 #define CIFSROOT_TIMEOUT_MIN    5
520 #define CIFSROOT_TIMEOUT_MAX    30
521 #define CIFSROOT_RETRY_MAX      5
522
523 static int __init mount_cifs_root(void)
524 {
525         char *root_dev, *root_data;
526         unsigned int timeout;
527         int try, err;
528
529         err = cifs_root_data(&root_dev, &root_data);
530         if (err != 0)
531                 return 0;
532
533         timeout = CIFSROOT_TIMEOUT_MIN;
534         for (try = 1; ; try++) {
535                 err = do_mount_root(root_dev, "cifs", root_mountflags,
536                                     root_data);
537                 if (err == 0)
538                         return 1;
539                 if (try > CIFSROOT_RETRY_MAX)
540                         break;
541
542                 ssleep(timeout);
543                 timeout <<= 1;
544                 if (timeout > CIFSROOT_TIMEOUT_MAX)
545                         timeout = CIFSROOT_TIMEOUT_MAX;
546         }
547         return 0;
548 }
549 #endif
550
551 void __init mount_root(void)
552 {
553 #ifdef CONFIG_ROOT_NFS
554         if (ROOT_DEV == Root_NFS) {
555                 if (!mount_nfs_root())
556                         printk(KERN_ERR "VFS: Unable to mount root fs via NFS.\n");
557                 return;
558         }
559 #endif
560 #ifdef CONFIG_CIFS_ROOT
561         if (ROOT_DEV == Root_CIFS) {
562                 if (!mount_cifs_root())
563                         printk(KERN_ERR "VFS: Unable to mount root fs via SMB.\n");
564                 return;
565         }
566 #endif
567 #ifdef CONFIG_BLOCK
568         {
569                 int err = create_dev("/dev/root", ROOT_DEV);
570
571                 if (err < 0)
572                         pr_emerg("Failed to create /dev/root: %d\n", err);
573                 mount_block_root("/dev/root", root_mountflags);
574         }
575 #endif
576 }
577
578 /*
579  * Prepare the namespace - decide what/where to mount, load ramdisks, etc.
580  */
581 void __init prepare_namespace(void)
582 {
583         if (root_delay) {
584                 printk(KERN_INFO "Waiting %d sec before mounting root device...\n",
585                        root_delay);
586                 ssleep(root_delay);
587         }
588
589         /*
590          * wait for the known devices to complete their probing
591          *
592          * Note: this is a potential source of long boot delays.
593          * For example, it is not atypical to wait 5 seconds here
594          * for the touchpad of a laptop to initialize.
595          */
596         wait_for_device_probe();
597
598         md_run_setup();
599
600         if (saved_root_name[0]) {
601                 root_device_name = saved_root_name;
602                 if (!strncmp(root_device_name, "mtd", 3) ||
603                     !strncmp(root_device_name, "ubi", 3)) {
604                         mount_block_root(root_device_name, root_mountflags);
605                         goto out;
606                 }
607                 ROOT_DEV = name_to_dev_t(root_device_name);
608                 if (strncmp(root_device_name, "/dev/", 5) == 0)
609                         root_device_name += 5;
610         }
611
612         if (initrd_load())
613                 goto out;
614
615         /* wait for any asynchronous scanning to complete */
616         if ((ROOT_DEV == 0) && root_wait) {
617                 printk(KERN_INFO "Waiting for root device %s...\n",
618                         saved_root_name);
619                 while (driver_probe_done() != 0 ||
620                         (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
621                         msleep(5);
622                 async_synchronize_full();
623         }
624
625         mount_root();
626 out:
627         devtmpfs_mount();
628         init_mount(".", "/", NULL, MS_MOVE, NULL);
629         init_chroot(".");
630 }
631
632 static bool is_tmpfs;
633 static int rootfs_init_fs_context(struct fs_context *fc)
634 {
635         if (IS_ENABLED(CONFIG_TMPFS) && is_tmpfs)
636                 return shmem_init_fs_context(fc);
637
638         return ramfs_init_fs_context(fc);
639 }
640
641 struct file_system_type rootfs_fs_type = {
642         .name           = "rootfs",
643         .init_fs_context = rootfs_init_fs_context,
644         .kill_sb        = kill_litter_super,
645 };
646
647 void __init init_rootfs(void)
648 {
649         if (IS_ENABLED(CONFIG_TMPFS) && !saved_root_name[0] &&
650                 (!root_fs_names || strstr(root_fs_names, "tmpfs")))
651                 is_tmpfs = true;
652 }