aboutsummaryrefslogtreecommitdiff
path: root/kernel/kernel/filesystem/filesystem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kernel/filesystem/filesystem.cpp')
-rw-r--r--kernel/kernel/filesystem/filesystem.cpp25
1 files changed, 8 insertions, 17 deletions
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;