From 5f57170c385c609701f0e3db23395f72eb78f3ea Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sun, 23 Aug 2026 15:28:46 +0200 Subject: kernel/fs: devfs: externalize mount state --- kernel/kernel/filesystem/devfs/filesystem.cpp | 10 ++++++---- kernel/kernel/filesystem/devfs/filesystem.hpp | 3 --- kernel/kernel/filesystem/vfs.cpp | 10 ++++++---- kernel/kernel/filesystem/vfs.hpp | 3 ++- 4 files changed, 14 insertions(+), 12 deletions(-) (limited to 'kernel') diff --git a/kernel/kernel/filesystem/devfs/filesystem.cpp b/kernel/kernel/filesystem/devfs/filesystem.cpp index 640a01db..0e3f3164 100644 --- a/kernel/kernel/filesystem/devfs/filesystem.cpp +++ b/kernel/kernel/filesystem/devfs/filesystem.cpp @@ -47,13 +47,15 @@ namespace kernel::filesystem::devfs [[gnu::used]] constexpr auto registration = type_registration{}; + static_assert(sizeof(kernel::filesystem::filesystem) == sizeof(devfs::filesystem)); + auto filesystem::mount(inode_ptr const &) -> kstd::result { - m_root_inode = kstd::make_shared(); - return mount_result{m_root_inode, nullptr}; + auto root = kstd::make_shared(); + return mount_result{root, root}; } - auto filesystem::lookup(inode_ptr const & parent, std::string_view name, driver_data_ptr) const + auto filesystem::lookup(inode_ptr const & parent, std::string_view name, driver_data_ptr driver_data) const -> kstd::result { if (!parent) @@ -66,7 +68,7 @@ namespace kernel::filesystem::devfs return kstd::failure(vfs_errc::not_a_directory); } - if (parent.get() != m_root_inode.get()) + if (parent.get() != driver_data.get()) { return kstd::failure(vfs_errc::invalid_inode); } diff --git a/kernel/kernel/filesystem/devfs/filesystem.hpp b/kernel/kernel/filesystem/devfs/filesystem.hpp index 147cb692..56744477 100644 --- a/kernel/kernel/filesystem/devfs/filesystem.hpp +++ b/kernel/kernel/filesystem/devfs/filesystem.hpp @@ -38,9 +38,6 @@ namespace kernel::filesystem::devfs driver_data_ptr driver_data, std::optional raw_device = std::nullopt) -> kstd::result override; - - private: - inode_ptr m_root_inode{}; }; } // namespace kernel::filesystem::devfs diff --git a/kernel/kernel/filesystem/vfs.cpp b/kernel/kernel/filesystem/vfs.cpp index 512b7394..43da7130 100644 --- a/kernel/kernel/filesystem/vfs.cpp +++ b/kernel/kernel/filesystem/vfs.cpp @@ -85,7 +85,8 @@ namespace kernel::filesystem kapi::system::panic("[FILESYSTEM] failed to mount device FS", device_fs_mount_result.error()); } - graft_persistent_device_fs(device_fs, device_fs_mount_result->first); + auto [device_fs_root, device_fs_data] = *device_fs_mount_result; + graft_persistent_device_fs(device_fs, device_fs_root, device_fs_data); // mount boot fs at / (shadows rootfs), re-graft devfs auto [boot_device_dentry, boot_device_mount_context] = @@ -103,7 +104,7 @@ namespace kernel::filesystem kapi::system::panic("[OS:FS] failed to mount boot FS", mount.error()); } m_mount_table.add_mount(*mount); - graft_persistent_device_fs(device_fs, device_fs_mount_result->first); + graft_persistent_device_fs(device_fs, device_fs_root, device_fs_data); } } } @@ -312,7 +313,8 @@ namespace kernel::filesystem } auto vfs::graft_persistent_device_fs(kstd::shared_ptr const & device_fs, - kstd::shared_ptr const & root_inode) -> void + kstd::shared_ptr const & root_inode, kstd::shared_ptr driver_data) + -> void { auto [root_mount_point_dentry, root_mount] = resolve_path_internal("/").value_or(std::pair{nullptr, nullptr}); if (root_mount_point_dentry && root_mount) @@ -324,7 +326,7 @@ namespace kernel::filesystem root_mount_point_dentry->add_child(dev_dentry); } - auto new_mount = mount::attach(dev_dentry, device_fs, root_inode, nullptr, root_mount, nullptr); + auto new_mount = mount::attach(dev_dentry, device_fs, root_inode, driver_data, root_mount, nullptr); m_mount_table.add_mount(new_mount); } } diff --git a/kernel/kernel/filesystem/vfs.hpp b/kernel/kernel/filesystem/vfs.hpp index 1975ac8a..a53ab532 100644 --- a/kernel/kernel/filesystem/vfs.hpp +++ b/kernel/kernel/filesystem/vfs.hpp @@ -112,7 +112,8 @@ namespace kernel::filesystem [[nodiscard]] auto find_mount(std::string_view path) const -> kstd::result; auto graft_persistent_device_fs(kstd::shared_ptr const & device_fs, - kstd::shared_ptr const & root_inode) -> void; + kstd::shared_ptr const & root_inode, kstd::shared_ptr driver_data) + -> void; auto create_inode(std::string_view path, kapi::filesystem::file_type type, std::optional raw_device = std::nullopt) -> kstd::result; -- cgit v1.2.3