From 01c08dd3814825db2c6bedd4d4621831a588962c Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 20 Aug 2026 18:10:50 +0200 Subject: kernel/fs: use type registry in probe_and_mount --- kernel/kernel/filesystem/devfs/filesystem.cpp | 2 +- kernel/kernel/filesystem/ext2/filesystem.cpp | 2 +- kernel/kernel/filesystem/filesystem.cpp | 25 ++++++++---------------- kernel/kernel/filesystem/rootfs/filesystem.cpp | 2 +- kernel/kernel/filesystem/type.hpp | 2 +- kernel/kernel/filesystem/type_registry.cpp | 5 +++-- kernel/kernel/filesystem/type_registry.hpp | 4 ++-- kernel/kernel/filesystem/type_registry.tests.cpp | 2 +- 8 files changed, 18 insertions(+), 26 deletions(-) (limited to 'kernel') diff --git a/kernel/kernel/filesystem/devfs/filesystem.cpp b/kernel/kernel/filesystem/devfs/filesystem.cpp index f6512999..5b11d6e8 100644 --- a/kernel/kernel/filesystem/devfs/filesystem.cpp +++ b/kernel/kernel/filesystem/devfs/filesystem.cpp @@ -28,7 +28,7 @@ namespace kernel::filesystem::devfs return "devfs"; } - [[nodiscard]] auto requires_device() const noexcept -> bool override + [[nodiscard]] auto requires_inode() const noexcept -> bool override { return false; } diff --git a/kernel/kernel/filesystem/ext2/filesystem.cpp b/kernel/kernel/filesystem/ext2/filesystem.cpp index 52737632..c1de1447 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.cpp +++ b/kernel/kernel/filesystem/ext2/filesystem.cpp @@ -57,7 +57,7 @@ namespace kernel::filesystem::ext2 return "ext2"; } - [[nodiscard]] auto requires_device() const noexcept -> bool override + [[nodiscard]] auto requires_inode() const noexcept -> bool override { return true; } diff --git a/kernel/kernel/filesystem/filesystem.cpp b/kernel/kernel/filesystem/filesystem.cpp index 5cd7f9d5..d1e0e2a0 100644 --- a/kernel/kernel/filesystem/filesystem.cpp +++ b/kernel/kernel/filesystem/filesystem.cpp @@ -1,8 +1,8 @@ #include #include -#include #include +#include #include @@ -10,30 +10,21 @@ #include #include -#include - namespace kernel::filesystem { - namespace - { - // TODO: replace with filesystem type registry. - constexpr auto static filesystem_factories = std::array{ - []() { return kstd::make_shared(); }, - }; - } // namespace auto filesystem::probe_and_mount(kstd::shared_ptr const & backing_inode) -> kstd::result> { - if (!backing_inode) + for (auto & type : type_registry::get().all()) { - kapi::system::panic("[FILESYSTEM] cannot mount filesystem: backing inode is null."); - } + if (!type || type->requires_inode() != static_cast(backing_inode)) + { + continue; + } + + auto fs = type->make_instance(); - // TODO: replace with filesystem type registry lookup. - for (auto & factory : filesystem_factories) - { - auto fs = factory(); if (fs->mount(backing_inode)) { return fs; diff --git a/kernel/kernel/filesystem/rootfs/filesystem.cpp b/kernel/kernel/filesystem/rootfs/filesystem.cpp index 56940394..f44a57c8 100644 --- a/kernel/kernel/filesystem/rootfs/filesystem.cpp +++ b/kernel/kernel/filesystem/rootfs/filesystem.cpp @@ -24,7 +24,7 @@ namespace kernel::filesystem::rootfs return "rootfs"; } - [[nodiscard]] auto requires_device() const noexcept -> bool override + [[nodiscard]] auto requires_inode() const noexcept -> bool override { return true; } diff --git a/kernel/kernel/filesystem/type.hpp b/kernel/kernel/filesystem/type.hpp index 09a08e41..eae1a740 100644 --- a/kernel/kernel/filesystem/type.hpp +++ b/kernel/kernel/filesystem/type.hpp @@ -22,7 +22,7 @@ namespace kernel::filesystem [[nodiscard]] virtual auto name() const noexcept -> std::string_view = 0; //! Check if filesystems of this type require a device to back them. - [[nodiscard]] virtual auto requires_device() const noexcept -> bool = 0; + [[nodiscard]] virtual auto requires_inode() const noexcept -> bool = 0; //! Create a new instance of the filesytem represented by this descriptor. [[nodiscard]] virtual auto make_instance() const -> kstd::shared_ptr = 0; diff --git a/kernel/kernel/filesystem/type_registry.cpp b/kernel/kernel/filesystem/type_registry.cpp index 0b4cb7ea..ad577294 100644 --- a/kernel/kernel/filesystem/type_registry.cpp +++ b/kernel/kernel/filesystem/type_registry.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -63,9 +64,9 @@ namespace kernel::filesystem return result.second; } - auto type_registry::all() const noexcept -> std::span + auto type_registry::all() const noexcept -> kstd::vector { - return {m_descriptors.values().begin(), m_descriptors.values().end()}; + return m_descriptors.values(); } auto type_registry::size() const noexcept -> std::size_t diff --git a/kernel/kernel/filesystem/type_registry.hpp b/kernel/kernel/filesystem/type_registry.hpp index ed08b713..3572a0d6 100644 --- a/kernel/kernel/filesystem/type_registry.hpp +++ b/kernel/kernel/filesystem/type_registry.hpp @@ -6,9 +6,9 @@ #include #include #include +#include #include -#include #include namespace kernel::filesystem @@ -36,7 +36,7 @@ namespace kernel::filesystem //! Get all currently registered type descriptors. //! //! @return A span containing all currently registered filesystem type descriptors. - [[nodiscard]] auto all() const noexcept -> std::span; + [[nodiscard]] auto all() const noexcept -> kstd::vector; //! Get the number of registered filesystem types. //! diff --git a/kernel/kernel/filesystem/type_registry.tests.cpp b/kernel/kernel/filesystem/type_registry.tests.cpp index dbd3cdfd..56532631 100644 --- a/kernel/kernel/filesystem/type_registry.tests.cpp +++ b/kernel/kernel/filesystem/type_registry.tests.cpp @@ -17,7 +17,7 @@ struct test_type final : kernel::filesystem::type return "bht_testfs"; } - [[nodiscard]] auto requires_device() const noexcept -> bool override + [[nodiscard]] auto requires_inode() const noexcept -> bool override { return false; } -- cgit v1.2.3