aboutsummaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-04-02 15:03:06 +0200
committerLukas Oesch <lukasoesch20@gmail.com>2026-04-11 07:58:20 +0200
commitbaf63039d5430c0b3b1e6235b561c12f60e97f49 (patch)
tree3cf91955c4d1b9fdab8b729ce7944d3d7ed7e8f8 /kernel/src
parent91db623189133cb14693ae60ee54ac293cec3b54 (diff)
downloadteachos-baf63039d5430c0b3b1e6235b561c12f60e97f49.tar.xz
teachos-baf63039d5430c0b3b1e6235b561c12f60e97f49.zip
implement read_inode
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp35
1 files changed, 27 insertions, 8 deletions
diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp
index 96c1589..d650e97 100644
--- a/kernel/src/filesystem/ext2/filesystem.cpp
+++ b/kernel/src/filesystem/ext2/filesystem.cpp
@@ -21,7 +21,9 @@ namespace kernel::filesystem::ext2
namespace
{
constexpr size_t SUPERBLOCK_OFFSET = 1024;
- constexpr uint16_t EXT2_MAGIC = 0xEF53;
+ constexpr uint16_t MAGIC_NUMBER = 0xEF53;
+
+ constexpr uint32_t ROOT_INODE_NUMBER = 2;
// Mode bits
// constexpr uint16_t S_IFMT = 0xF000;
@@ -44,7 +46,7 @@ namespace kernel::filesystem::ext2
kernel::devices::block_device_utils::read(m_device, &m_superblock, SUPERBLOCK_OFFSET, sizeof(m_superblock));
- if (m_superblock.magic != EXT2_MAGIC)
+ if (m_superblock.magic != MAGIC_NUMBER)
{
return -1;
}
@@ -60,12 +62,7 @@ namespace kernel::filesystem::ext2
block_group_descriptor_table_offset,
num_block_groups * sizeof(block_group_descriptor));
- // TODO BA-FS26 load proper root inode from ext2 metadata
- // m_root_inode = inode{inode_kind::directory};
-
- // TODO BA-FS26 implement
- m_root_inode = kstd::make_shared<inode>();
- // devices::block_device_utils::read(device, nullptr, 0, 0); // TODO BA-FS26 just for testing
+ m_root_inode = read_inode(ROOT_INODE_NUMBER);
return 0;
}
@@ -82,6 +79,28 @@ namespace kernel::filesystem::ext2
return kstd::make_shared<inode>();
}
+ auto filesystem::read_inode(uint32_t inode_number) -> kstd::shared_ptr<inode>
+ {
+ auto const block_size = get_block_size();
+ 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 (block_group_index >= m_block_group_descriptors.size())
+ {
+ return nullptr;
+ }
+
+ 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 * get_inode_size();
+
+ auto new_inode = kstd::make_shared<inode>();
+ kernel::devices::block_device_utils::read(m_device, &new_inode->m_data, inode_offset, sizeof(inode_data));
+ return new_inode;
+ }
+
auto filesystem::get_block_size() -> size_t
{
return 1024U << m_superblock.log_block_size;