aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem
diff options
context:
space:
mode:
authorMarcel Braun <marcel.braun@ost.ch>2026-05-11 18:46:10 +0200
committerMarcel Braun <marcel.braun@ost.ch>2026-05-11 18:46:10 +0200
commit7ea0aa798e3062dea20a317e2b19d7cf879611ca (patch)
tree6da63f9d67d6995a80264326becfd6f95d257624 /kernel/src/filesystem
parent8a11512eb8030de09ed806d8b40b7f54c2f204ab (diff)
downloadkernel-7ea0aa798e3062dea20a317e2b19d7cf879611ca.tar.xz
kernel-7ea0aa798e3062dea20a317e2b19d7cf879611ca.zip
Refactor dentry
Diffstat (limited to 'kernel/src/filesystem')
-rw-r--r--kernel/src/filesystem/dentry.cpp40
-rw-r--r--kernel/src/filesystem/dentry.tests.cpp15
2 files changed, 21 insertions, 34 deletions
diff --git a/kernel/src/filesystem/dentry.cpp b/kernel/src/filesystem/dentry.cpp
index a3bd7f4..7617b28 100644
--- a/kernel/src/filesystem/dentry.cpp
+++ b/kernel/src/filesystem/dentry.cpp
@@ -23,6 +23,10 @@ namespace kernel::filesystem
{
kapi::system::panic("[FILESYSTEM] dentry constructed with null inode.");
}
+ if (m_name.empty())
+ {
+ kapi::system::panic("[FILESYSTEM] dentry constructed with empty name.");
+ }
}
auto dentry::get_inode() const -> kstd::shared_ptr<inode> const &
@@ -42,33 +46,25 @@ namespace kernel::filesystem
auto dentry::get_full_path() const -> kstd::string
{
- if (m_name == "/")
- {
- return "/";
- }
-
- kstd::vector<std::string_view> components;
- components.push_back(m_name.view());
- components.push_back("/");
+ kstd::string path = m_name;
auto parent = m_parent;
-
- while (parent && parent->m_name != "/")
- {
- components.push_back(parent->m_name.view());
- components.push_back("/");
- parent = parent->get_parent();
- }
-
- std::ranges::reverse(components);
-
- kstd::string full_path = "";
- for (auto const & view : components)
+ while (parent)
{
- full_path += view;
+ auto parent_name = parent->m_name;
+ if (parent_name == "/")
+ {
+ path = "/" + path;
+ }
+ else
+ {
+ path = parent_name + "/" + path;
+ }
+
+ parent = parent->m_parent;
}
- return full_path;
+ return path;
}
auto dentry::add_child(kstd::shared_ptr<dentry> const & child) -> void
diff --git a/kernel/src/filesystem/dentry.tests.cpp b/kernel/src/filesystem/dentry.tests.cpp
index c42c405..200262a 100644
--- a/kernel/src/filesystem/dentry.tests.cpp
+++ b/kernel/src/filesystem/dentry.tests.cpp
@@ -13,7 +13,7 @@ SCENARIO("Dentry construction", "[filesystem][dentry]")
GIVEN("A parent dentry and inode")
{
auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
- auto parent_dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, inode);
+ auto parent_dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, inode, "parent");
WHEN("constructing a dentry")
{
@@ -34,18 +34,9 @@ SCENARIO("Dentry construction", "[filesystem][dentry]")
WHEN("constructing a dentry with an empty name")
{
- auto child_dentry = kernel::filesystem::dentry{parent_dentry, inode};
-
THEN("the dentry has the correct parent and inode, and an empty name")
{
- REQUIRE(child_dentry.get_parent() == parent_dentry);
- REQUIRE(child_dentry.get_inode() == inode);
- REQUIRE(child_dentry.get_name().empty());
- }
-
- THEN("no flag is set")
- {
- REQUIRE_FALSE(child_dentry.has_flag(kernel::filesystem::dentry::dentry_flags::mounted));
+ REQUIRE_THROWS_AS((kernel::filesystem::dentry{parent_dentry, inode, ""}), kernel::tests::cpu::halt);
}
}
@@ -81,7 +72,7 @@ SCENARIO("Dentry child logic", "[filesystem][dentry]")
GIVEN("A parent dentry and inode")
{
auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
- auto parent_dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, inode);
+ auto parent_dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, inode, "parent");
WHEN("adding child dentries")
{