diff options
Diffstat (limited to 'kernel/src/filesystem/filesystem.cpp')
| -rw-r--r-- | kernel/src/filesystem/filesystem.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/kernel/src/filesystem/filesystem.cpp b/kernel/src/filesystem/filesystem.cpp new file mode 100644 index 0000000..24d0e22 --- /dev/null +++ b/kernel/src/filesystem/filesystem.cpp @@ -0,0 +1,60 @@ +#include <kernel/filesystem/filesystem.hpp> + +#include <kernel/filesystem/ext2/filesystem.hpp> +#include <kernel/filesystem/inode.hpp> + +#include <kapi/system.hpp> + +#include <kstd/memory> + +#include <array> + +namespace kernel::filesystem +{ + namespace + { + 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::shared_ptr<filesystem> + { + if (!backing_inode) + { + kapi::system::panic("[FILESYSTEM] cannot mount filesystem: backing inode is null."); + } + + for (auto & factory : filesystem_factories) + { + auto fs = factory(); + if (fs->mount(backing_inode) == operation_result::success) + { + return fs; + } + } + + return nullptr; + } + + auto filesystem::mount(kstd::shared_ptr<inode> const & backing_inode) -> operation_result + { + if (!backing_inode) + { + kapi::system::panic("[FILESYSTEM] cannot mount filesystem: backing inode is null."); + } + + m_backing_inode = backing_inode; + return operation_result::success; + } + + auto filesystem::root_inode() const -> kstd::shared_ptr<inode> const & + { + return m_root_inode; + } + + auto filesystem::backing_inode() const -> kstd::shared_ptr<inode> const & + { + return m_backing_inode; + } +} // namespace kernel::filesystem
\ No newline at end of file |
