block: store partition_meta_info.uuid as a string
[firefly-linux-kernel-4.4.55.git] / init / do_mounts.c
1 /*
2  * Many of the syscalls used in this file expect some of the arguments
3  * to be __user pointers not __kernel pointers.  To limit the sparse
4  * noise, turn off sparse checking for this file.
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
30 #include <linux/nfs_fs.h>
31 #include <linux/nfs_fs_sb.h>
32 #include <linux/nfs_mount.h>
33
34 #include "do_mounts.h"
35
36 int __initdata rd_doload;       /* 1 = load RAM disk, 0 = don't load */
37
38 int root_mountflags = MS_RDONLY | MS_SILENT;
39 static char * __initdata root_device_name;
40 static char __initdata saved_root_name[64];
41 static int root_wait;
42
43 dev_t ROOT_DEV;
44
45 static int __init load_ramdisk(char *str)
46 {
47         rd_doload = simple_strtol(str,NULL,0) & 3;
48         return 1;
49 }
50 __setup("load_ramdisk=", load_ramdisk);
51
52 static int __init readonly(char *str)
53 {
54         if (*str)
55                 return 0;
56         root_mountflags |= MS_RDONLY;
57         return 1;
58 }
59
60 static int __init readwrite(char *str)
61 {
62         if (*str)
63                 return 0;
64         root_mountflags &= ~MS_RDONLY;
65         return 1;
66 }
67
68 __setup("ro", readonly);
69 __setup("rw", readwrite);
70
71 #ifdef CONFIG_BLOCK
72 struct uuidcmp {
73         const char *uuid;
74         int len;
75 };
76
77 /**
78  * match_dev_by_uuid - callback for finding a partition using its uuid
79  * @dev:        device passed in by the caller
80  * @data:       opaque pointer to the desired struct uuidcmp to match
81  *
82  * Returns 1 if the device matches, and 0 otherwise.
83  */
84 static int match_dev_by_uuid(struct device *dev, void *data)
85 {
86         struct uuidcmp *cmp = data;
87         struct hd_struct *part = dev_to_part(dev);
88
89         if (!part->info)
90                 goto no_match;
91
92         if (strncasecmp(cmp->uuid, part->info->uuid, cmp->len))
93                 goto no_match;
94
95         return 1;
96 no_match:
97         return 0;
98 }
99
100
101 /**
102  * devt_from_partuuid - looks up the dev_t of a partition by its UUID
103  * @uuid:       char array containing ascii UUID
104  *
105  * The function will return the first partition which contains a matching
106  * UUID value in its partition_meta_info struct.  This does not search
107  * by filesystem UUIDs.
108  *
109  * If @uuid is followed by a "/PARTNROFF=%d", then the number will be
110  * extracted and used as an offset from the partition identified by the UUID.
111  *
112  * Returns the matching dev_t on success or 0 on failure.
113  */
114 static dev_t devt_from_partuuid(const char *uuid_str)
115 {
116         dev_t res = 0;
117         struct uuidcmp cmp;
118         struct device *dev = NULL;
119         struct gendisk *disk;
120         struct hd_struct *part;
121         int offset = 0;
122
123         if (strlen(uuid_str) < 36)
124                 goto done;
125
126         cmp.uuid = uuid_str;
127         cmp.len = 36;
128
129         /* Check for optional partition number offset attributes. */
130         if (uuid_str[36]) {
131                 char c = 0;
132                 /* Explicitly fail on poor PARTUUID syntax. */
133                 if (sscanf(&uuid_str[36],
134                            "/PARTNROFF=%d%c", &offset, &c) != 1) {
135                         printk(KERN_ERR "VFS: PARTUUID= is invalid.\n"
136                          "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n");
137                         if (root_wait)
138                                 printk(KERN_ERR
139                                      "Disabling rootwait; root= is invalid.\n");
140                         root_wait = 0;
141                         goto done;
142                 }
143         }
144
145         dev = class_find_device(&block_class, NULL, &cmp,
146                                 &match_dev_by_uuid);
147         if (!dev)
148                 goto done;
149
150         res = dev->devt;
151
152         /* Attempt to find the partition by offset. */
153         if (!offset)
154                 goto no_offset;
155
156         res = 0;
157         disk = part_to_disk(dev_to_part(dev));
158         part = disk_get_part(disk, dev_to_part(dev)->partno + offset);
159         if (part) {
160                 res = part_devt(part);
161                 put_device(part_to_dev(part));
162         }
163
164 no_offset:
165         put_device(dev);
166 done:
167         return res;
168 }
169 #endif
170
171 /*
172  *      Convert a name into device number.  We accept the following variants:
173  *
174  *      1) device number in hexadecimal represents itself
175  *      2) /dev/nfs represents Root_NFS (0xff)
176  *      3) /dev/<disk_name> represents the device number of disk
177  *      4) /dev/<disk_name><decimal> represents the device number
178  *         of partition - device number of disk plus the partition number
179  *      5) /dev/<disk_name>p<decimal> - same as the above, that form is
180  *         used when disk name of partitioned disk ends on a digit.
181  *      6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
182  *         unique id of a partition if the partition table provides it.
183  *      7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to
184  *         a partition with a known unique id.
185  *
186  *      If name doesn't have fall into the categories above, we return (0,0).
187  *      block_class is used to check if something is a disk name. If the disk
188  *      name contains slashes, the device name has them replaced with
189  *      bangs.
190  */
191
192 dev_t name_to_dev_t(char *name)
193 {
194         char s[32];
195         char *p;
196         dev_t res = 0;
197         int part;
198
199 #ifdef CONFIG_BLOCK
200         if (strncmp(name, "PARTUUID=", 9) == 0) {
201                 name += 9;
202                 res = devt_from_partuuid(name);
203                 if (!res)
204                         goto fail;
205                 goto done;
206         }
207 #endif
208
209         if (strncmp(name, "/dev/", 5) != 0) {
210                 unsigned maj, min;
211
212                 if (sscanf(name, "%u:%u", &maj, &min) == 2) {
213                         res = MKDEV(maj, min);
214                         if (maj != MAJOR(res) || min != MINOR(res))
215                                 goto fail;
216                 } else {
217                         res = new_decode_dev(simple_strtoul(name, &p, 16));
218                         if (*p)
219                                 goto fail;
220                 }
221                 goto done;
222         }
223
224         name += 5;
225         res = Root_NFS;
226         if (strcmp(name, "nfs") == 0)
227                 goto done;
228         res = Root_RAM0;
229         if (strcmp(name, "ram") == 0)
230                 goto done;
231
232         if (strlen(name) > 31)
233                 goto fail;
234         strcpy(s, name);
235         for (p = s; *p; p++)
236                 if (*p == '/')
237                         *p = '!';
238         res = blk_lookup_devt(s, 0);
239         if (res)
240                 goto done;
241
242         /*
243          * try non-existent, but valid partition, which may only exist
244          * after revalidating the disk, like partitioned md devices
245          */
246         while (p > s && isdigit(p[-1]))
247                 p--;
248         if (p == s || !*p || *p == '0')
249                 goto fail;
250
251         /* try disk name without <part number> */
252         part = simple_strtoul(p, NULL, 10);
253         *p = '\0';
254         res = blk_lookup_devt(s, part);
255         if (res)
256                 goto done;
257
258         /* try disk name without p<part number> */
259         if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p')
260                 goto fail;
261         p[-1] = '\0';
262         res = blk_lookup_devt(s, part);
263         if (res)
264                 goto done;
265
266 fail:
267         return 0;
268 done:
269         return res;
270 }
271
272 static int __init root_dev_setup(char *line)
273 {
274         strlcpy(saved_root_name, line, sizeof(saved_root_name));
275         return 1;
276 }
277
278 __setup("root=", root_dev_setup);
279
280 static int __init rootwait_setup(char *str)
281 {
282         if (*str)
283                 return 0;
284         root_wait = 1;
285         return 1;
286 }
287
288 __setup("rootwait", rootwait_setup);
289
290 static char * __initdata root_mount_data;
291 static int __init root_data_setup(char *str)
292 {
293         root_mount_data = str;
294         return 1;
295 }
296
297 static char * __initdata root_fs_names;
298 static int __init fs_names_setup(char *str)
299 {
300         root_fs_names = str;
301         return 1;
302 }
303
304 static unsigned int __initdata root_delay;
305 static int __init root_delay_setup(char *str)
306 {
307         root_delay = simple_strtoul(str, NULL, 0);
308         return 1;
309 }
310
311 __setup("rootflags=", root_data_setup);
312 __setup("rootfstype=", fs_names_setup);
313 __setup("rootdelay=", root_delay_setup);
314
315 static void __init get_fs_names(char *page)
316 {
317         char *s = page;
318
319         if (root_fs_names) {
320                 strcpy(page, root_fs_names);
321                 while (*s++) {
322                         if (s[-1] == ',')
323                                 s[-1] = '\0';
324                 }
325         } else {
326                 int len = get_filesystem_list(page);
327                 char *p, *next;
328
329                 page[len] = '\0';
330                 for (p = page-1; p; p = next) {
331                         next = strchr(++p, '\n');
332                         if (*p++ != '\t')
333                                 continue;
334                         while ((*s++ = *p++) != '\n')
335                                 ;
336                         s[-1] = '\0';
337                 }
338         }
339         *s = '\0';
340 }
341
342 static int __init do_mount_root(char *name, char *fs, int flags, void *data)
343 {
344         struct super_block *s;
345         int err = sys_mount(name, "/root", fs, flags, data);
346         if (err)
347                 return err;
348
349         sys_chdir("/root");
350         s = current->fs->pwd.dentry->d_sb;
351         ROOT_DEV = s->s_dev;
352         printk(KERN_INFO
353                "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
354                s->s_type->name,
355                s->s_flags & MS_RDONLY ?  " readonly" : "",
356                MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
357         return 0;
358 }
359
360 void __init mount_block_root(char *name, int flags)
361 {
362         struct page *page = alloc_page(GFP_KERNEL |
363                                         __GFP_NOTRACK_FALSE_POSITIVE);
364         char *fs_names = page_address(page);
365         char *p;
366 #ifdef CONFIG_BLOCK
367         char b[BDEVNAME_SIZE];
368 #else
369         const char *b = name;
370 #endif
371
372         get_fs_names(fs_names);
373 retry:
374         for (p = fs_names; *p; p += strlen(p)+1) {
375                 int err = do_mount_root(name, p, flags, root_mount_data);
376                 switch (err) {
377                         case 0:
378                                 goto out;
379                         case -EACCES:
380                                 flags |= MS_RDONLY;
381                                 goto retry;
382                         case -EINVAL:
383                                 continue;
384                 }
385                 /*
386                  * Allow the user to distinguish between failed sys_open
387                  * and bad superblock on root device.
388                  * and give them a list of the available devices
389                  */
390 #ifdef CONFIG_BLOCK
391                 __bdevname(ROOT_DEV, b);
392 #endif
393                 printk("VFS: Cannot open root device \"%s\" or %s: error %d\n",
394                                 root_device_name, b, err);
395                 printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");
396
397                 printk_all_partitions();
398 #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
399                 printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "
400                        "explicit textual name for \"root=\" boot option.\n");
401 #endif
402                 panic("VFS: Unable to mount root fs on %s", b);
403         }
404
405         printk("List of all partitions:\n");
406         printk_all_partitions();
407         printk("No filesystem could mount root, tried: ");
408         for (p = fs_names; *p; p += strlen(p)+1)
409                 printk(" %s", p);
410         printk("\n");
411 #ifdef CONFIG_BLOCK
412         __bdevname(ROOT_DEV, b);
413 #endif
414         panic("VFS: Unable to mount root fs on %s", b);
415 out:
416         put_page(page);
417 }
418  
419 #ifdef CONFIG_ROOT_NFS
420
421 #define NFSROOT_TIMEOUT_MIN     5
422 #define NFSROOT_TIMEOUT_MAX     30
423 #define NFSROOT_RETRY_MAX       5
424
425 static int __init mount_nfs_root(void)
426 {
427         char *root_dev, *root_data;
428         unsigned int timeout;
429         int try, err;
430
431         err = nfs_root_data(&root_dev, &root_data);
432         if (err != 0)
433                 return 0;
434
435         /*
436          * The server or network may not be ready, so try several
437          * times.  Stop after a few tries in case the client wants
438          * to fall back to other boot methods.
439          */
440         timeout = NFSROOT_TIMEOUT_MIN;
441         for (try = 1; ; try++) {
442                 err = do_mount_root(root_dev, "nfs",
443                                         root_mountflags, root_data);
444                 if (err == 0)
445                         return 1;
446                 if (try > NFSROOT_RETRY_MAX)
447                         break;
448
449                 /* Wait, in case the server refused us immediately */
450                 ssleep(timeout);
451                 timeout <<= 1;
452                 if (timeout > NFSROOT_TIMEOUT_MAX)
453                         timeout = NFSROOT_TIMEOUT_MAX;
454         }
455         return 0;
456 }
457 #endif
458
459 #if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD)
460 void __init change_floppy(char *fmt, ...)
461 {
462         struct termios termios;
463         char buf[80];
464         char c;
465         int fd;
466         va_list args;
467         va_start(args, fmt);
468         vsprintf(buf, fmt, args);
469         va_end(args);
470         fd = sys_open("/dev/root", O_RDWR | O_NDELAY, 0);
471         if (fd >= 0) {
472                 sys_ioctl(fd, FDEJECT, 0);
473                 sys_close(fd);
474         }
475         printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf);
476         fd = sys_open("/dev/console", O_RDWR, 0);
477         if (fd >= 0) {
478                 sys_ioctl(fd, TCGETS, (long)&termios);
479                 termios.c_lflag &= ~ICANON;
480                 sys_ioctl(fd, TCSETSF, (long)&termios);
481                 sys_read(fd, &c, 1);
482                 termios.c_lflag |= ICANON;
483                 sys_ioctl(fd, TCSETSF, (long)&termios);
484                 sys_close(fd);
485         }
486 }
487 #endif
488
489 void __init mount_root(void)
490 {
491 #ifdef CONFIG_ROOT_NFS
492         if (ROOT_DEV == Root_NFS) {
493                 if (mount_nfs_root())
494                         return;
495
496                 printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");
497                 ROOT_DEV = Root_FD0;
498         }
499 #endif
500 #ifdef CONFIG_BLK_DEV_FD
501         if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
502                 /* rd_doload is 2 for a dual initrd/ramload setup */
503                 if (rd_doload==2) {
504                         if (rd_load_disk(1)) {
505                                 ROOT_DEV = Root_RAM1;
506                                 root_device_name = NULL;
507                         }
508                 } else
509                         change_floppy("root floppy");
510         }
511 #endif
512 #ifdef CONFIG_BLOCK
513         create_dev("/dev/root", ROOT_DEV);
514         mount_block_root("/dev/root", root_mountflags);
515 #endif
516 }
517
518 /*
519  * Prepare the namespace - decide what/where to mount, load ramdisks, etc.
520  */
521 void __init prepare_namespace(void)
522 {
523         int is_floppy;
524
525         if (root_delay) {
526                 printk(KERN_INFO "Waiting %dsec before mounting root device...\n",
527                        root_delay);
528                 ssleep(root_delay);
529         }
530
531         /*
532          * wait for the known devices to complete their probing
533          *
534          * Note: this is a potential source of long boot delays.
535          * For example, it is not atypical to wait 5 seconds here
536          * for the touchpad of a laptop to initialize.
537          */
538         wait_for_device_probe();
539
540         md_run_setup();
541
542         if (saved_root_name[0]) {
543                 root_device_name = saved_root_name;
544                 if (!strncmp(root_device_name, "mtd", 3) ||
545                     !strncmp(root_device_name, "ubi", 3)) {
546                         mount_block_root(root_device_name, root_mountflags);
547                         goto out;
548                 }
549                 ROOT_DEV = name_to_dev_t(root_device_name);
550                 if (strncmp(root_device_name, "/dev/", 5) == 0)
551                         root_device_name += 5;
552         }
553
554         if (initrd_load())
555                 goto out;
556
557         /* wait for any asynchronous scanning to complete */
558         if ((ROOT_DEV == 0) && root_wait) {
559                 printk(KERN_INFO "Waiting for root device %s...\n",
560                         saved_root_name);
561                 while (driver_probe_done() != 0 ||
562                         (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
563                         msleep(100);
564                 async_synchronize_full();
565         }
566
567         is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
568
569         if (is_floppy && rd_doload && rd_load_disk(0))
570                 ROOT_DEV = Root_RAM0;
571
572         mount_root();
573 out:
574         devtmpfs_mount("dev");
575         sys_mount(".", "/", NULL, MS_MOVE, NULL);
576         sys_chroot(".");
577 }