aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/kernel/filesystem/dentry.hpp7
-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
6 files changed, 26 insertions, 22 deletions
diff --git a/kernel/include/kernel/filesystem/dentry.hpp b/kernel/include/kernel/filesystem/dentry.hpp
index 1d99a25..7eef693 100644
--- a/kernel/include/kernel/filesystem/dentry.hpp
+++ b/kernel/include/kernel/filesystem/dentry.hpp
@@ -24,7 +24,8 @@ namespace kernel::filesystem
*/
enum class dentry_flags : uint32_t
{
- mounted = 1 << 15
+ is_mount_point = 1 << 0,
+ is_mount_root = 1 << 1,
};
/**
@@ -61,10 +62,10 @@ namespace kernel::filesystem
[[nodiscard]] auto get_absolute_path() const -> kstd::string;
/**
- @brief traverse parent dentries until dentry with mount flag is found.
+ @brief traverse parent dentries until dentry with is_mount_root flag is found.
@return The found dentry.
*/
- [[nodiscard]] auto get_ancestor_with_mount_flag() const -> kstd::shared_ptr<dentry>;
+ [[nodiscard]] auto find_mount_root_dentry() const -> kstd::shared_ptr<dentry>;
/**
@brief Add a @p child dentry.
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)