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
 341/* This can return zero length strings. Caller should check */
 342static int __init split_fs_names(char *page, size_t size, char *names)
 343{
 344        int count = 1;
 345        char *p = page;
 346
 347        strlcpy(p, root_fs_names, size);
 348        while (*p++) {
 349                if (p[-1] == ',') {
 350                        p[-1] = '\0';
 351                        count++;
 352                }
 353        }
 354
 355        return count;
 356}
 357
 358static int __init do_mount_root(const char *name, const char *fs,
 359                                 const int flags, const void *data)
 360{
 361        struct super_block *s;
 362        struct page *p = NULL;
 363        char *data_page = NULL;
 364        int ret;
 365
 366        if (data) {
 367                /* init_mount() requires a full page as fifth argument */
 368                p = alloc_page(GFP_KERNEL);
 369                if (!p)
 370                        return -ENOMEM;
 371                data_page = page_address(p);
 372                /* zero-pad. init_mount() will make sure it's terminated */
 373                strncpy(data_page, data, PAGE_SIZE);
 374        }
 375
 376        ret = init_mount(name, "/root", fs, flags, data_page);
 377        if (ret)
 378                goto out;
 379
 380        init_chdir("/root");
 381        s = current->fs->pwd.dentry->d_sb;
 382        ROOT_DEV = s->s_dev;
 383        printk(KERN_INFO
 384               "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
 385               s->s_type->name,
 386               sb_rdonly(s) ? " readonly" : "",
 387               MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
 388
 389out:
 390        if (p)
 391                put_page(p);
 392        return ret;
 393}
 394
 395void __init mount_block_root(char *name, int flags)
 396{
 397        struct page *page = alloc_page(GFP_KERNEL);
 398        char *fs_names = page_address(page);
 399        char *p;
 400        char b[BDEVNAME_SIZE];
 401        int num_fs, i;
 402
 403        scnprintf(b, BDEVNAME_SIZE, "unknown-block(%u,%u)",
 404                  MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
 405        if (root_fs_names)
 406                num_fs = split_fs_names(fs_names, PAGE_SIZE, root_fs_names);
 407        else
 408                num_fs = list_bdev_fs_names(fs_names, PAGE_SIZE);
 409retry:
 410        for (i = 0, p = fs_names; i < num_fs; i++, p += strlen(p)+1) {
 411                int err;
 412
 413                if (!*p)
 414                        continue;
 415                err = do_mount_root(name, p, flags, root_mount_data);
 416                switch (err) {
 417                        case 0:
 418                                goto out;
 419                        case -EACCES:
 420                        case -EINVAL:
 421                                continue;
 422                }
 423                /*
 424                 * Allow the user to distinguish between failed sys_open
 425                 * and bad superblock on root device.
 426                 * and give them a list of the available devices
 427                 */
 428                printk("VFS: Cannot open root device \"%s\" or %s: error %d\n",
 429                                root_device_name, b, err);
 430                printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");
 431
 432                printk_all_partitions();
 433                panic("VFS: Unable to mount root fs on %s", b);
 434        }
 435        if (!(flags & SB_RDONLY)) {
 436                flags |= SB_RDONLY;
 437                goto retry;
 438        }
 439
 440        printk("List of all partitions:\n");
 441        printk_all_partitions();
 442        printk("No filesystem could mount root, tried: ");
 443        for (i = 0, p = fs_names; i < num_fs; i++, p += strlen(p)+1)
 444                printk(" %s", p);
 445        printk("\n");
 446        panic("VFS: Unable to mount root fs on %s", b);
 447out:
 448        put_page(page);
 449}
 450 
 451#ifdef CONFIG_ROOT_NFS
 452
 453#define NFSROOT_TIMEOUT_MIN     5
 454#define NFSROOT_TIMEOUT_MAX     30
 455#define NFSROOT_RETRY_MAX       5
 456
 457static int __init mount_nfs_root(void)
 458{
 459        char *root_dev, *root_data;
 460        unsigned int timeout;
 461        int try, err;
 462
 463        err = nfs_root_data(&root_dev, &root_data);
 464        if (err != 0)
 465                return 0;
 466
 467        /*
 468         * The server or network may not be ready, so try several
 469         * times.  Stop after a few tries in case the client wants
 470         * to fall back to other boot methods.
 471         */
 472        timeout = NFSROOT_TIMEOUT_MIN;
 473        for (try = 1; ; try++) {
 474                err = do_mount_root(root_dev, "nfs",
 475                                        root_mountflags, root_data);
 476                if (err == 0)
 477                        return 1;
 478                if (try > NFSROOT_RETRY_MAX)
 479                        break;
 480
 481                /* Wait, in case the server refused us immediately */
 482                ssleep(timeout);
 483                timeout <<= 1;
 484                if (timeout > NFSROOT_TIMEOUT_MAX)
 485                        timeout = NFSROOT_TIMEOUT_MAX;
 486        }
 487        return 0;
 488}
 489#endif
 490
 491#ifdef CONFIG_CIFS_ROOT
 492
 493extern int cifs_root_data(char **dev, char **opts);
 494
 495#define CIFSROOT_TIMEOUT_MIN    5
 496#define CIFSROOT_TIMEOUT_MAX    30
 497#define CIFSROOT_RETRY_MAX      5
 498
 499static int __init mount_cifs_root(void)
 500{
 501        char *root_dev, *root_data;
 502        unsigned int timeout;
 503        int try, err;
 504
 505        err = cifs_root_data(&root_dev, &root_data);
 506        if (err != 0)
 507                return 0;
 508
 509        timeout = CIFSROOT_TIMEOUT_MIN;
 510        for (try = 1; ; try++) {
 511                err = do_mount_root(root_dev, "cifs", root_mountflags,
 512                                    root_data);
 513                if (err == 0)
 514                        return 1;
 515                if (try > CIFSROOT_RETRY_MAX)
 516                        break;
 517
 518                ssleep(timeout);
 519                timeout <<= 1;
 520                if (timeout > CIFSROOT_TIMEOUT_MAX)
 521                        timeout = CIFSROOT_TIMEOUT_MAX;
 522        }
 523        return 0;
 524}
 525#endif
 526
 527static bool __init fs_is_nodev(char *fstype)
 528{
 529        struct file_system_type *fs = get_fs_type(fstype);
 530        bool ret = false;
 531
 532        if (fs) {
 533                ret = !(fs->fs_flags & FS_REQUIRES_DEV);
 534                put_filesystem(fs);
 535        }
 536
 537        return ret;
 538}
 539
 540static int __init mount_nodev_root(void)
 541{
 542        char *fs_names, *fstype;
 543        int err = -EINVAL;
 544        int num_fs, i;
 545
 546        fs_names = (void *)__get_free_page(GFP_KERNEL);
 547        if (!fs_names)
 548                return -EINVAL;
 549        num_fs = split_fs_names(fs_names, PAGE_SIZE, root_fs_names);
 550
 551        for (i = 0, fstype = fs_names; i < num_fs;
 552             i++, fstype += strlen(fstype) + 1) {
 553                if (!*fstype)
 554                        continue;
 555                if (!fs_is_nodev(fstype))
 556                        continue;
 557                err = do_mount_root(root_device_name, fstype, root_mountflags,
 558                                    root_mount_data);
 559                if (!err)
 560                        break;
 561        }
 562
 563        free_page((unsigned long)fs_names);
 564        return err;
 565}
 566
 567void __init mount_root(void)
 568{
 569#ifdef CONFIG_ROOT_NFS
 570        if (ROOT_DEV == Root_NFS) {
 571                if (!mount_nfs_root())
 572                        printk(KERN_ERR "VFS: Unable to mount root fs via NFS.\n");
 573                return;
 574        }
 575#endif
 576#ifdef CONFIG_CIFS_ROOT
 577        if (ROOT_DEV == Root_CIFS) {
 578                if (!mount_cifs_root())
 579                        printk(KERN_ERR "VFS: Unable to mount root fs via SMB.\n");
 580                return;
 581        }
 582#endif
 583        if (ROOT_DEV == 0 && root_device_name && root_fs_names) {
 584                if (mount_nodev_root() == 0)
 585                        return;
 586        }
 587#ifdef CONFIG_BLOCK
 588        {
 589                int err = create_dev("/dev/root", ROOT_DEV);
 590
 591                if (err < 0)
 592                        pr_emerg("Failed to create /dev/root: %d\n", err);
 593                mount_block_root("/dev/root", root_mountflags);
 594        }
 595#endif
 596}
 597
 598/*
 599 * Prepare the namespace - decide what/where to mount, load ramdisks, etc.
 600 */
 601void __init prepare_namespace(void)
 602{
 603        if (root_delay) {
 604                printk(KERN_INFO "Waiting %d sec before mounting root device...\n",
 605                       root_delay);
 606                ssleep(root_delay);
 607        }
 608
 609        /*
 610         * wait for the known devices to complete their probing
 611         *
 612         * Note: this is a potential source of long boot delays.
 613         * For example, it is not atypical to wait 5 seconds here
 614         * for the touchpad of a laptop to initialize.
 615         */
 616        wait_for_device_probe();
 617
 618        md_run_setup();
 619
 620        if (saved_root_name[0]) {
 621                root_device_name = saved_root_name;
 622                if (!strncmp(root_device_name, "mtd", 3) ||
 623                    !strncmp(root_device_name, "ubi", 3)) {
 624                        mount_block_root(root_device_name, root_mountflags);
 625                        goto out;
 626                }
 627                ROOT_DEV = name_to_dev_t(root_device_name);
 628                if (strncmp(root_device_name, "/dev/", 5) == 0)
 629                        root_device_name += 5;
 630        }
 631
 632        if (initrd_load())
 633                goto out;
 634
 635        /* wait for any asynchronous scanning to complete */
 636        if ((ROOT_DEV == 0) && root_wait) {
 637                printk(KERN_INFO "Waiting for root device %s...\n",
 638                        saved_root_name);
 639                while (driver_probe_done() != 0 ||
 640                        (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
 641                        msleep(5);
 642                async_synchronize_full();
 643        }
 644
 645        mount_root();
 646out:
 647        devtmpfs_mount();
 648        init_mount(".", "/", NULL, MS_MOVE, NULL);
 649        init_chroot(".");
 650}
 651
 652static bool is_tmpfs;
 653static int rootfs_init_fs_context(struct fs_context *fc)
 654{
 655        if (IS_ENABLED(CONFIG_TMPFS) && is_tmpfs)
 656                return shmem_init_fs_context(fc);
 657
 658        return ramfs_init_fs_context(fc);
 659}
 660
 661struct file_system_type rootfs_fs_type = {
 662        .name           = "rootfs",
 663        .init_fs_context = rootfs_init_fs_context,
 664        .kill_sb        = kill_litter_super,
 665};
 666
 667void __init init_rootfs(void)
 668{
 669        if (IS_ENABLED(CONFIG_TMPFS) && !saved_root_name[0] &&
 670                (!root_fs_names || strstr(root_fs_names, "tmpfs")))
 671                is_tmpfs = true;
 672}
 673