aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/vfs.cpp
diff options
context:
space:
mode:
authorMarcel Braun <marcel.braun@ost.ch>2026-05-25 11:13:18 +0200
committerMarcel Braun <marcel.braun@ost.ch>2026-05-25 11:13:18 +0200
commit61d29a288334960cd9f43df91e4fd632a7f6ad66 (patch)
tree8ca81c4589ef2a2ca55a4a33527a6f12c34bd224 /kernel/src/filesystem/vfs.cpp
parent093074d5209f2d0062be79059f5881ee051c07d0 (diff)
downloadkernel-61d29a288334960cd9f43df91e4fd632a7f6ad66.tar.xz
kernel-61d29a288334960cd9f43df91e4fd632a7f6ad66.zip
Increase reference count of source_mount when one of its files is mounted somewhere
Diffstat (limited to 'kernel/src/filesystem/vfs.cpp')
-rw-r--r--kernel/src/filesystem/vfs.cpp26
1 files changed, 12 insertions, 14 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index bf9a77d..ae85291 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -47,7 +47,7 @@ namespace kernel::filesystem
root_fs->mount(nullptr);
auto root_fs_root_dentry = kstd::make_shared<dentry>(nullptr, root_fs->root_inode(), "/");
- auto root_mount = kstd::make_shared<mount>(nullptr, root_fs_root_dentry, root_fs, nullptr);
+ auto root_mount = kstd::make_shared<mount>(nullptr, root_fs_root_dentry, root_fs, nullptr, nullptr);
m_mount_table.add_mount(root_mount);
// mount devfs at /dev (inside rootfs, temporary, will be shadowed)
@@ -56,13 +56,14 @@ namespace kernel::filesystem
graft_persistent_device_fs(device_fs);
// mount boot fs at / (shadows rootfs), re-graft devfs
- if (auto boot_device_dentry = resolve_path("/dev/ram0"))
+ auto [boot_device_dentry, boot_device_mount_context] = resolve_path_internal("/dev/ram0");
+ if (boot_device_dentry && boot_device_mount_context)
{
if (auto boot_root_fs = kernel::filesystem::filesystem::probe_and_mount(boot_device_dentry->get_inode()))
{
if (auto root_dentry = resolve_path("/"))
{
- do_mount_internal(root_dentry, root_mount, boot_root_fs);
+ do_mount_internal(root_dentry, root_mount, boot_root_fs, boot_device_mount_context);
graft_persistent_device_fs(device_fs);
}
}
@@ -94,11 +95,8 @@ namespace kernel::filesystem
{
if (auto mount = find_mount(path))
{
- if (mount->decrement_ref_count())
- {
- return operation_result::success;
- }
- return operation_result::close_failed;
+ mount->decrement_ref_count();
+ return operation_result::success;
}
return operation_result::invalid_path;
}
@@ -111,14 +109,14 @@ namespace kernel::filesystem
}
auto [mount_point_dentry, mount_context] = resolve_path_internal(target);
-
if (mount_point_dentry && mount_context)
{
- if (auto source_dentry = resolve_path(source))
+ auto [source_dentry, source_mount_context] = resolve_path_internal(source);
+ 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);
+ do_mount_internal(mount_point_dentry, mount_context, fs, source_mount_context);
return operation_result::success;
}
return operation_result::invalid_filesystem;
@@ -149,12 +147,12 @@ namespace kernel::filesystem
}
auto vfs::do_mount_internal(kstd::shared_ptr<dentry> const & mount_point_dentry,
- kstd::shared_ptr<mount> const & parent_mount, kstd::shared_ptr<filesystem> const & fs)
- -> void
+ kstd::shared_ptr<mount> const & parent_mount, kstd::shared_ptr<filesystem> const & fs,
+ kstd::shared_ptr<mount> const & source_mount) -> void
{
auto new_fs_root =
kstd::make_shared<dentry>(mount_point_dentry->parent(), fs->root_inode(), mount_point_dentry->name());
- auto new_mount = kstd::make_shared<mount>(mount_point_dentry, new_fs_root, fs, parent_mount);
+ auto new_mount = kstd::make_shared<mount>(mount_point_dentry, new_fs_root, fs, parent_mount, source_mount);
m_mount_table.add_mount(new_mount);
}