This source file includes following definitions.
- load_ramdisk
- readonly
- readwrite
- match_dev_by_uuid
- devt_from_partuuid
- match_dev_by_label
- name_to_dev_t
- root_dev_setup
- rootwait_setup
- root_data_setup
- fs_names_setup
- root_delay_setup
- get_fs_names
- do_mount_root
- mount_block_root
- mount_nfs_root
- change_floppy
- mount_root
- prepare_namespace
- rootfs_init_fs_context
- init_rootfs
   1 
   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 <uapi/linux/mount.h>
  27 
  28 #include "do_mounts.h"
  29 
  30 int __initdata rd_doload;       
  31 
  32 int root_mountflags = MS_RDONLY | MS_SILENT;
  33 static char * __initdata root_device_name;
  34 static char __initdata saved_root_name[64];
  35 static int root_wait;
  36 
  37 dev_t ROOT_DEV;
  38 
  39 static int __init load_ramdisk(char *str)
  40 {
  41         rd_doload = simple_strtol(str,NULL,0) & 3;
  42         return 1;
  43 }
  44 __setup("load_ramdisk=", load_ramdisk);
  45 
  46 static int __init readonly(char *str)
  47 {
  48         if (*str)
  49                 return 0;
  50         root_mountflags |= MS_RDONLY;
  51         return 1;
  52 }
  53 
  54 static int __init readwrite(char *str)
  55 {
  56         if (*str)
  57                 return 0;
  58         root_mountflags &= ~MS_RDONLY;
  59         return 1;
  60 }
  61 
  62 __setup("ro", readonly);
  63 __setup("rw", readwrite);
  64 
  65 #ifdef CONFIG_BLOCK
  66 struct uuidcmp {
  67         const char *uuid;
  68         int len;
  69 };
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 
  78 static int match_dev_by_uuid(struct device *dev, const void *data)
  79 {
  80         const struct uuidcmp *cmp = data;
  81         struct hd_struct *part = dev_to_part(dev);
  82 
  83         if (!part->info)
  84                 goto no_match;
  85 
  86         if (strncasecmp(cmp->uuid, part->info->uuid, cmp->len))
  87                 goto no_match;
  88 
  89         return 1;
  90 no_match:
  91         return 0;
  92 }
  93 
  94 
  95 
  96 
  97 
  98 
  99 
 100 
 101 
 102 
 103 
 104 
 105 
 106 
 107 
 108 static dev_t devt_from_partuuid(const char *uuid_str)
 109 {
 110         dev_t res = 0;
 111         struct uuidcmp cmp;
 112         struct device *dev = NULL;
 113         struct gendisk *disk;
 114         struct hd_struct *part;
 115         int offset = 0;
 116         bool clear_root_wait = false;
 117         char *slash;
 118 
 119         cmp.uuid = uuid_str;
 120 
 121         slash = strchr(uuid_str, '/');
 122         
 123         if (slash) {
 124                 char c = 0;
 125                 
 126                 if (sscanf(slash + 1,
 127                            "PARTNROFF=%d%c", &offset, &c) != 1) {
 128                         clear_root_wait = true;
 129                         goto done;
 130                 }
 131                 cmp.len = slash - uuid_str;
 132         } else {
 133                 cmp.len = strlen(uuid_str);
 134         }
 135 
 136         if (!cmp.len) {
 137                 clear_root_wait = true;
 138                 goto done;
 139         }
 140 
 141         dev = class_find_device(&block_class, NULL, &cmp,
 142                                 &match_dev_by_uuid);
 143         if (!dev)
 144                 goto done;
 145 
 146         res = dev->devt;
 147 
 148         
 149         if (!offset)
 150                 goto no_offset;
 151 
 152         res = 0;
 153         disk = part_to_disk(dev_to_part(dev));
 154         part = disk_get_part(disk, dev_to_part(dev)->partno + offset);
 155         if (part) {
 156                 res = part_devt(part);
 157                 put_device(part_to_dev(part));
 158         }
 159 
 160 no_offset:
 161         put_device(dev);
 162 done:
 163         if (clear_root_wait) {
 164                 pr_err("VFS: PARTUUID= is invalid.\n"
 165                        "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n");
 166                 if (root_wait)
 167                         pr_err("Disabling rootwait; root= is invalid.\n");
 168                 root_wait = 0;
 169         }
 170         return res;
 171 }
 172 
 173 
 174 
 175 
 176 
 177 
 178 
 179 
 180 static int match_dev_by_label(struct device *dev, const void *data)
 181 {
 182         const char *label = data;
 183         struct hd_struct *part = dev_to_part(dev);
 184 
 185         if (part->info && !strcmp(label, part->info->volname))
 186                 return 1;
 187 
 188         return 0;
 189 }
 190 #endif
 191 
 192 
 193 
 194 
 195 
 196 
 197 
 198 
 199 
 200 
 201 
 202 
 203 
 204 
 205 
 206 
 207 
 208 
 209 
 210 
 211 
 212 
 213 
 214 
 215 
 216 
 217 
 218 
 219 
 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_RAM0;
 272         if (strcmp(name, "ram") == 0)
 273                 goto done;
 274 
 275         if (strlen(name) > 31)
 276                 goto fail;
 277         strcpy(s, name);
 278         for (p = s; *p; p++)
 279                 if (*p == '/')
 280                         *p = '!';
 281         res = blk_lookup_devt(s, 0);
 282         if (res)
 283                 goto done;
 284 
 285         
 286 
 287 
 288 
 289         while (p > s && isdigit(p[-1]))
 290                 p--;
 291         if (p == s || !*p || *p == '0')
 292                 goto fail;
 293 
 294         
 295         part = simple_strtoul(p, NULL, 10);
 296         *p = '\0';
 297         res = blk_lookup_devt(s, part);
 298         if (res)
 299                 goto done;
 300 
 301         
 302         if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p')
 303                 goto fail;
 304         p[-1] = '\0';
 305         res = blk_lookup_devt(s, part);
 306         if (res)
 307                 goto done;
 308 
 309 fail:
 310         return 0;
 311 done:
 312         return res;
 313 }
 314 EXPORT_SYMBOL_GPL(name_to_dev_t);
 315 
 316 static int __init root_dev_setup(char *line)
 317 {
 318         strlcpy(saved_root_name, line, sizeof(saved_root_name));
 319         return 1;
 320 }
 321 
 322 __setup("root=", root_dev_setup);
 323 
 324 static int __init rootwait_setup(char *str)
 325 {
 326         if (*str)
 327                 return 0;
 328         root_wait = 1;
 329         return 1;
 330 }
 331 
 332 __setup("rootwait", rootwait_setup);
 333 
 334 static char * __initdata root_mount_data;
 335 static int __init root_data_setup(char *str)
 336 {
 337         root_mount_data = str;
 338         return 1;
 339 }
 340 
 341 static char * __initdata root_fs_names;
 342 static int __init fs_names_setup(char *str)
 343 {
 344         root_fs_names = str;
 345         return 1;
 346 }
 347 
 348 static unsigned int __initdata root_delay;
 349 static int __init root_delay_setup(char *str)
 350 {
 351         root_delay = simple_strtoul(str, NULL, 0);
 352         return 1;
 353 }
 354 
 355 __setup("rootflags=", root_data_setup);
 356 __setup("rootfstype=", fs_names_setup);
 357 __setup("rootdelay=", root_delay_setup);
 358 
 359 static void __init get_fs_names(char *page)
 360 {
 361         char *s = page;
 362 
 363         if (root_fs_names) {
 364                 strcpy(page, root_fs_names);
 365                 while (*s++) {
 366                         if (s[-1] == ',')
 367                                 s[-1] = '\0';
 368                 }
 369         } else {
 370                 int len = get_filesystem_list(page);
 371                 char *p, *next;
 372 
 373                 page[len] = '\0';
 374                 for (p = page-1; p; p = next) {
 375                         next = strchr(++p, '\n');
 376                         if (*p++ != '\t')
 377                                 continue;
 378                         while ((*s++ = *p++) != '\n')
 379                                 ;
 380                         s[-1] = '\0';
 381                 }
 382         }
 383         *s = '\0';
 384 }
 385 
 386 static int __init do_mount_root(char *name, char *fs, int flags, void *data)
 387 {
 388         struct super_block *s;
 389         int err = ksys_mount(name, "/root", fs, flags, data);
 390         if (err)
 391                 return err;
 392 
 393         ksys_chdir("/root");
 394         s = current->fs->pwd.dentry->d_sb;
 395         ROOT_DEV = s->s_dev;
 396         printk(KERN_INFO
 397                "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
 398                s->s_type->name,
 399                sb_rdonly(s) ? " readonly" : "",
 400                MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
 401         return 0;
 402 }
 403 
 404 void __init mount_block_root(char *name, int flags)
 405 {
 406         struct page *page = alloc_page(GFP_KERNEL);
 407         char *fs_names = page_address(page);
 408         char *p;
 409 #ifdef CONFIG_BLOCK
 410         char b[BDEVNAME_SIZE];
 411 #else
 412         const char *b = name;
 413 #endif
 414 
 415         get_fs_names(fs_names);
 416 retry:
 417         for (p = fs_names; *p; p += strlen(p)+1) {
 418                 int err = do_mount_root(name, p, flags, root_mount_data);
 419                 switch (err) {
 420                         case 0:
 421                                 goto out;
 422                         case -EACCES:
 423                         case -EINVAL:
 424                                 continue;
 425                 }
 426                 
 427 
 428 
 429 
 430 
 431 #ifdef CONFIG_BLOCK
 432                 __bdevname(ROOT_DEV, b);
 433 #endif
 434                 printk("VFS: Cannot open root device \"%s\" or %s: error %d\n",
 435                                 root_device_name, b, err);
 436                 printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");
 437 
 438                 printk_all_partitions();
 439 #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
 440                 printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "
 441                        "explicit textual name for \"root=\" boot option.\n");
 442 #endif
 443                 panic("VFS: Unable to mount root fs on %s", b);
 444         }
 445         if (!(flags & SB_RDONLY)) {
 446                 flags |= SB_RDONLY;
 447                 goto retry;
 448         }
 449 
 450         printk("List of all partitions:\n");
 451         printk_all_partitions();
 452         printk("No filesystem could mount root, tried: ");
 453         for (p = fs_names; *p; p += strlen(p)+1)
 454                 printk(" %s", p);
 455         printk("\n");
 456 #ifdef CONFIG_BLOCK
 457         __bdevname(ROOT_DEV, b);
 458 #endif
 459         panic("VFS: Unable to mount root fs on %s", b);
 460 out:
 461         put_page(page);
 462 }
 463  
 464 #ifdef CONFIG_ROOT_NFS
 465 
 466 #define NFSROOT_TIMEOUT_MIN     5
 467 #define NFSROOT_TIMEOUT_MAX     30
 468 #define NFSROOT_RETRY_MAX       5
 469 
 470 static int __init mount_nfs_root(void)
 471 {
 472         char *root_dev, *root_data;
 473         unsigned int timeout;
 474         int try, err;
 475 
 476         err = nfs_root_data(&root_dev, &root_data);
 477         if (err != 0)
 478                 return 0;
 479 
 480         
 481 
 482 
 483 
 484 
 485         timeout = NFSROOT_TIMEOUT_MIN;
 486         for (try = 1; ; try++) {
 487                 err = do_mount_root(root_dev, "nfs",
 488                                         root_mountflags, root_data);
 489                 if (err == 0)
 490                         return 1;
 491                 if (try > NFSROOT_RETRY_MAX)
 492                         break;
 493 
 494                 
 495                 ssleep(timeout);
 496                 timeout <<= 1;
 497                 if (timeout > NFSROOT_TIMEOUT_MAX)
 498                         timeout = NFSROOT_TIMEOUT_MAX;
 499         }
 500         return 0;
 501 }
 502 #endif
 503 
 504 #if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD)
 505 void __init change_floppy(char *fmt, ...)
 506 {
 507         struct termios termios;
 508         char buf[80];
 509         char c;
 510         int fd;
 511         va_list args;
 512         va_start(args, fmt);
 513         vsprintf(buf, fmt, args);
 514         va_end(args);
 515         fd = ksys_open("/dev/root", O_RDWR | O_NDELAY, 0);
 516         if (fd >= 0) {
 517                 ksys_ioctl(fd, FDEJECT, 0);
 518                 ksys_close(fd);
 519         }
 520         printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf);
 521         fd = ksys_open("/dev/console", O_RDWR, 0);
 522         if (fd >= 0) {
 523                 ksys_ioctl(fd, TCGETS, (long)&termios);
 524                 termios.c_lflag &= ~ICANON;
 525                 ksys_ioctl(fd, TCSETSF, (long)&termios);
 526                 ksys_read(fd, &c, 1);
 527                 termios.c_lflag |= ICANON;
 528                 ksys_ioctl(fd, TCSETSF, (long)&termios);
 529                 ksys_close(fd);
 530         }
 531 }
 532 #endif
 533 
 534 void __init mount_root(void)
 535 {
 536 #ifdef CONFIG_ROOT_NFS
 537         if (ROOT_DEV == Root_NFS) {
 538                 if (mount_nfs_root())
 539                         return;
 540 
 541                 printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");
 542                 ROOT_DEV = Root_FD0;
 543         }
 544 #endif
 545 #ifdef CONFIG_BLK_DEV_FD
 546         if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
 547                 
 548                 if (rd_doload==2) {
 549                         if (rd_load_disk(1)) {
 550                                 ROOT_DEV = Root_RAM1;
 551                                 root_device_name = NULL;
 552                         }
 553                 } else
 554                         change_floppy("root floppy");
 555         }
 556 #endif
 557 #ifdef CONFIG_BLOCK
 558         {
 559                 int err = create_dev("/dev/root", ROOT_DEV);
 560 
 561                 if (err < 0)
 562                         pr_emerg("Failed to create /dev/root: %d\n", err);
 563                 mount_block_root("/dev/root", root_mountflags);
 564         }
 565 #endif
 566 }
 567 
 568 
 569 
 570 
 571 void __init prepare_namespace(void)
 572 {
 573         int is_floppy;
 574 
 575         if (root_delay) {
 576                 printk(KERN_INFO "Waiting %d sec before mounting root device...\n",
 577                        root_delay);
 578                 ssleep(root_delay);
 579         }
 580 
 581         
 582 
 583 
 584 
 585 
 586 
 587 
 588         wait_for_device_probe();
 589 
 590         md_run_setup();
 591 
 592         if (saved_root_name[0]) {
 593                 root_device_name = saved_root_name;
 594                 if (!strncmp(root_device_name, "mtd", 3) ||
 595                     !strncmp(root_device_name, "ubi", 3)) {
 596                         mount_block_root(root_device_name, root_mountflags);
 597                         goto out;
 598                 }
 599                 ROOT_DEV = name_to_dev_t(root_device_name);
 600                 if (strncmp(root_device_name, "/dev/", 5) == 0)
 601                         root_device_name += 5;
 602         }
 603 
 604         if (initrd_load())
 605                 goto out;
 606 
 607         
 608         if ((ROOT_DEV == 0) && root_wait) {
 609                 printk(KERN_INFO "Waiting for root device %s...\n",
 610                         saved_root_name);
 611                 while (driver_probe_done() != 0 ||
 612                         (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
 613                         msleep(5);
 614                 async_synchronize_full();
 615         }
 616 
 617         is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
 618 
 619         if (is_floppy && rd_doload && rd_load_disk(0))
 620                 ROOT_DEV = Root_RAM0;
 621 
 622         mount_root();
 623 out:
 624         devtmpfs_mount("dev");
 625         ksys_mount(".", "/", NULL, MS_MOVE, NULL);
 626         ksys_chroot(".");
 627 }
 628 
 629 static bool is_tmpfs;
 630 static int rootfs_init_fs_context(struct fs_context *fc)
 631 {
 632         if (IS_ENABLED(CONFIG_TMPFS) && is_tmpfs)
 633                 return shmem_init_fs_context(fc);
 634 
 635         return ramfs_init_fs_context(fc);
 636 }
 637 
 638 struct file_system_type rootfs_fs_type = {
 639         .name           = "rootfs",
 640         .init_fs_context = rootfs_init_fs_context,
 641         .kill_sb        = kill_litter_super,
 642 };
 643 
 644 void __init init_rootfs(void)
 645 {
 646         if (IS_ENABLED(CONFIG_TMPFS) && !saved_root_name[0] &&
 647                 (!root_fs_names || strstr(root_fs_names, "tmpfs")))
 648                 is_tmpfs = true;
 649 }