aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-04-28 10:49:34 +0200
committerLukas Oesch <lukasoesch20@gmail.com>2026-05-05 14:38:51 +0200
commitb3209ac2564f21f3b78ecf5e0c05ca346a4a4276 (patch)
tree25c859242bbe610ba8cdb132ed6776edafbe7049 /kernel/src/filesystem
parent3082340fa8ab3c7c0da5d2f9d321d2367d399b20 (diff)
downloadkernel-b3209ac2564f21f3b78ecf5e0c05ca346a4a4276.tar.xz
kernel-b3209ac2564f21f3b78ecf5e0c05ca346a4a4276.zip
refactor inode kind
Diffstat (limited to 'kernel/src/filesystem')
-rw-r--r--kernel/src/filesystem/devfs/inode.cpp11
-rw-r--r--kernel/src/filesystem/device_inode.cpp9
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp36
-rw-r--r--kernel/src/filesystem/ext2/inode.cpp21
-rw-r--r--kernel/src/filesystem/ext2/inode.tests.cpp37
-rw-r--r--kernel/src/filesystem/inode.cpp10
-rw-r--r--kernel/src/filesystem/rootfs/inode.cpp9
7 files changed, 67 insertions, 66 deletions
diff --git a/kernel/src/filesystem/devfs/inode.cpp b/kernel/src/filesystem/devfs/inode.cpp
index 0ed66ad..2029a7f 100644
--- a/kernel/src/filesystem/devfs/inode.cpp
+++ b/kernel/src/filesystem/devfs/inode.cpp
@@ -1,15 +1,9 @@
#include <kernel/filesystem/devfs/inode.hpp>
-#include <kernel/filesystem/inode.hpp>
-
#include <cstddef>
namespace kernel::filesystem::devfs
{
- inode::inode()
- : kernel::filesystem::inode(inode_kind::directory)
- {}
-
auto inode::read(void * /*buffer*/, size_t /*offset*/, size_t /*size*/) const -> size_t
{
return 0;
@@ -19,4 +13,9 @@ namespace kernel::filesystem::devfs
{
return 0;
}
+
+ auto inode::is_directory() const -> bool
+ {
+ return true;
+ }
} // namespace kernel::filesystem::devfs \ No newline at end of file
diff --git a/kernel/src/filesystem/device_inode.cpp b/kernel/src/filesystem/device_inode.cpp
index 3bafe06..81a784c 100644
--- a/kernel/src/filesystem/device_inode.cpp
+++ b/kernel/src/filesystem/device_inode.cpp
@@ -1,7 +1,6 @@
#include <kernel/filesystem/device_inode.hpp>
#include <kernel/devices/block_device_utils.hpp>
-#include <kernel/filesystem/inode.hpp>
#include <kapi/devices/device.hpp>
#include <kapi/system.hpp>
@@ -13,8 +12,7 @@
namespace kernel::filesystem
{
device_inode::device_inode(kstd::shared_ptr<kapi::devices::device> const & device)
- : inode(inode_kind::device)
- , m_device(device)
+ : m_device(device)
{
if (!device)
{
@@ -51,4 +49,9 @@ namespace kernel::filesystem
return m_device;
}
+ auto device_inode::is_device() const -> bool
+ {
+ return true;
+ }
+
} // namespace kernel::filesystem \ No newline at end of file
diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp
index 41572ee..47e54fe 100644
--- a/kernel/src/filesystem/ext2/filesystem.cpp
+++ b/kernel/src/filesystem/ext2/filesystem.cpp
@@ -16,19 +16,6 @@
namespace kernel::filesystem::ext2
{
- namespace
- {
- auto S_ISREG(uint16_t mode) -> bool
- {
- return (mode & constants::mode_mask) == constants::mode_regular;
- }
-
- auto S_ISDIR(uint16_t mode) -> bool
- {
- return (mode & constants::mode_mask) == constants::mode_directory;
- }
- } // namespace
-
auto filesystem::mount(kstd::shared_ptr<kernel::filesystem::inode> const & backing_inode) -> operation_result
{
kernel::filesystem::filesystem::mount(backing_inode);
@@ -74,7 +61,7 @@ namespace kernel::filesystem::ext2
}
auto const block_size = get_block_size();
- auto const & inode_data = ext2_parent->m_data;
+ auto const & inode_data = ext2_parent->data();
kstd::vector<uint8_t> buffer(block_size);
for (uint32_t i = 0; i < get_inode_block_count(inode_data); ++i)
@@ -119,25 +106,10 @@ namespace kernel::filesystem::ext2
auto const inode_table_offset = static_cast<size_t>(inode_table_start_block) * block_size;
auto const inode_offset = inode_table_offset + inode_index_within_group * get_inode_size();
- auto new_inode = kstd::make_shared<inode>(this);
- m_backing_inode->read(&new_inode->m_data, inode_offset, sizeof(inode_data));
-
- // TODO BA-FS26 improve inode_kind really needed? or just map it to the mode bits?
- if (S_ISREG(new_inode->m_data.mode))
- {
- new_inode->m_kind = inode::inode_kind::regular;
- }
- else if (S_ISDIR(new_inode->m_data.mode))
- {
- new_inode->m_kind = inode::inode_kind::directory;
- }
- else
- {
- // TODO BA-FS26 really correct??
- return nullptr;
- }
+ auto new_inode_data = inode_data{};
+ m_backing_inode->read(&new_inode_data, inode_offset, sizeof(inode_data));
- return new_inode;
+ return kstd::make_shared<inode>(this, new_inode_data);
}
auto filesystem::map_inode_block_index_to_global_block_number(uint32_t inode_block_index, inode_data data) -> uint32_t
diff --git a/kernel/src/filesystem/ext2/inode.cpp b/kernel/src/filesystem/ext2/inode.cpp
index c45c41e..279c84f 100644
--- a/kernel/src/filesystem/ext2/inode.cpp
+++ b/kernel/src/filesystem/ext2/inode.cpp
@@ -11,9 +11,9 @@
namespace kernel::filesystem::ext2
{
- inode::inode(filesystem * fs)
- : kernel::filesystem::inode(inode_kind::regular)
- , m_filesystem(fs)
+ inode::inode(filesystem * fs, inode_data const & data)
+ : m_filesystem(fs)
+ , m_data(data)
{
if (!m_filesystem)
{
@@ -57,4 +57,19 @@ namespace kernel::filesystem::ext2
kapi::system::panic("[EXT2] inode::write is not implemented yet");
return 0;
}
+
+ [[nodiscard]] auto inode::data() const -> inode_data const &
+ {
+ return m_data;
+ }
+
+ auto inode::is_regular() const -> bool
+ {
+ return (m_data.mode & constants::mode_mask) == constants::mode_regular;
+ }
+
+ auto inode::is_directory() const -> bool
+ {
+ return (m_data.mode & constants::mode_mask) == constants::mode_directory;
+ }
} // namespace kernel::filesystem::ext2
diff --git a/kernel/src/filesystem/ext2/inode.tests.cpp b/kernel/src/filesystem/ext2/inode.tests.cpp
index 4d61790..e68352f 100644
--- a/kernel/src/filesystem/ext2/inode.tests.cpp
+++ b/kernel/src/filesystem/ext2/inode.tests.cpp
@@ -23,21 +23,34 @@ SCENARIO("Ext2 inode initialization and properties", "[filesystem][ext2][inode]"
GIVEN("an ext2 filesystem")
{
auto fs = kernel::filesystem::ext2::filesystem{};
+ auto data = kernel::filesystem::ext2::inode_data{};
- THEN("the inode is initialized and has the kind regular")
+ THEN("the inode is initialized with regular file mode in data and has the kind regular")
{
- auto inode = kernel::filesystem::ext2::inode{&fs};
+ data.mode = kernel::filesystem::ext2::constants::mode_regular;
+ auto inode = kernel::filesystem::ext2::inode(&fs, data);
+
REQUIRE(inode.is_regular());
REQUIRE(!inode.is_directory());
REQUIRE(!inode.is_device());
}
+
+ THEN("the inode is initialized with directory mode in data and has the kind directory")
+ {
+ data.mode = kernel::filesystem::ext2::constants::mode_directory;
+ auto inode = kernel::filesystem::ext2::inode(&fs, data);
+
+ REQUIRE(!inode.is_regular());
+ REQUIRE(inode.is_directory());
+ REQUIRE(!inode.is_device());
+ }
}
GIVEN("no filesystem (null pointer)")
{
THEN("constructing an inode with a null filesystem pointer panics")
{
- REQUIRE_THROWS_AS(kernel::filesystem::ext2::inode{nullptr}, kernel::tests::cpu::halt);
+ REQUIRE_THROWS_AS(kernel::filesystem::ext2::inode(nullptr, {}), kernel::tests::cpu::halt);
}
}
}
@@ -102,9 +115,10 @@ SCENARIO("Ext2 inode read stops when block mapping resolves to zero", "[filesyst
auto fs = kernel::filesystem::ext2::filesystem{};
REQUIRE(fs.mount(dev_inode) == kernel::filesystem::filesystem::operation_result::success);
- auto inode = kernel::filesystem::ext2::inode{&fs};
- inode.m_data.blocks = 2;
- inode.m_data.block[0] = 0;
+ auto data = kernel::filesystem::ext2::inode_data{};
+ data.blocks = 2;
+ data.block[0] = 0;
+ auto inode = kernel::filesystem::ext2::inode{&fs, data};
auto buffer = kstd::vector<std::byte>(32, std::byte{0xAB});
@@ -130,12 +144,13 @@ SCENARIO("Ext2 inode read across block boundaries", "[filesystem][ext2][inode]")
auto fs = kernel::filesystem::ext2::filesystem{};
REQUIRE(fs.mount(dev_inode) == kernel::filesystem::filesystem::operation_result::success);
- auto inode = kernel::filesystem::ext2::inode{&fs};
- inode.m_data.blocks = 2;
- inode.m_data.block[0] = 20;
+ auto inode_data = kernel::filesystem::ext2::inode_data{};
+ inode_data.blocks = 2;
+ inode_data.block[0] = 20;
kernel::tests::filesystem::ext2::write_bytes(*device, 21 * block_size - 6, "Hello ", 6);
- inode.m_data.block[1] = 21;
+ inode_data.block[1] = 21;
kernel::tests::filesystem::ext2::write_bytes(*device, 21 * block_size, "World!", 6);
+ auto inode = kernel::filesystem::ext2::inode{&fs, inode_data};
auto buffer = kstd::vector<std::byte>(12, std::byte{0x00});
@@ -155,7 +170,7 @@ SCENARIO("Ext2 inode write is not implemented", "[filesystem][ext2][inode]")
GIVEN("an ext2 inode")
{
auto fs = kernel::filesystem::ext2::filesystem{};
- auto inode = kernel::filesystem::ext2::inode{&fs};
+ auto inode = kernel::filesystem::ext2::inode{&fs, kernel::filesystem::ext2::inode_data{}};
THEN("writing to the inode panics")
{
diff --git a/kernel/src/filesystem/inode.cpp b/kernel/src/filesystem/inode.cpp
index 2f0764c..f2a7741 100644
--- a/kernel/src/filesystem/inode.cpp
+++ b/kernel/src/filesystem/inode.cpp
@@ -2,22 +2,18 @@
namespace kernel::filesystem
{
- inode::inode(inode_kind kind)
- : m_kind(kind)
- {}
-
auto inode::is_directory() const -> bool
{
- return m_kind == inode_kind::directory;
+ return false;
}
auto inode::is_regular() const -> bool
{
- return m_kind == inode_kind::regular;
+ return false;
}
auto inode::is_device() const -> bool
{
- return m_kind == inode_kind::device;
+ return false;
}
} // namespace kernel::filesystem \ No newline at end of file
diff --git a/kernel/src/filesystem/rootfs/inode.cpp b/kernel/src/filesystem/rootfs/inode.cpp
index eeea3fe..d099676 100644
--- a/kernel/src/filesystem/rootfs/inode.cpp
+++ b/kernel/src/filesystem/rootfs/inode.cpp
@@ -12,10 +12,6 @@
namespace kernel::filesystem::rootfs
{
- inode::inode()
- : kernel::filesystem::inode(inode_kind::directory)
- {}
-
auto inode::read(void * /*buffer*/, size_t /*offset*/, size_t /*size*/) const -> size_t
{
return 0;
@@ -36,4 +32,9 @@ namespace kernel::filesystem::rootfs
auto it = std::ranges::find_if(m_children, [&](auto const & pair) { return pair.first == name; });
return (it != m_children.end()) ? it->second : nullptr;
}
+
+ auto inode::is_directory() const -> bool
+ {
+ return true;
+ }
} // namespace kernel::filesystem::rootfs