aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/include/kernel/filesystem/ext2/filesystem.hpp4
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp42
2 files changed, 28 insertions, 18 deletions
diff --git a/kernel/include/kernel/filesystem/ext2/filesystem.hpp b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
index 32d9baf..46be32f 100644
--- a/kernel/include/kernel/filesystem/ext2/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
@@ -101,7 +101,11 @@ namespace kernel::filesystem::ext2
[[nodiscard]] auto get_inode_size() const -> size_t;
[[nodiscard]] auto get_inode_block_count(inode_data const & data) const -> uint32_t;
+
[[nodiscard]] auto block_numbers_per_block() const -> uint32_t;
+ [[nodiscard]] auto block_numbers_per_singly_indirect_block() const -> uint32_t;
+ [[nodiscard]] auto block_numbers_per_doubly_indirect_block() const -> uint32_t;
+ [[nodiscard]] auto block_numbers_per_triply_indirect_block() const -> uint32_t;
superblock m_superblock{};
kstd::vector<block_group_descriptor> m_block_group_descriptors;
diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp
index 0f34cfe..893cc38 100644
--- a/kernel/src/filesystem/ext2/filesystem.cpp
+++ b/kernel/src/filesystem/ext2/filesystem.cpp
@@ -122,26 +122,21 @@ namespace kernel::filesystem::ext2
}
inode_block_index -= constants::direct_block_count;
- auto const numbers_per_block = block_numbers_per_block();
- 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)
+ if (inode_block_index < block_numbers_per_singly_indirect_block())
{
auto const singly_indirect_block_number = data.block.at(constants::singly_indirect_block_index);
return read_singly_indirect_block_number(singly_indirect_block_number, inode_block_index);
}
- inode_block_index -= block_numbers_per_singly_indirect_block;
+ inode_block_index -= block_numbers_per_singly_indirect_block();
- if (inode_block_index < block_numbers_per_doubly_indirect_block)
+ if (inode_block_index < block_numbers_per_doubly_indirect_block())
{
auto const doubly_indirect_block_number = data.block.at(constants::doubly_indirect_block_index);
return read_doubly_indirect_block_number(doubly_indirect_block_number, inode_block_index);
}
- inode_block_index -= block_numbers_per_doubly_indirect_block;
+ inode_block_index -= block_numbers_per_doubly_indirect_block();
- if (inode_block_index < block_numbers_per_triply_indirect_block)
+ if (inode_block_index < block_numbers_per_triply_indirect_block())
{
auto const triply_indirect_block_number = data.block.at(constants::triply_indirect_block_index);
return read_triply_indirect_block_number(triply_indirect_block_number, inode_block_index);
@@ -163,17 +158,15 @@ namespace kernel::filesystem::ext2
auto filesystem::read_doubly_indirect_block_number(uint32_t doubly_indirect_block_number,
uint32_t block_index_in_doubly_indirect_block) const -> uint32_t
{
- auto const block_numbers_per_singly_indirect_block = block_numbers_per_block();
-
if (doubly_indirect_block_number == 0)
{
return 0;
}
auto const singly_indirect_block_index_in_doubly_indirect_block =
- block_index_in_doubly_indirect_block / block_numbers_per_singly_indirect_block;
+ block_index_in_doubly_indirect_block / block_numbers_per_singly_indirect_block();
auto const block_index_in_singly_indirect_block =
- block_index_in_doubly_indirect_block % block_numbers_per_singly_indirect_block;
+ block_index_in_doubly_indirect_block % 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);
@@ -184,17 +177,15 @@ namespace kernel::filesystem::ext2
auto filesystem::read_triply_indirect_block_number(uint32_t triply_indirect_block_number,
uint32_t block_index_in_triply_indirect_block) const -> uint32_t
{
- auto const block_numbers_per_doubly_indirect_block = block_numbers_per_block() * block_numbers_per_block();
-
if (triply_indirect_block_number == 0)
{
return 0;
}
auto const doubly_indirect_block_index_in_triply_indirect_block =
- block_index_in_triply_indirect_block / block_numbers_per_doubly_indirect_block;
+ block_index_in_triply_indirect_block / block_numbers_per_doubly_indirect_block();
auto const block_index_in_doubly_indirect_block =
- block_index_in_triply_indirect_block % block_numbers_per_doubly_indirect_block;
+ block_index_in_triply_indirect_block % 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);
@@ -218,6 +209,21 @@ namespace kernel::filesystem::ext2
return get_block_size() / sizeof(uint32_t);
}
+ auto filesystem::block_numbers_per_singly_indirect_block() const -> uint32_t
+ {
+ return block_numbers_per_block();
+ }
+
+ auto filesystem::block_numbers_per_doubly_indirect_block() const -> uint32_t
+ {
+ return block_numbers_per_singly_indirect_block() * block_numbers_per_block();
+ }
+
+ auto filesystem::block_numbers_per_triply_indirect_block() const -> uint32_t
+ {
+ return block_numbers_per_doubly_indirect_block() * block_numbers_per_block();
+ }
+
auto filesystem::get_block_size() const -> size_t
{
return constants::base_block_size << m_superblock.log_block_size;