From 91821da0110e05724640903434c3d85fc3d02466 Mon Sep 17 00:00:00 2001 From: Lukas Oesch Date: Tue, 12 May 2026 12:00:40 +0200 Subject: if the boot_root_fs contains a /dev directory, vfs mounts the devfs onto the existing directory --- kernel/src/filesystem/vfs.cpp | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) (limited to 'kernel/src/filesystem/vfs.cpp') diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index ee7c262..535f898 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -41,36 +41,35 @@ namespace kernel::filesystem auto vfs::init_internal() -> void { + // mount rootfs at / auto root_fs = kstd::make_shared(); root_fs->mount(nullptr); auto root_fs_root_dentry = kstd::make_shared(nullptr, root_fs->root_inode(), "/"); m_mount_table.add_mount(kstd::make_shared(nullptr, root_fs_root_dentry, root_fs, nullptr)); - // Mount devfs at /dev in rootfs (temporary, will be shadowed) + // mount devfs at /dev (inside rootfs, temporary, will be shadowed) auto device_fs = kstd::make_shared(); device_fs->mount(nullptr); - auto dev_mount_point_dentry = resolve_path("/dev"); - if (!dev_mount_point_dentry) + + if (auto dev_mount_point_dentry = resolve_path("/dev")) + { + do_mount_internal(dev_mount_point_dentry, device_fs); + } + else { kapi::system::panic("[FILESYSTEM] failed to resolve /dev for initial devfs mount."); } - do_mount_internal(dev_mount_point_dentry, device_fs); - // Mount boot filesystem at / (will shadow rootfs) + // mount boot fs at / (shadows rootfs), re-graft devfs if (auto boot_device_dentry = resolve_path("/dev/ram0")) { if (auto boot_root_fs = kernel::filesystem::filesystem::probe_and_mount(boot_device_dentry->get_inode())) { - do_mount_internal(root_fs_root_dentry, boot_root_fs); - - // Resolve / to get the boot root dentry - if (auto boot_root_dentry = resolve_path("/")) + if (auto root_dentry = resolve_path("/")) { - auto dev_dentry = kstd::make_shared(boot_root_dentry, device_fs->root_inode(), "dev"); - boot_root_dentry->add_child(dev_dentry); - - do_mount_internal(dev_dentry, device_fs); + do_mount_internal(root_dentry, boot_root_fs); + graft_persistent_device_fs(device_fs); } } } @@ -151,6 +150,21 @@ namespace kernel::filesystem m_mount_table.add_mount(new_mount); } + auto vfs::graft_persistent_device_fs(kstd::shared_ptr const & device_fs) -> void + { + if (auto new_root_dentry = resolve_path("/")) + { + auto dev_dentry = new_root_dentry->find_child("dev"); + if (!dev_dentry) + { + dev_dentry = kstd::make_shared(new_root_dentry, device_fs->root_inode(), "dev"); + new_root_dentry->add_child(dev_dentry); + } + + do_mount_internal(dev_dentry, device_fs); + } + } + auto vfs::resolve_path(std::string_view path) -> kstd::shared_ptr { if (!path::is_valid_absolute_path(path)) -- cgit v1.2.3