aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/vfs.cpp
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-05-15 16:50:55 +0200
committerLukas Oesch <lukasoesch20@gmail.com>2026-05-16 11:56:07 +0200
commit1d647adb1ba20121eeb5c8e4470f48b2e972b3d4 (patch)
treed74522980f1853a6be0628158534c29cf48bdb1c /kernel/src/filesystem/vfs.cpp
parent95ff59017db74a6988f791ca9f122254dd743541 (diff)
downloadkernel-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.cpp17
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