diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-08-23 15:28:46 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-08-26 11:16:17 +0200 |
| commit | 5f57170c385c609701f0e3db23395f72eb78f3ea (patch) | |
| tree | e906715102bde2e73de5db97084091e8f56e60ee | |
| parent | 5abb324bb68dfc7608919497a725047956e70c14 (diff) | |
| download | kernel-5f57170c385c609701f0e3db23395f72eb78f3ea.tar.xz kernel-5f57170c385c609701f0e3db23395f72eb78f3ea.zip | |
kernel/fs: devfs: externalize mount state
| -rw-r--r-- | kernel/kernel/filesystem/devfs/filesystem.cpp | 10 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/devfs/filesystem.hpp | 3 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/vfs.cpp | 10 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/vfs.hpp | 3 |
4 files changed, 14 insertions, 12 deletions
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<type>{}; + static_assert(sizeof(kernel::filesystem::filesystem) == sizeof(devfs::filesystem)); + auto filesystem::mount(inode_ptr const &) -> kstd::result<mount_result> { - m_root_inode = kstd::make_shared<inode>(); - return mount_result{m_root_inode, nullptr}; + auto root = kstd::make_shared<inode>(); + 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<inode_ptr> { 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<kapi::filesystem::device_number> raw_device = std::nullopt) -> kstd::result<inode_ptr> 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<filesystem> const & device_fs, - kstd::shared_ptr<inode> const & root_inode) -> void + kstd::shared_ptr<inode> const & root_inode, kstd::shared_ptr<void> 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<mount_ptr>; auto graft_persistent_device_fs(kstd::shared_ptr<filesystem> const & device_fs, - kstd::shared_ptr<inode> const & root_inode) -> void; + kstd::shared_ptr<inode> const & root_inode, kstd::shared_ptr<void> driver_data) + -> void; auto create_inode(std::string_view path, kapi::filesystem::file_type type, std::optional<kapi::filesystem::device_number> raw_device = std::nullopt) -> kstd::result<void>; |
