aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-05-31 15:06:51 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-14 20:39:57 +0200
commitb388d3187da121304a9e9d4a2b398117b8bfd5e9 (patch)
tree4bcb011c639420a0e0b1a06aaf1cd359283e04e2
parent10792616c5087fb781ad907c7edab9bfd6eb3d1a (diff)
downloadkernel-b388d3187da121304a9e9d4a2b398117b8bfd5e9.tar.xz
kernel-b388d3187da121304a9e9d4a2b398117b8bfd5e9.zip
refactoring
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.cpp43
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.hpp1
2 files changed, 26 insertions, 18 deletions
diff --git a/kernel/kernel/filesystem/ext2/filesystem.cpp b/kernel/kernel/filesystem/ext2/filesystem.cpp
index f29b3868..0f0d0eb3 100644
--- a/kernel/kernel/filesystem/ext2/filesystem.cpp
+++ b/kernel/kernel/filesystem/ext2/filesystem.cpp
@@ -155,32 +155,39 @@ namespace kernel::filesystem::ext2
auto filesystem::read_inode(uint32_t inode_number) const -> kstd::result<kstd::shared_ptr<inode>>
{
- auto const inodes_per_group = m_superblock.inodes_per_group;
- auto const block_group_index = (inode_number - 1) / inodes_per_group;
- auto const inode_index_within_group = (inode_number - 1) % inodes_per_group;
+ if (auto inode_offset = calculate_inode_offset(inode_number))
+ {
+ auto new_inode_data = inode_data{};
- if (block_group_index >= m_block_group_descriptors.size())
+ if (auto read_result = m_backing_inode->read(&new_inode_data, *inode_offset, sizeof(inode_data)); !read_result)
+ {
+ return kstd::failure(read_result.error());
+ }
+ else
+ {
+ return kstd::make_shared<inode>(const_cast<filesystem *>(this), inode_number, new_inode_data);
+ }
+ }
+ else
{
- return kstd::failure(ext2_errc::invalid_block_group_index);
+ return kstd::failure(inode_offset.error());
}
+ }
- auto const & block_group_descriptor = m_block_group_descriptors.at(block_group_index);
- auto const inode_table_start_block = block_group_descriptor.inode_table;
- 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 * inode_size();
-
- auto new_inode_data = inode_data{};
- if (auto read_result = m_backing_inode->read(&new_inode_data, inode_offset, sizeof(inode_data)); !read_result)
+ auto filesystem::write_inode(uint32_t inode_number, inode_data const & data) -> kstd::result<void>
+ {
+ if (auto inode_offset = calculate_inode_offset(inode_number))
{
- return kstd::failure(read_result.error());
+ return m_backing_inode->write(&data, *inode_offset, sizeof(inode_data)).transform([](auto) {});
+ }
+ else
+ {
+ return kstd::failure(inode_offset.error());
}
-
- return kstd::make_shared<inode>(const_cast<filesystem *>(this), inode_number, new_inode_data);
}
- auto filesystem::write_inode(uint32_t inode_number, inode_data const & data) -> kstd::result<void>
+ auto filesystem::calculate_inode_offset(uint32_t inode_number) const -> kstd::result<size_t>
{
- // TODO BA-FS26 refactoring
auto const inodes_per_group = m_superblock.inodes_per_group;
auto const block_group_index = (inode_number - 1) / inodes_per_group;
auto const inode_index_within_group = (inode_number - 1) % inodes_per_group;
@@ -195,7 +202,7 @@ 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 * inode_size();
- return m_backing_inode->write(&data, inode_offset, sizeof(inode_data)).transform([](auto) {});
+ return inode_offset;
}
auto filesystem::allocate_blocks(size_t count) -> kstd::result<kstd::vector<uint32_t>>
diff --git a/kernel/kernel/filesystem/ext2/filesystem.hpp b/kernel/kernel/filesystem/ext2/filesystem.hpp
index b514938c..6af49473 100644
--- a/kernel/kernel/filesystem/ext2/filesystem.hpp
+++ b/kernel/kernel/filesystem/ext2/filesystem.hpp
@@ -156,6 +156,7 @@ namespace kernel::filesystem::ext2
[[nodiscard]] auto indirect_levels() const -> std::array<indirect_level, 3>;
+ [[nodiscard]] auto calculate_inode_offset(uint32_t inode_number) const -> kstd::result<size_t>;
[[nodiscard]] auto read_inode(uint32_t inode_number) const -> kstd::result<kstd::shared_ptr<inode>>;
[[nodiscard]] auto read_block_number_at_index(uint32_t block_number, size_t index) const -> kstd::result<uint32_t>;