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