diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/devfs/filesystem.cpp | 2 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/filesystem.cpp | 2 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/filesystem.cpp | 25 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/rootfs/filesystem.cpp | 2 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/type.hpp | 2 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/type_registry.cpp | 5 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/type_registry.hpp | 4 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/type_registry.tests.cpp | 2 |
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; } |
