aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/kernel/filesystem/vfs.hpp6
-rw-r--r--kernel/src/filesystem/vfs.cpp21
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