From 29e78eb35bdd6d1a73357ec8bcf9f45645e33637 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 13 Jul 2026 14:17:50 +0200 Subject: kernel/vfs: simplify do_mount --- kernel/kernel/filesystem/vfs.cpp | 34 ++++++++++++++++++++-------------- kernel/kernel/filesystem/vfs.tests.cpp | 7 +++---- 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 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") -- cgit v1.2.3