aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel/filesystem/type_registry.cpp9
-rw-r--r--kernel/kernel/filesystem/type_registry.hpp6
-rw-r--r--kernel/kernel/filesystem/vfs.cpp21
-rw-r--r--kernel/kernel/filesystem/vfs.hpp3
4 files changed, 32 insertions, 7 deletions
diff --git a/kernel/kernel/filesystem/type_registry.cpp b/kernel/kernel/filesystem/type_registry.cpp
index ad577294..05fb116a 100644
--- a/kernel/kernel/filesystem/type_registry.cpp
+++ b/kernel/kernel/filesystem/type_registry.cpp
@@ -58,6 +58,15 @@ namespace kernel::filesystem
return *instance;
}
+ auto type_registry::find(std::string_view name) const -> std::optional<pointer>
+ {
+ if (auto it = m_descriptors.find(name); it != m_descriptors.end())
+ {
+ return it->second;
+ }
+ return std::nullopt;
+ }
+
auto type_registry::add(pointer descriptor) -> bool
{
auto result = m_descriptors.emplace(descriptor->name(), descriptor);
diff --git a/kernel/kernel/filesystem/type_registry.hpp b/kernel/kernel/filesystem/type_registry.hpp
index 3572a0d6..11669ab3 100644
--- a/kernel/kernel/filesystem/type_registry.hpp
+++ b/kernel/kernel/filesystem/type_registry.hpp
@@ -9,6 +9,7 @@
#include <kstd/vector.hpp>
#include <cstddef>
+#include <optional>
#include <string_view>
namespace kernel::filesystem
@@ -33,6 +34,11 @@ namespace kernel::filesystem
//! @return @p true iff. the descriptor was successfully added, @p false if not.
auto add(pointer descriptor) -> bool;
+ //! Find a registered type descriptor by name
+ //!
+ //! @param name The name of the filesystem
+ [[nodiscard]] auto find(std::string_view name) const -> std::optional<pointer>;
+
//! Get all currently registered type descriptors.
//!
//! @return A span containing all currently registered filesystem type descriptors.
diff --git a/kernel/kernel/filesystem/vfs.cpp b/kernel/kernel/filesystem/vfs.cpp
index 5b3d2ebe..0cb46cac 100644
--- a/kernel/kernel/filesystem/vfs.cpp
+++ b/kernel/kernel/filesystem/vfs.cpp
@@ -2,7 +2,6 @@
#include <kernel/filesystem/constants.hpp>
#include <kernel/filesystem/dentry.hpp>
-#include <kernel/filesystem/devfs/filesystem.hpp>
#include <kernel/filesystem/device_inode.hpp>
#include <kernel/filesystem/device_number_registry.hpp>
#include <kernel/filesystem/error.hpp>
@@ -12,7 +11,7 @@
#include <kernel/filesystem/mount.hpp>
#include <kernel/filesystem/mount_table.hpp>
#include <kernel/filesystem/path.hpp>
-#include <kernel/filesystem/rootfs/filesystem.hpp>
+#include <kernel/filesystem/type_registry.hpp>
#include <kapi/filesystem.hpp>
#include <kapi/system.hpp>
@@ -54,7 +53,13 @@ namespace kernel::filesystem
vfs::vfs()
{
// mount rootfs at /
- auto root_fs = kstd::make_shared<rootfs::filesystem>();
+ auto root_fs_descriptor = type_registry::get().find("rootfs");
+ if (!root_fs_descriptor)
+ {
+ kapi::system::panic("[OS:FS] rootfs driver is missing!");
+ }
+
+ auto root_fs = (*root_fs_descriptor)->make_instance();
if (auto result = root_fs->mount(nullptr); !result)
{
kapi::system::panic("[FILESYSTEM] failed to mount root FS", result.error());
@@ -65,7 +70,13 @@ namespace kernel::filesystem
m_mount_table.add_mount(root_mount);
// mount devfs at /dev (inside rootfs, temporary, will be shadowed)
- auto device_fs = kstd::make_shared<devfs::filesystem>();
+ auto device_fs_descriptor = type_registry::get().find("devfs");
+ if (!device_fs_descriptor)
+ {
+ kapi::system::panic("[OS:FS] devfs driver is missing!");
+ }
+
+ auto device_fs = (*device_fs_descriptor)->make_instance();
if (auto result = device_fs->mount(nullptr); !result)
{
kapi::system::panic("[FILESYSTEM] failed to mount device FS", result.error());
@@ -290,7 +301,7 @@ namespace kernel::filesystem
m_mount_table.add_mount(new_mount);
}
- auto vfs::graft_persistent_device_fs(kstd::shared_ptr<devfs::filesystem> const & device_fs) -> void
+ auto vfs::graft_persistent_device_fs(kstd::shared_ptr<filesystem> const & device_fs) -> void
{
auto [root_mount_point_dentry, root_mount] = resolve_path_internal("/").value_or(std::pair{nullptr, nullptr});
if (root_mount_point_dentry && root_mount)
diff --git a/kernel/kernel/filesystem/vfs.hpp b/kernel/kernel/filesystem/vfs.hpp
index 5837f76c..2f30539b 100644
--- a/kernel/kernel/filesystem/vfs.hpp
+++ b/kernel/kernel/filesystem/vfs.hpp
@@ -2,7 +2,6 @@
#define TEACHOS_KERNEL_FILESYSTEM_VFS_HPP
#include <kernel/filesystem/dentry.hpp>
-#include <kernel/filesystem/devfs/filesystem.hpp>
#include <kernel/filesystem/filesystem.hpp>
#include <kernel/filesystem/inode.hpp>
#include <kernel/filesystem/mount.hpp>
@@ -115,7 +114,7 @@ namespace kernel::filesystem
auto do_mount_internal(dentry_ptr const & mount_point_dentry, mount_ptr const & parent_mount, fs_ptr const & fs,
mount_ptr const & source_mount = nullptr) -> void;
- auto graft_persistent_device_fs(kstd::shared_ptr<devfs::filesystem> const & device_fs) -> void;
+ auto graft_persistent_device_fs(kstd::shared_ptr<filesystem> const & device_fs) -> void;
auto create_inode(std::string_view path, kapi::filesystem::file_type type,
std::optional<kapi::filesystem::device_number> raw_device = std::nullopt) -> kstd::result<void>;