aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/include/kernel/filesystem/ext2/filesystem.hpp1
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp101
2 files changed, 49 insertions, 53 deletions
diff --git a/kernel/include/kernel/filesystem/ext2/filesystem.hpp b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
index dea059f..9761903 100644
--- a/kernel/include/kernel/filesystem/ext2/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
@@ -27,6 +27,7 @@ namespace kernel::filesystem::ext2
private:
auto read_inode(uint32_t inode_number) -> kstd::shared_ptr<kernel::filesystem::ext2::inode>;
auto map_inode_block_index_to_global_block_number(uint32_t inode_block_index, inode_data data) -> uint32_t;
+ auto read_block_number_at_index(uint32_t block_number, uint32_t index) -> uint32_t;
auto get_block_size() -> size_t;
auto get_inode_size() -> size_t;
diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp
index a84414f..56c0b88 100644
--- a/kernel/src/filesystem/ext2/filesystem.cpp
+++ b/kernel/src/filesystem/ext2/filesystem.cpp
@@ -29,8 +29,8 @@ namespace kernel::filesystem::ext2
constexpr uint32_t ROOT_INODE_NUMBER = 2;
constexpr size_t DIRECT_BLOCK_COUNT = 12;
- constexpr size_t INDIRECT_BLOCK_INDEX = DIRECT_BLOCK_COUNT;
- constexpr size_t DOUBLY_INDIRECT_BLOCK_INDEX = INDIRECT_BLOCK_INDEX + 1;
+ constexpr size_t SINGLY_INDIRECT_BLOCK_INDEX = DIRECT_BLOCK_COUNT;
+ constexpr size_t DOUBLY_INDIRECT_BLOCK_INDEX = SINGLY_INDIRECT_BLOCK_INDEX + 1;
constexpr size_t TRIPLY_INDIRECT_BLOCK_INDEX = DOUBLY_INDIRECT_BLOCK_INDEX + 1;
// Mode bits
@@ -167,70 +167,65 @@ namespace kernel::filesystem::ext2
auto const block_size = get_block_size();
auto const numbers_per_block = block_size / sizeof(uint32_t);
- uint32_t block_number_buffer = 0;
- auto const number_of_singly_indirect_blocks = numbers_per_block;
- if (inode_block_index < number_of_singly_indirect_blocks)
+ auto const block_numbers_per_singly_indirect_block = numbers_per_block;
+ auto const block_numbers_per_doubly_indirect_block = numbers_per_block * block_numbers_per_singly_indirect_block;
+ auto const block_numbers_per_triply_indirect_block = numbers_per_block * block_numbers_per_doubly_indirect_block;
+
+ if (inode_block_index < block_numbers_per_singly_indirect_block)
{
- auto const indirect_block_start_offset = data.block.at(INDIRECT_BLOCK_INDEX) * block_size;
- auto const direct_block_number_index = inode_block_index;
- auto const direct_block_number_offset =
- indirect_block_start_offset + direct_block_number_index * sizeof(uint32_t);
- kernel::devices::block_device_utils::read(m_device, &block_number_buffer, direct_block_number_offset,
- sizeof(uint32_t));
- return block_number_buffer;
+ auto const singly_indirect_block_number = data.block.at(SINGLY_INDIRECT_BLOCK_INDEX);
+ return read_block_number_at_index(singly_indirect_block_number, inode_block_index);
}
- inode_block_index -= number_of_singly_indirect_blocks;
+ inode_block_index -= block_numbers_per_singly_indirect_block;
- auto const number_of_doubly_indirect_blocks = numbers_per_block * numbers_per_block;
- if (inode_block_index < number_of_doubly_indirect_blocks)
+ if (inode_block_index < block_numbers_per_doubly_indirect_block)
{
- auto const doubly_indirect_block_start_offset = data.block.at(DOUBLY_INDIRECT_BLOCK_INDEX) * block_size;
- auto const indirect_block_number_index = inode_block_index / numbers_per_block;
- auto const indirect_block_number_offset =
- doubly_indirect_block_start_offset + indirect_block_number_index * sizeof(uint32_t);
- kernel::devices::block_device_utils::read(m_device, &block_number_buffer, indirect_block_number_offset,
- sizeof(uint32_t));
-
- auto const indirect_block_start_offset = block_number_buffer * block_size;
- auto const direct_block_number_index = inode_block_index % numbers_per_block;
- auto const direct_block_number_offset =
- indirect_block_start_offset + direct_block_number_index * sizeof(uint32_t);
- kernel::devices::block_device_utils::read(m_device, &block_number_buffer, direct_block_number_offset,
- sizeof(uint32_t));
- return block_number_buffer;
+ auto const doubly_indirect_block_number = data.block.at(DOUBLY_INDIRECT_BLOCK_INDEX);
+ auto const singly_indirect_block_index_in_doubly_indirect_block =
+ inode_block_index / block_numbers_per_singly_indirect_block;
+ auto const singly_indirect_block_number = read_block_number_at_index(
+ doubly_indirect_block_number, singly_indirect_block_index_in_doubly_indirect_block);
+
+ auto const block_index_in_singly_indirect_block = inode_block_index % block_numbers_per_singly_indirect_block;
+ return read_block_number_at_index(singly_indirect_block_number, block_index_in_singly_indirect_block);
}
- inode_block_index -= number_of_doubly_indirect_blocks;
+ inode_block_index -= block_numbers_per_doubly_indirect_block;
- auto const number_of_triply_indirect_blocks = numbers_per_block * numbers_per_block * numbers_per_block;
- if (inode_block_index < number_of_triply_indirect_blocks)
+ if (inode_block_index < block_numbers_per_triply_indirect_block)
{
- auto const triply_indirect_block_start_offset = data.block.at(TRIPLY_INDIRECT_BLOCK_INDEX) * block_size;
- auto const doubly_indirect_block_number_index = inode_block_index / (numbers_per_block * numbers_per_block);
- auto const doubly_indirect_block_number_offset =
- triply_indirect_block_start_offset + doubly_indirect_block_number_index * sizeof(uint32_t);
- kernel::devices::block_device_utils::read(m_device, &block_number_buffer, doubly_indirect_block_number_offset,
- sizeof(uint32_t));
-
- auto const doubly_indirect_block_start_offset = block_number_buffer * block_size;
- auto const indirect_block_number_index = (inode_block_index / numbers_per_block) % numbers_per_block;
- auto const indirect_block_number_offset =
- doubly_indirect_block_start_offset + indirect_block_number_index * sizeof(uint32_t);
- kernel::devices::block_device_utils::read(m_device, &block_number_buffer, indirect_block_number_offset,
- sizeof(uint32_t));
-
- auto const indirect_block_start_offset = block_number_buffer * block_size;
- auto const direct_block_number_index = inode_block_index % numbers_per_block;
- auto const direct_block_number_offset =
- indirect_block_start_offset + direct_block_number_index * sizeof(uint32_t);
- kernel::devices::block_device_utils::read(m_device, &block_number_buffer, direct_block_number_offset,
- sizeof(uint32_t));
- return block_number_buffer;
+ auto const triply_indirect_block_number = data.block.at(TRIPLY_INDIRECT_BLOCK_INDEX);
+ auto const doubly_indirect_block_index_in_triply_indirect_block =
+ inode_block_index / block_numbers_per_doubly_indirect_block;
+ auto const doubly_indirect_block_number = read_block_number_at_index(
+ triply_indirect_block_number, doubly_indirect_block_index_in_triply_indirect_block);
+
+ auto const remaining_block_numbers = inode_block_index % block_numbers_per_doubly_indirect_block;
+
+ auto const singly_indirect_block_index_in_doubly_indirect_block =
+ remaining_block_numbers / block_numbers_per_singly_indirect_block;
+ auto const singly_indirect_block_number = read_block_number_at_index(
+ doubly_indirect_block_number, singly_indirect_block_index_in_doubly_indirect_block);
+
+ auto const block_index_in_singly_indirect_block =
+ remaining_block_numbers % block_numbers_per_singly_indirect_block;
+ return read_block_number_at_index(singly_indirect_block_number, block_index_in_singly_indirect_block);
}
return 0; // TODO BA-FS26 really correct??
}
+ auto filesystem::read_block_number_at_index(uint32_t block_number, uint32_t index) -> uint32_t
+ {
+ uint32_t block_number_buffer = 0;
+
+ auto const block_start_offset = block_number * get_block_size();
+ auto const number_start_address = block_start_offset + index * sizeof(uint32_t);
+ kernel::devices::block_device_utils::read(m_device, &block_number_buffer, number_start_address, sizeof(uint32_t));
+
+ return block_number_buffer;
+ }
+
auto filesystem::get_block_size() -> size_t
{
return 1024U << m_superblock.log_block_size;