diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-08-20 20:58:13 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-08-20 20:58:13 +0200 |
| commit | 1f4e433316666f32bd0a9b7874549389e2efea7c (patch) | |
| tree | e7a4c25785bc4c8d38d9157f8039f70b50e6c7ca /kernel | |
| parent | da18613bd4ad4784f8f6f70e998e3a91cacf31c3 (diff) | |
| download | kernel-1f4e433316666f32bd0a9b7874549389e2efea7c.tar.xz kernel-1f4e433316666f32bd0a9b7874549389e2efea7c.zip | |
kernel/fs: add type lookup
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/type_registry.cpp | 9 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/type_registry.hpp | 6 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/vfs.cpp | 21 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/vfs.hpp | 3 |
4 files changed, 32 insertions, 7 deletions
diff --git a/kernel/kernel/filesystem/type_registry.cpp b/kernel/kernel/filesystem/type_registry.cpp index ad577294..05fb116a 100644 --- a/kernel/kernel/filesystem/type_registry.cpp +++ b/kernel/kernel/filesystem/type_registry.cpp @@ -58,6 +58,15 @@ namespace kernel::filesystem return *instance; } + auto type_registry::find(std::string_view name) const -> std::optional<pointer> + { + if (auto it = m_descriptors.find(name); it != m_descriptors.end()) + { + return it->second; + } + return std::nullopt; + } + auto type_registry::add(pointer descriptor) -> bool { auto result = m_descriptors.emplace(descriptor->name(), descriptor); diff --git a/kernel/kernel/filesystem/type_registry.hpp b/kernel/kernel/filesystem/type_registry.hpp index 3572a0d6..11669ab3 100644 --- a/kernel/kernel/filesystem/type_registry.hpp +++ b/kernel/kernel/filesystem/type_registry.hpp @@ -9,6 +9,7 @@ #include <kstd/vector.hpp> #include <cstddef> +#include <optional> #include <string_view> namespace kernel::filesystem @@ -33,6 +34,11 @@ namespace kernel::filesystem //! @return @p true iff. the descriptor was successfully added, @p false if not. auto add(pointer descriptor) -> bool; + //! Find a registered type descriptor by name + //! + //! @param name The name of the filesystem + [[nodiscard]] auto find(std::string_view name) const -> std::optional<pointer>; + //! Get all currently registered type descriptors. //! //! @return A span containing all currently registered filesystem type descriptors. diff --git a/kernel/kernel/filesystem/vfs.cpp b/kernel/kernel/filesystem/vfs.cpp index 5b3d2ebe..0cb46cac 100644 --- a/kernel/kernel/filesystem/vfs.cpp +++ b/kernel/kernel/filesystem/vfs.cpp @@ -2,7 +2,6 @@ #include <kernel/filesystem/constants.hpp> #include <kernel/filesystem/dentry.hpp> -#include <kernel/filesystem/devfs/filesystem.hpp> #include <kernel/filesystem/device_inode.hpp> #include <kernel/filesystem/device_number_registry.hpp> #include <kernel/filesystem/error.hpp> @@ -12,7 +11,7 @@ #include <kernel/filesystem/mount.hpp> #include <kernel/filesystem/mount_table.hpp> #include <kernel/filesystem/path.hpp> -#include <kernel/filesystem/rootfs/filesystem.hpp> +#include <kernel/filesystem/type_registry.hpp> #include <kapi/filesystem.hpp> #include <kapi/system.hpp> @@ -54,7 +53,13 @@ namespace kernel::filesystem vfs::vfs() { // mount rootfs at / - auto root_fs = kstd::make_shared<rootfs::filesystem>(); + auto root_fs_descriptor = type_registry::get().find("rootfs"); + if (!root_fs_descriptor) + { + kapi::system::panic("[OS:FS] rootfs driver is missing!"); + } + + auto root_fs = (*root_fs_descriptor)->make_instance(); if (auto result = root_fs->mount(nullptr); !result) { kapi::system::panic("[FILESYSTEM] failed to mount root FS", result.error()); @@ -65,7 +70,13 @@ namespace kernel::filesystem m_mount_table.add_mount(root_mount); // mount devfs at /dev (inside rootfs, temporary, will be shadowed) - auto device_fs = kstd::make_shared<devfs::filesystem>(); + auto device_fs_descriptor = type_registry::get().find("devfs"); + if (!device_fs_descriptor) + { + kapi::system::panic("[OS:FS] devfs driver is missing!"); + } + + auto device_fs = (*device_fs_descriptor)->make_instance(); if (auto result = device_fs->mount(nullptr); !result) { kapi::system::panic("[FILESYSTEM] failed to mount device FS", result.error()); @@ -290,7 +301,7 @@ namespace kernel::filesystem m_mount_table.add_mount(new_mount); } - auto vfs::graft_persistent_device_fs(kstd::shared_ptr<devfs::filesystem> const & device_fs) -> void + auto vfs::graft_persistent_device_fs(kstd::shared_ptr<filesystem> const & device_fs) -> void { auto [root_mount_point_dentry, root_mount] = resolve_path_internal("/").value_or(std::pair{nullptr, nullptr}); if (root_mount_point_dentry && root_mount) diff --git a/kernel/kernel/filesystem/vfs.hpp b/kernel/kernel/filesystem/vfs.hpp index 5837f76c..2f30539b 100644 --- a/kernel/kernel/filesystem/vfs.hpp +++ b/kernel/kernel/filesystem/vfs.hpp @@ -2,7 +2,6 @@ #define TEACHOS_KERNEL_FILESYSTEM_VFS_HPP #include <kernel/filesystem/dentry.hpp> -#include <kernel/filesystem/devfs/filesystem.hpp> #include <kernel/filesystem/filesystem.hpp> #include <kernel/filesystem/inode.hpp> #include <kernel/filesystem/mount.hpp> @@ -115,7 +114,7 @@ namespace kernel::filesystem auto do_mount_internal(dentry_ptr const & mount_point_dentry, mount_ptr const & parent_mount, fs_ptr const & fs, mount_ptr const & source_mount = nullptr) -> void; - auto graft_persistent_device_fs(kstd::shared_ptr<devfs::filesystem> const & device_fs) -> void; + auto graft_persistent_device_fs(kstd::shared_ptr<filesystem> const & device_fs) -> 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>; |
