aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMarcel Braun <marcel.braun@ost.ch>2026-05-14 16:29:29 +0200
committerLukas Oesch <lukasoesch20@gmail.com>2026-05-16 11:56:07 +0200
commitc6953852b9e10823830688bdfb269650b080f1bb (patch)
treecbf3f05555fd6dc7760f116eeae825d674877e59 /kernel
parent245f47af9362e83235a28f993c89f844886e65c3 (diff)
downloadkernel-c6953852b9e10823830688bdfb269650b080f1bb.tar.xz
kernel-c6953852b9e10823830688bdfb269650b080f1bb.zip
Track dentry instead of inode in open_file_descriptor
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/kernel/filesystem/open_file_descriptor.hpp12
-rw-r--r--kernel/kapi/filesystem.cpp2
-rw-r--r--kernel/src/filesystem/open_file_descriptor.cpp15
-rw-r--r--kernel/src/filesystem/open_file_descriptor.tests.cpp14
-rw-r--r--kernel/src/filesystem/open_file_table.tests.cpp10
-rw-r--r--kernel/src/filesystem/vfs.tests.cpp6
6 files changed, 34 insertions, 25 deletions
diff --git a/kernel/include/kernel/filesystem/open_file_descriptor.hpp b/kernel/include/kernel/filesystem/open_file_descriptor.hpp
index 036dcf0..823fe13 100644
--- a/kernel/include/kernel/filesystem/open_file_descriptor.hpp
+++ b/kernel/include/kernel/filesystem/open_file_descriptor.hpp
@@ -1,7 +1,7 @@
#ifndef TEACH_OS_KERNEL_FILESYSTEM_OPEN_FILE_DESCRIPTOR_HPP
#define TEACH_OS_KERNEL_FILESYSTEM_OPEN_FILE_DESCRIPTOR_HPP
-#include <kernel/filesystem/inode.hpp>
+#include <kernel/filesystem/dentry.hpp>
#include <kstd/memory>
@@ -11,15 +11,15 @@ namespace kernel::filesystem
{
/**
@brief Represents an open file descriptor in the filesystem. This class encapsulates the state of an open file,
- including a reference to the associated inode and the current file offset.
+ including a reference to the associated dentry and the current file offset.
*/
struct open_file_descriptor
{
/**
- @brief Constructs an open file descriptor for the given @p inode.
- @param inode The inode to associate with the open file descriptor.
+ @brief Constructs an open file descriptor for the given @p dentry.
+ @param dentry The dentry to associate with the open file descriptor.
*/
- explicit open_file_descriptor(kstd::shared_ptr<inode> const & inode);
+ explicit open_file_descriptor(kstd::shared_ptr<dentry> const & dentry);
/**
@brief Destructor for the open file descriptor.
@@ -53,7 +53,7 @@ namespace kernel::filesystem
[[nodiscard]] auto offset() const -> size_t;
private:
- kstd::shared_ptr<inode> m_inode;
+ kstd::shared_ptr<dentry> m_dentry;
size_t m_offset;
};
diff --git a/kernel/kapi/filesystem.cpp b/kernel/kapi/filesystem.cpp
index 4c68f28..77d7eb0 100644
--- a/kernel/kapi/filesystem.cpp
+++ b/kernel/kapi/filesystem.cpp
@@ -35,7 +35,7 @@ namespace kapi::filesystem
{
if (auto dentry = kernel::filesystem::vfs::get().open(path))
{
- auto open_file_descriptor = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry->get_inode());
+ auto open_file_descriptor = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry);
return kernel::filesystem::open_file_table::get().add_file(open_file_descriptor);
}
diff --git a/kernel/src/filesystem/open_file_descriptor.cpp b/kernel/src/filesystem/open_file_descriptor.cpp
index 25bffbd..27e6449 100644
--- a/kernel/src/filesystem/open_file_descriptor.cpp
+++ b/kernel/src/filesystem/open_file_descriptor.cpp
@@ -1,6 +1,7 @@
-#include <kernel/filesystem/inode.hpp>
#include <kernel/filesystem/open_file_descriptor.hpp>
+#include <kernel/filesystem/dentry.hpp>
+
#include <kstd/memory>
#include <kstd/os/error.hpp>
@@ -8,26 +9,26 @@
namespace kernel::filesystem
{
- open_file_descriptor::open_file_descriptor(kstd::shared_ptr<inode> const & inode)
- : m_inode(inode)
+ open_file_descriptor::open_file_descriptor(kstd::shared_ptr<dentry> const & dentry)
+ : m_dentry(dentry)
, m_offset(0)
{
- if (!inode)
+ if (!dentry)
{
- kstd::os::panic("[FILESYSTEM] open_file_descriptor constructed with null inode.");
+ kstd::os::panic("[FILESYSTEM] open_file_descriptor constructed with null dentry.");
}
}
auto open_file_descriptor::read(void * buffer, size_t size) -> size_t
{
- auto read_bytes = m_inode->read(buffer, m_offset, size);
+ auto read_bytes = m_dentry->get_inode()->read(buffer, m_offset, size);
m_offset += read_bytes;
return read_bytes;
}
auto open_file_descriptor::write(void const * buffer, size_t size) -> size_t
{
- auto written_bytes = m_inode->write(buffer, m_offset, size);
+ auto written_bytes = m_dentry->get_inode()->write(buffer, m_offset, size);
m_offset += written_bytes;
return written_bytes;
}
diff --git a/kernel/src/filesystem/open_file_descriptor.tests.cpp b/kernel/src/filesystem/open_file_descriptor.tests.cpp
index 53835ba..8c24cf0 100644
--- a/kernel/src/filesystem/open_file_descriptor.tests.cpp
+++ b/kernel/src/filesystem/open_file_descriptor.tests.cpp
@@ -1,5 +1,7 @@
#include <kernel/filesystem/open_file_descriptor.hpp>
+#include <kernel/filesystem/dentry.hpp>
+#include <kernel/filesystem/inode.hpp>
#include <kernel/filesystem/vfs.hpp>
#include <kernel/test_support/filesystem/inode.hpp>
#include <kernel/test_support/filesystem/storage_boot_module_vfs_fixture.hpp>
@@ -16,10 +18,11 @@
SCENARIO("Open file descriptor construction", "[filesystem][open_file_descriptor]")
{
- GIVEN("an inode and an open file descriptor for that inode")
+ GIVEN("a dentry and an open file descriptor for that dentry")
{
auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
- auto file_descriptor = kernel::filesystem::open_file_descriptor{inode};
+ auto dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, inode, "test_dentry");
+ auto file_descriptor = kernel::filesystem::open_file_descriptor{dentry};
THEN("the initial offset is zero")
{
@@ -30,10 +33,11 @@ SCENARIO("Open file descriptor construction", "[filesystem][open_file_descriptor
SCENARIO("Open file descriptor read/write offset management", "[filesystem][open_file_descriptor]")
{
- GIVEN("an inode that tracks read/write calls and an open file descriptor for that inode")
+ GIVEN("a dentry that tracks read/write calls and an open file descriptor for that dentry")
{
auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
- auto file_descriptor = kernel::filesystem::open_file_descriptor{inode};
+ auto dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, inode, "test_dentry");
+ auto file_descriptor = kernel::filesystem::open_file_descriptor{dentry};
THEN("the offset is updated correctly after reads")
{
@@ -78,7 +82,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Ope
auto & vfs = kernel::filesystem::vfs::get();
auto dentry = vfs.open("/information/info_1.txt");
REQUIRE(dentry != nullptr);
- auto ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry->get_inode());
+ auto ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry);
THEN("the file can be read and the offset is updated")
{
diff --git a/kernel/src/filesystem/open_file_table.tests.cpp b/kernel/src/filesystem/open_file_table.tests.cpp
index a5c791d..456d6b7 100644
--- a/kernel/src/filesystem/open_file_table.tests.cpp
+++ b/kernel/src/filesystem/open_file_table.tests.cpp
@@ -1,5 +1,6 @@
#include <kernel/filesystem/open_file_table.hpp>
+#include <kernel/filesystem/dentry.hpp>
#include <kernel/filesystem/open_file_descriptor.hpp>
#include <kernel/test_support/filesystem/inode.hpp>
@@ -15,8 +16,10 @@ SCENARIO("Open file table add/get file", "[filesystem][open_file_table]")
{
auto & table = kernel::filesystem::open_file_table::get();
auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
- auto file_descriptor_1 = kstd::make_shared<kernel::filesystem::open_file_descriptor>(inode);
- auto file_descriptor_2 = kstd::make_shared<kernel::filesystem::open_file_descriptor>(inode);
+ auto dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, inode, "test_dentry");
+
+ auto file_descriptor_1 = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry);
+ auto file_descriptor_2 = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry);
WHEN("adding the open file descriptor to the open file table")
{
@@ -69,7 +72,8 @@ SCENARIO("Open file table remove file", "[filesystem][open_file_table]")
{
auto & table = kernel::filesystem::open_file_table::get();
auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
- auto file_descriptor = kstd::make_shared<kernel::filesystem::open_file_descriptor>(inode);
+ auto dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, inode, "test_dentry");
+ auto file_descriptor = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry);
auto fd = table.add_file(file_descriptor);
WHEN("removing the file descriptor using the file descriptor")
diff --git a/kernel/src/filesystem/vfs.tests.cpp b/kernel/src/filesystem/vfs.tests.cpp
index 0f1d6d5..eaffbc9 100644
--- a/kernel/src/filesystem/vfs.tests.cpp
+++ b/kernel/src/filesystem/vfs.tests.cpp
@@ -310,7 +310,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "VFS
auto dentry = vfs.open("/information/sheep_1.txt");
REQUIRE(dentry != nullptr);
- auto sheep_1_ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry->get_inode());
+ auto sheep_1_ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry);
kstd::vector<std::byte> buffer(7);
auto bytes_read = sheep_1_ofd->read(buffer.data(), buffer.size());
@@ -335,8 +335,8 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "VFS
REQUIRE(sheep_1 != nullptr);
REQUIRE(goat_1 != nullptr);
- auto sheep_1_ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(sheep_1->get_inode());
- auto goat_1_ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(goat_1->get_inode());
+ auto sheep_1_ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(sheep_1);
+ auto goat_1_ofd = kstd::make_shared<kernel::filesystem::open_file_descriptor>(goat_1);
kstd::vector<std::byte> sheep_buffer(7);
auto bytes_read = sheep_1_ofd->read(sheep_buffer.data(), sheep_buffer.size());