aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-08-20 18:10:50 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-08-20 18:10:50 +0200
commit01c08dd3814825db2c6bedd4d4621831a588962c (patch)
treeb50ef916574bf3062098e664597308299c2eb7b9
parentde282dbada8a2028ebb4b25aaa0b9bf3d8da3af5 (diff)
downloadkernel-01c08dd3814825db2c6bedd4d4621831a588962c.tar.xz
kernel-01c08dd3814825db2c6bedd4d4621831a588962c.zip
kernel/fs: use type registry in probe_and_mount
-rw-r--r--kernel/kernel/filesystem/devfs/filesystem.cpp2
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.cpp2
-rw-r--r--kernel/kernel/filesystem/filesystem.cpp25
-rw-r--r--kernel/kernel/filesystem/rootfs/filesystem.cpp2
-rw-r--r--kernel/kernel/filesystem/type.hpp2
-rw-r--r--kernel/kernel/filesystem/type_registry.cpp5
-rw-r--r--kernel/kernel/filesystem/type_registry.hpp4
-rw-r--r--kernel/kernel/filesystem/type_registry.tests.cpp2
8 files changed, 18 insertions, 26 deletions
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 <kernel/filesystem/filesystem.hpp>
#include <kernel/filesystem/error.hpp>
-#include <kernel/filesystem/ext2/filesystem.hpp>
#include <kernel/filesystem/inode.hpp>
+#include <kernel/filesystem/type_registry.hpp>
#include <kapi/system.hpp>
@@ -10,30 +10,21 @@
#include <kstd/result.hpp>
#include <kstd/system_error.hpp>
-#include <array>
-
namespace kernel::filesystem
{
- namespace
- {
- // TODO: replace with filesystem type registry.
- constexpr auto static filesystem_factories = std::array{
- []() { return kstd::make_shared<ext2::filesystem>(); },
- };
- } // namespace
auto filesystem::probe_and_mount(kstd::shared_ptr<inode> const & backing_inode)
-> kstd::result<kstd::shared_ptr<filesystem>>
{
- 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<bool>(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<filesystem> = 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 <kstd/memory.hpp>
#include <kstd/print.hpp>
+#include <kstd/vector.hpp>
#include <algorithm>
#include <cstddef>
@@ -63,9 +64,9 @@ namespace kernel::filesystem
return result.second;
}
- auto type_registry::all() const noexcept -> std::span<pointer const>
+ auto type_registry::all() const noexcept -> kstd::vector<pointer>
{
- 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 <kstd/flat_map.hpp>
#include <kstd/memory.hpp>
#include <kstd/string.hpp>
+#include <kstd/vector.hpp>
#include <cstddef>
-#include <span>
#include <string_view>
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<pointer const>;
+ [[nodiscard]] auto all() const noexcept -> kstd::vector<pointer>;
//! 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;
}