diff options
| -rw-r--r-- | kernel/kernel/filesystem/ext2/filesystem.cpp | 43 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/filesystem.hpp | 1 |
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>; |
