diff options
| author | Lukas Oesch <lukasoesch20@gmail.com> | 2026-05-15 16:50:55 +0200 |
|---|---|---|
| committer | Lukas Oesch <lukasoesch20@gmail.com> | 2026-05-16 11:56:07 +0200 |
| commit | 1d647adb1ba20121eeb5c8e4470f48b2e972b3d4 (patch) | |
| tree | d74522980f1853a6be0628158534c29cf48bdb1c /kernel/src/filesystem/vfs.cpp | |
| parent | 95ff59017db74a6988f791ca9f122254dd743541 (diff) | |
| download | kernel-1d647adb1ba20121eeb5c8e4470f48b2e972b3d4.tar.xz kernel-1d647adb1ba20121eeb5c8e4470f48b2e972b3d4.zip | |
Mount can only be unmounted if no references are present, increment references on open file and decrement on close file
Diffstat (limited to 'kernel/src/filesystem/vfs.cpp')
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index 77ae015..3b3d6ff 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -89,7 +89,22 @@ namespace kernel::filesystem auto vfs::open(std::string_view path) -> kstd::shared_ptr<dentry> { - return resolve_path(path); + auto [dentry, mount] = resolve_path_internal(path); + mount->increment_ref_count(); + return dentry; + } + + auto vfs::close(kstd::shared_ptr<dentry> const & dentry) -> operation_result + { + if (auto mount = find_mount(dentry->get_absolute_path().view())) + { + if (mount->decrement_ref_count()) + { + return operation_result::success; + } + return operation_result::close_failed; + } + return operation_result::invalid_path; } auto vfs::do_mount(std::string_view source, std::string_view target) -> operation_result |
