diff options
| author | Marcel Braun <marcel.braun@ost.ch> | 2026-05-14 16:59:56 +0200 |
|---|---|---|
| committer | Lukas Oesch <lukasoesch20@gmail.com> | 2026-05-16 11:56:07 +0200 |
| commit | 216ec44cf2fdc914ce38e3ab56eb3a8d82b54c77 (patch) | |
| tree | 9cb47ca5b25cd521c083b7a5429a182ce67f63c5 /kernel | |
| parent | c6953852b9e10823830688bdfb269650b080f1bb (diff) | |
| download | kernel-216ec44cf2fdc914ce38e3ab56eb3a8d82b54c77.tar.xz kernel-216ec44cf2fdc914ce38e3ab56eb3a8d82b54c77.zip | |
Refactor resolve_path
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/kernel/filesystem/vfs.hpp | 6 | ||||
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 21 |
2 files changed, 22 insertions, 5 deletions
diff --git a/kernel/include/kernel/filesystem/vfs.hpp b/kernel/include/kernel/filesystem/vfs.hpp index 4b6de53..2aa1dd7 100644 --- a/kernel/include/kernel/filesystem/vfs.hpp +++ b/kernel/include/kernel/filesystem/vfs.hpp @@ -4,11 +4,13 @@ #include <kernel/filesystem/dentry.hpp> #include <kernel/filesystem/devfs/filesystem.hpp> #include <kernel/filesystem/filesystem.hpp> +#include <kernel/filesystem/mount.hpp> #include <kernel/filesystem/mount_table.hpp> #include <kstd/memory> #include <string_view> +#include <utility> namespace kernel::filesystem { @@ -77,7 +79,11 @@ namespace kernel::filesystem vfs() = default; auto init_internal() -> void; + [[nodiscard]] auto resolve_path_internal(std::string_view path) + -> std::pair<kstd::shared_ptr<dentry>, kstd::shared_ptr<mount>>; [[nodiscard]] auto resolve_path(std::string_view path) -> kstd::shared_ptr<dentry>; + [[nodiscard]] auto find_mount(std::string_view path) -> kstd::shared_ptr<mount>; + auto do_mount_internal(kstd::shared_ptr<dentry> const & mount_point_dentry, kstd::shared_ptr<filesystem> const & fs) -> void; diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index f5d57be..52ffcc8 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -20,6 +20,7 @@ #include <optional> #include <ranges> #include <string_view> +#include <utility> namespace { @@ -165,11 +166,11 @@ namespace kernel::filesystem } } - auto vfs::resolve_path(std::string_view path) -> kstd::shared_ptr<dentry> + auto vfs::resolve_path_internal(std::string_view path) -> std::pair<kstd::shared_ptr<dentry>, kstd::shared_ptr<mount>> { if (!path::is_valid_absolute_path(path)) { - return nullptr; + return {nullptr, nullptr}; } auto current_mount = m_mount_table.find_exact_mount("/"); @@ -225,7 +226,7 @@ namespace kernel::filesystem auto found_inode = current_fs->lookup(current_dentry->get_inode(), part.view()); if (!found_inode) { - return nullptr; + return {nullptr, nullptr}; } next_dentry = kstd::make_shared<dentry>(current_dentry, found_inode, part.view()); @@ -246,7 +247,7 @@ namespace kernel::filesystem { if (symlink_counter++ > constants::symloop_max) { - return nullptr; + return {nullptr, nullptr}; } kstd::vector<uint8_t> buffer(constants::symlink_max_path_length); @@ -269,9 +270,19 @@ namespace kernel::filesystem current_dentry = next_dentry; } + return {current_dentry, current_mount}; + } + + auto vfs::resolve_path(std::string_view path) -> kstd::shared_ptr<dentry> + { + return resolve_path_internal(path).first; + } - return current_dentry; + auto vfs::find_mount(std::string_view path) -> kstd::shared_ptr<mount> + { + return resolve_path_internal(path).second; } + } // namespace kernel::filesystem namespace kernel::tests::filesystem::vfs |
