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