aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-13 14:17:50 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-13 14:17:50 +0200
commit29e78eb35bdd6d1a73357ec8bcf9f45645e33637 (patch)
tree938a3f0d5981d0f1213adcd3fc0c52aa42943077 /kernel
parent44c50280e92e014c2b63380d032b23864649c744 (diff)
downloadkernel-29e78eb35bdd6d1a73357ec8bcf9f45645e33637.tar.xz
kernel-29e78eb35bdd6d1a73357ec8bcf9f45645e33637.zip
kernel/vfs: simplify do_mount
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel/filesystem/vfs.cpp34
-rw-r--r--kernel/kernel/filesystem/vfs.tests.cpp7
2 files changed, 23 insertions, 18 deletions
diff --git a/kernel/kernel/filesystem/vfs.cpp b/kernel/kernel/filesystem/vfs.cpp
index 56e164bd..45424ee2 100644
--- a/kernel/kernel/filesystem/vfs.cpp
+++ b/kernel/kernel/filesystem/vfs.cpp
@@ -118,22 +118,28 @@ namespace kernel::filesystem
return std::unexpected{make_error_code(vfs_errc::invalid_path)};
}
- auto [mount_point_dentry, mount_context] = resolve_path_internal(target).value_or(std::pair{nullptr, nullptr});
- if (mount_point_dentry && mount_context)
+ auto resolved_target = resolve_path_internal(target);
+ if (!resolved_target)
{
- auto [source_dentry, source_mount_context] = resolve_path_internal(source).value_or(std::pair{nullptr, nullptr});
- if (source_dentry && source_mount_context)
- {
- if (auto fs = kernel::filesystem::filesystem::probe_and_mount(source_dentry->get_inode()))
- {
- do_mount_internal(mount_point_dentry, mount_context, *fs, source_mount_context);
- return {};
- }
- return std::unexpected{make_error_code(vfs_errc::invalid_filesystem)};
- }
- return std::unexpected{make_error_code(vfs_errc::non_existent_path)};
+ return std::unexpected{resolved_target.error()};
}
- return std::unexpected{make_error_code(vfs_errc::mount_point_not_found)};
+ auto [mount_point_dentry, mount_context] = *resolved_target;
+
+ auto resolved_source = resolve_path_internal(source);
+ if (!resolved_source)
+ {
+ return std::unexpected{resolved_source.error()};
+ }
+ auto [source_dentry, source_mount_context] = *resolved_source;
+
+ auto fs = kernel::filesystem::filesystem::probe_and_mount(source_dentry->get_inode());
+ if (!fs)
+ {
+ return std::unexpected{fs.error()};
+ }
+
+ do_mount_internal(mount_point_dentry, mount_context, *fs, source_mount_context);
+ return {};
}
auto vfs::unmount(std::string_view path) -> std::expected<void, kstd::error_code>
diff --git a/kernel/kernel/filesystem/vfs.tests.cpp b/kernel/kernel/filesystem/vfs.tests.cpp
index 59589633..e4f042e7 100644
--- a/kernel/kernel/filesystem/vfs.tests.cpp
+++ b/kernel/kernel/filesystem/vfs.tests.cpp
@@ -256,15 +256,14 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "VFS
THEN("mount with null file system fails")
{
- REQUIRE(vfs.do_mount("/closed.txt", "/information").error() ==
- make_error_code(kernel::filesystem::vfs_errc::invalid_filesystem));
+ REQUIRE(vfs.do_mount("/closed.txt", "/information").error() == make_error_condition(kstd::errc::not_supported));
}
THEN("mount with invalid path fails")
{
REQUIRE(vfs.do_mount("/dev/ram16", "").error() == make_error_code(kernel::filesystem::vfs_errc::invalid_path));
REQUIRE(vfs.do_mount("/dev/ram16", "information").error() ==
- make_error_code(kernel::filesystem::vfs_errc::mount_point_not_found));
+ make_error_code(kernel::filesystem::vfs_errc::invalid_path));
}
THEN("mount with non-existent source path fails")
@@ -276,7 +275,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "VFS
THEN("mount with non-existent mount point fails")
{
REQUIRE(vfs.do_mount("/dev/ram16", "/information/nonexistent").error() ==
- make_error_code(kernel::filesystem::vfs_errc::mount_point_not_found));
+ make_error_code(kernel::filesystem::vfs_errc::non_existent_path));
}
THEN("unmount with invalid path fails")