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 } 656