aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem
diff options
context:
space:
mode:
authorMarcel Braun <marcel.braun@ost.ch>2026-05-11 20:48:03 +0200
committerLukas Oesch <lukasoesch20@gmail.com>2026-05-11 22:37:29 +0200
commit5d72c256d4e2b8a9d2fd70e5a27e883a0f733e50 (patch)
tree3cb736b269ae576eb1799a4f6b337028b6f6cc71 /kernel/src/filesystem
parent763227e31adf924a5dfe3139db158e26162294a0 (diff)
downloadkernel-5d72c256d4e2b8a9d2fd70e5a27e883a0f733e50.tar.xz
kernel-5d72c256d4e2b8a9d2fd70e5a27e883a0f733e50.zip
Add is_mount_root flag to dentry and use in find_mount_root_dentry
Diffstat (limited to 'kernel/src/filesystem')
-rw-r--r--kernel/src/filesystem/dentry.cpp4
-rw-r--r--kernel/src/filesystem/dentry.tests.cpp14
-rw-r--r--kernel/src/filesystem/mount_table.cpp9
-rw-r--r--kernel/src/filesystem/mount_table.tests.cpp10
-rw-r--r--kernel/src/filesystem/vfs.cpp4
5 files changed, 22 insertions, 19 deletions
diff --git a/kernel/src/filesystem/dentry.cpp b/kernel/src/filesystem/dentry.cpp
index 6945a27..c21771b 100644
--- a/kernel/src/filesystem/dentry.cpp
+++ b/kernel/src/filesystem/dentry.cpp
@@ -66,10 +66,10 @@ namespace kernel::filesystem
return path;
}
- auto dentry::get_ancestor_with_mount_flag() const -> kstd::shared_ptr<dentry>
+ auto dentry::find_mount_root_dentry() const -> kstd::shared_ptr<dentry>
{
auto parent = m_parent;
- while (parent && !parent->has_flag(dentry_flags::mounted))
+ while (parent && !parent->has_flag(dentry_flags::is_mount_root))
{
parent = parent->get_parent();
}
diff --git a/kernel/src/filesystem/dentry.tests.cpp b/kernel/src/filesystem/dentry.tests.cpp
index dd01394..e9ecbc8 100644
--- a/kernel/src/filesystem/dentry.tests.cpp
+++ b/kernel/src/filesystem/dentry.tests.cpp
@@ -28,7 +28,7 @@ SCENARIO("Dentry construction", "[filesystem][dentry]")
THEN("no flag is set")
{
- REQUIRE_FALSE(child_dentry.has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE_FALSE(child_dentry.has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
}
}
@@ -53,7 +53,7 @@ SCENARIO("Dentry construction", "[filesystem][dentry]")
THEN("no flag is set")
{
- REQUIRE_FALSE(child_dentry.has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE_FALSE(child_dentry.has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
}
}
@@ -104,22 +104,22 @@ SCENARIO("Dentry Flag logic", "[filesystem][dentry]")
WHEN("setting a flag")
{
- dentry.set_flag(kernel::filesystem::dentry::dentry_flags::mounted);
+ dentry.set_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point);
THEN("the flag is set")
{
- REQUIRE(dentry.has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE(dentry.has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
}
}
WHEN("unsetting a flag")
{
- dentry.set_flag(kernel::filesystem::dentry::dentry_flags::mounted);
- dentry.unset_flag(kernel::filesystem::dentry::dentry_flags::mounted);
+ dentry.set_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point);
+ dentry.unset_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point);
THEN("the flag is unset")
{
- REQUIRE_FALSE(dentry.has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE_FALSE(dentry.has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
}
}
}
diff --git a/kernel/src/filesystem/mount_table.cpp b/kernel/src/filesystem/mount_table.cpp
index 30a94f4..74c18ca 100644
--- a/kernel/src/filesystem/mount_table.cpp
+++ b/kernel/src/filesystem/mount_table.cpp
@@ -7,7 +7,6 @@
#include <kstd/vector>
#include <algorithm>
-#include <cstddef>
#include <ranges>
#include <string_view>
@@ -56,7 +55,11 @@ namespace kernel::filesystem
m_mounts.push_back(mount);
if (auto mount_dentry = mount->get_mount_dentry())
{
- mount_dentry->set_flag(dentry::dentry_flags::mounted);
+ mount_dentry->set_flag(dentry::dentry_flags::is_mount_point);
+ }
+ if (auto root_dentry = mount->get_root_dentry())
+ {
+ root_dentry->set_flag(dentry::dentry_flags::is_mount_root);
}
}
@@ -77,7 +80,7 @@ namespace kernel::filesystem
return operation_result::has_child_mounts;
}
- mount->get_mount_dentry()->unset_flag(dentry::dentry_flags::mounted);
+ mount->get_mount_dentry()->unset_flag(dentry::dentry_flags::is_mount_point);
m_mounts.erase(std::ranges::find(m_mounts, mount));
return operation_result::removed;
}
diff --git a/kernel/src/filesystem/mount_table.tests.cpp b/kernel/src/filesystem/mount_table.tests.cpp
index 80772ca..4ae8711 100644
--- a/kernel/src/filesystem/mount_table.tests.cpp
+++ b/kernel/src/filesystem/mount_table.tests.cpp
@@ -52,8 +52,8 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem]
THEN("dentry flags are set correctly for mounted dentries")
{
- REQUIRE(mount_dentry1->has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
- REQUIRE(mount_dentry2->has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE(mount_dentry1->has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
+ REQUIRE(mount_dentry2->has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
}
THEN("finding mounts by exact valid path returns the correct mount")
@@ -71,7 +71,7 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem]
THEN("removing a mount that has no child mounts succeeds")
{
REQUIRE(table.remove_mount("/mnt") == kernel::filesystem::mount_table::operation_result::removed);
- REQUIRE_FALSE(root_dentry2->has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE_FALSE(root_dentry2->has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
}
THEN("removing a mount that does not exist returns mount_not_found")
@@ -109,7 +109,7 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem]
THEN("removing the topmost mount with the same path succeeds")
{
REQUIRE(table.remove_mount("/") == kernel::filesystem::mount_table::operation_result::removed);
- REQUIRE_FALSE(root_dentry2->has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE_FALSE(root_dentry2->has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
}
}
@@ -151,7 +151,7 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem]
THEN("removing a leaf mount succeeds")
{
REQUIRE(table.remove_mount("/mnt/submnt") == kernel::filesystem::mount_table::operation_result::removed);
- REQUIRE_FALSE(root_dentry3->has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE_FALSE(root_dentry3->has_flag(kernel::filesystem::dentry::dentry_flags::is_mount_point));
}
}
}
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index e7f9015..ee7c262 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -138,7 +138,7 @@ namespace kernel::filesystem
auto vfs::do_mount_internal(kstd::shared_ptr<dentry> const & mount_point_dentry,
kstd::shared_ptr<filesystem> const & fs) -> void
{
- auto parent_mount_dentry = mount_point_dentry->get_ancestor_with_mount_flag();
+ auto parent_mount_dentry = mount_point_dentry->find_mount_root_dentry();
kstd::shared_ptr<mount> parent_mount = nullptr;
if (parent_mount_dentry)
{
@@ -217,7 +217,7 @@ namespace kernel::filesystem
next_dentry = kstd::make_shared<dentry>(current_dentry, found_inode, part.view());
current_dentry->add_child(next_dentry);
}
- else if (next_dentry->has_flag(dentry::dentry_flags::mounted))
+ else if (next_dentry->has_flag(dentry::dentry_flags::is_mount_point))
{
current_mount = m_mount_table.find_exact_mount(next_dentry->get_absolute_path().view());
if (!current_mount)