linux/init/do_mounts.c
<<
>>
Prefs
   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
  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 * 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 */
  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 * devt_from_partuuid - looks up the dev_t of a partition by its UUID
  90 * @uuid_str:   char array containing ascii UUID
  91 *
  92 * The function will return the first partition which contains a matching
  93 * UUID value in its partition_meta_info struct.  This does not search
  94 * by filesystem UUIDs.
  95 *
  96 * If @uuid_str is followed by a "/PARTNROFF=%d", then the number will be
  97 * extracted and used as an offset from the partition identified by the UUID.
  98 *
  99 * Returns the matching dev_t on success or 0 on failure.
 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        /* Check for optional partition number offset attributes. */
 113        if (slash) {
 114                char c = 0;
 115
 116                /* Explicitly fail on poor PARTUUID syntax. */
 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                 * Attempt to find the requested partition by adding an offset
 134                 * to the partition number found by UUID.
 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 * match_dev_by_label - callback for finding a partition using its label
 156 * @dev:        device passed in by the caller
 157 * @data:       opaque pointer to the label to match
 158 *
 159 * Returns 1 if the device matches, and 0 otherwise.
 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         * Try non-existent, but valid partition, which may only exist after
 206         * opening the device, like partitioned md devices.
 207         */
 208        while (p > s && isdigit(p[-1]))
 209                p--;
 210        if (p == s || !*p || *p == '0')
 211                return 0;
 212
 213        /* try disk name without <part number> */
 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        /* try disk name without p<part number> */
 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 /* CONFIG_BLOCK */
 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 *      Convert a name into device number.  We accept the following variants:
 250 *
 251 *      1) <hex_major><hex_minor> device number in hexadecimal represents itself
 252 *         no leading 0x, for example b302.
 253 *      2) /dev/nfs represents Root_NFS (0xff)
 254 *      3) /dev/<disk_name> represents the device number of disk
 255 *      4) /dev/<disk_name><decimal> represents the device number
 256 *         of partition - device number of disk plus the partition number
 257 *      5) /dev/<disk_name>p<decimal> - same as the above, that form is
 258 *         used when disk name of partitioned disk ends on a digit.
 259 *      6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
 260 *         unique id of a partition if the partition table provides it.
 261 *         The UUID may be either an EFI/GPT UUID, or refer to an MSDOS
 262 *         partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero-
 263 *         filled hex representation of the 32-bit "NT disk signature", and PP
 264 *         is a zero-filled hex representation of the 1-based partition number.
 265 *      7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to
 266 *         a partition with a known unique id.
 267 *      8) <major>:<minor> major and minor number of the device separated by
 268 *         a colon.
 269 *      9) PARTLABEL=<name> with name being the GPT partition label.
 270 *         MSDOS partitions do not support labels!
 271 *      10) /dev/cifs represents Root_CIFS (0xfe)
 272 *
 273 *      If name doesn't have fall into the categories above, we return (0,0).
 274 *      block_class is used to check if something is a disk name. If the disk
 275 *      name contains slashes, the device name has them replaced with
 276 *      bangs.
 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                /* init_mount() requires a full page as fifth argument */
 378                p = alloc_page(GFP_KERNEL);
 379                if (!p)
 380                        return -ENOMEM;
 381                data_page = page_address(p);
 382                /* zero-pad. init_mount() will make sure it's terminated */
 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                 * Allow the user to distinguish between failed sys_open
 427                 * and bad superblock on root device.
 428                 * and give them a list of the available devices
 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         * The server or network may not be ready, so try several
 475         * times.  Stop after a few tries in case the client wants
 476         * to fall back to other boot methods.
 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                /* Wait, in case the server refused us immediately */
 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 * Prepare the namespace - decide what/where to mount, load ramdisks, etc.
 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         * wait for the known devices to complete their probing
 573         *
 574         * Note: this is a potential source of long boot delays.
 575         * For example, it is not atypical to wait 5 seconds here
 576         * for the touchpad of a laptop to initialize.
 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        /* wait for any asynchronous scanning to complete */
 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