diff options
Diffstat (limited to 'kernel/src/filesystem')
| -rw-r--r-- | kernel/src/filesystem/devfs/filesystem.cpp | 6 | ||||
| -rw-r--r-- | kernel/src/filesystem/ext2/filesystem.cpp | 6 | ||||
| -rw-r--r-- | kernel/src/filesystem/type_registry.cpp | 67 | ||||
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 17 |
4 files changed, 73 insertions, 23 deletions
diff --git a/kernel/src/filesystem/devfs/filesystem.cpp b/kernel/src/filesystem/devfs/filesystem.cpp index 1aaa0d1..ce887ff 100644 --- a/kernel/src/filesystem/devfs/filesystem.cpp +++ b/kernel/src/filesystem/devfs/filesystem.cpp @@ -32,10 +32,10 @@ namespace kernel::filesystem::devfs { return kstd::make_shared<filesystem>(); } - } const constinit type_instance{}; + }; - [[gnu::section("vfs_type_descriptors"), gnu::used]] - auto const * const type_descriptor_pointer = static_cast<kernel::filesystem::type const *>(&type_instance); + [[gnu::used]] + constexpr auto registration = type_registration<type>{}; auto filesystem::mount(kstd::shared_ptr<kernel::filesystem::inode> const &) -> operation_result { diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp index 7b5d2d7..3180a19 100644 --- a/kernel/src/filesystem/ext2/filesystem.cpp +++ b/kernel/src/filesystem/ext2/filesystem.cpp @@ -36,10 +36,10 @@ namespace kernel::filesystem::ext2 { return kstd::make_shared<filesystem>(); } - } const constinit type_instance{}; + }; - [[gnu::section("vfs_type_descriptors"), gnu::used]] - auto const * const type_descriptor_pointer = static_cast<kernel::filesystem::type const *>(&type_instance); + [[gnu::used]] + constexpr auto registration = type_registration<type>{}; auto filesystem::mount(kstd::shared_ptr<kernel::filesystem::inode> const & backing_inode) -> operation_result { diff --git a/kernel/src/filesystem/type_registry.cpp b/kernel/src/filesystem/type_registry.cpp new file mode 100644 index 0000000..033b879 --- /dev/null +++ b/kernel/src/filesystem/type_registry.cpp @@ -0,0 +1,67 @@ +#include <kernel/filesystem/type_registry.hpp> + +#include <kapi/system.hpp> + +#include <kstd/memory> +#include <kstd/print> + +#include <algorithm> +#include <optional> +#include <ranges> +#include <span> + +namespace kernel::filesystem +{ + + extern "C" + { + extern type_registry::pointer const __start_fs_types; + extern type_registry::pointer const __stop_fs_types; + } + + namespace + { + auto constinit instance = std::optional<type_registry>{}; + } + + auto type_registry::init() -> void + { + if (instance) + { + kapi::system::panic("[FILESYSTEM] tried to initialize type registry more than once!"); + } + + instance.emplace(); + + auto type_descriptors = std::span{&__start_fs_types, &__stop_fs_types} | // + std::views::filter([](auto p) { return p != nullptr; }); + + std::ranges::for_each(type_descriptors, [](auto descriptor) { + kstd::println("[FILESYSTEM] registering '{}'", descriptor->name()); + instance->add(descriptor); + }); + } + + auto type_registry::get() -> type_registry & + { + if (!instance) + { + kapi::system::panic("[FILESYSTEM] type registry has not been initialized!"); + } + + return *instance; + } + + auto type_registry::add(pointer descriptor) -> bool + { + auto result = m_descriptors.emplace(descriptor->name(), descriptor); + return result.second; + } + + [[nodiscard]] auto type_registry::all() const noexcept -> std::span<pointer> + { + // TODO: implement value accessor for flat_map + return {}; + } + +} // namespace kernel::filesystem diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index 8dcae2c..8d1fd23 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -8,29 +8,20 @@ #include <kernel/filesystem/mount_table.hpp> #include <kernel/filesystem/path.hpp> #include <kernel/filesystem/rootfs/filesystem.hpp> -#include <kernel/filesystem/type.hpp> #include <kapi/system.hpp> #include <kstd/memory> #include <kstd/print> -#include <kstd/string> #include <kstd/vector> #include <algorithm> #include <cstdint> #include <optional> #include <ranges> -#include <span> #include <string_view> #include <utility> -extern "C" -{ - extern kernel::filesystem::type const * const __start_vfs_type_descriptors; - extern kernel::filesystem::type const * const __stop_vfs_type_descriptors; -} - namespace { constinit auto static active_vfs = std::optional<kernel::filesystem::vfs>{}; @@ -50,14 +41,6 @@ namespace kernel::filesystem vfs::vfs() { - // Register all compiled-in filesystems - auto type_descriptors = std::span{&__start_vfs_type_descriptors, &__stop_vfs_type_descriptors} | - std::views::filter([](auto p) { return p != nullptr; }); - std::ranges::for_each(type_descriptors, [this](auto descriptor) { - kstd::println("[FILESYSTEM] registering '{}'", descriptor->name()); - m_filesystems.emplace(descriptor->name(), descriptor); - }); - // mount rootfs at / auto root_fs = kstd::make_shared<rootfs::filesystem>(); root_fs->mount(nullptr); |
