diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/vfs.cpp | 34 | ||||
| -rw-r--r-- | 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<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") |
