init: Use devtmpfs for /dev if possible.

If devtmpfs already mounted into /dev (see CONFIG_DEVTMPFS_MOUNT
kernel option) then do nothing.
Otherwise try to mount devtmpfs or tmpfs.
This commit is contained in:
Mikhail Efremov 2012-05-25 18:28:40 +04:00
parent 19090fbacc
commit f3240f3f36

32
init.c
View File

@ -87,6 +87,17 @@ void warn(char *msg)
printf("W: %s\n", msg);
}
static int _mknod(const char *pathname, mode_t mode, dev_t dev)
{
int rc;
rc = mknod(pathname, mode, dev);
if (rc < 0 && errno == EEXIST)
rc = 0;
return rc;
}
/* fork to:
* (1) watch /proc/kmsg and copy the stuff to /dev/tty4
* (2) listens to /dev/log and copy also this stuff (log from programs)
@ -101,7 +112,7 @@ pid_t doklog()
if ((in = open("/proc/kmsg", O_RDONLY, 0)) < 0)
fatal("failed to open /proc/kmsg");
if (mknod("/dev/tty4", S_IFCHR, MKDEV(4, 4)) < 0 ||
if (_mknod("/dev/tty4", S_IFCHR, MKDEV(4, 4)) < 0 ||
(out = open("/dev/tty4", O_WRONLY, 0)) < 0)
fatal("failed to open /dev/tty4");
@ -357,8 +368,23 @@ int main(int argc, char **argv)
fatal("failed to mount proc filesystem");
if (mount("sysfs", "/sys", "sysfs", 0, NULL))
fatal("failed to mount sysfs filesystem");
if (statfs("/dev", &sfs))
fatal("statfs /dev");
/* Don't mount /dev if it is already mounted as tmpfs */
if (sfs.f_type != TMPFS_MAGIC) {
/* Try mount devtmpfs into /dev */
if (mount("udevfs", "/dev", "devtmpfs", 0, "size=10M,mode=0755")) {
if (errno == ENODEV) {
/* There is no devtmpfs for current kernel,
* try mount tmpfs */
if (mount("udev", "/dev", "tmpfs", 0, "size=10M,mode=0755"))
fatal("failed to mount tmpfs filesystem");
}
else
fatal("failed to mount devtmpfs filesystem");
}
}
/* ignore Control-C and keyboard stop signals */
sigemptyset(&sig);
@ -366,7 +392,7 @@ int main(int argc, char **argv)
sigaddset(&sig, SIGTSTP);
sigprocmask(SIG_BLOCK, &sig, NULL);
if (mknod("/dev/console", S_IFCHR, MKDEV(5, 1)) < 0 ||
if (_mknod("/dev/console", S_IFCHR, MKDEV(5, 1)) < 0 ||
(fd = open("/dev/console", O_RDWR, 0)) < 0) {
fatal("failed to open /dev/console");
}
@ -376,7 +402,7 @@ int main(int argc, char **argv)
dup2(fd, 2);
close(fd);
if (mknod("/dev/null", S_IFCHR, MKDEV(1, 3)) < 0)
if (_mknod("/dev/null", S_IFCHR, MKDEV(1, 3)) < 0)
fatal("failed to create /dev/null");
/* I set me up as session leader (probably not necessary?) */