aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/kernel/filesystem/ext2/filesystem.hpp3
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp13
2 files changed, 16 insertions, 0 deletions
diff --git a/kernel/include/kernel/filesystem/ext2/filesystem.hpp b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
index f6cd17f..59b9cba 100644
--- a/kernel/include/kernel/filesystem/ext2/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
@@ -3,11 +3,13 @@
#include "kapi/devices/device.hpp"
+#include "kernel/filesystem/ext2/block_group_descriptor.hpp"
#include "kernel/filesystem/ext2/superblock.hpp"
#include "kernel/filesystem/filesystem.hpp"
#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
+#include <kstd/vector>
#include <cstddef>
#include <string_view>
@@ -25,6 +27,7 @@ namespace kernel::filesystem::ext2
auto get_inode_size() -> size_t;
superblock m_superblock;
+ kstd::vector<block_group_descriptor> m_block_group_descriptors;
};
} // namespace kernel::filesystem::ext2
diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp
index 0ebb243..96c1589 100644
--- a/kernel/src/filesystem/ext2/filesystem.cpp
+++ b/kernel/src/filesystem/ext2/filesystem.cpp
@@ -3,12 +3,14 @@
#include "kapi/devices/device.hpp"
#include "kernel/devices/block_device_utils.hpp"
+#include "kernel/filesystem/ext2/block_group_descriptor.hpp"
#include "kernel/filesystem/ext2/inode.hpp"
#include "kernel/filesystem/ext2/superblock.hpp"
#include "kernel/filesystem/filesystem.hpp"
#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
+#include <kstd/vector>
#include <cstddef>
#include <cstdint>
@@ -47,6 +49,17 @@ namespace kernel::filesystem::ext2
return -1;
}
+ auto const block_size = get_block_size();
+ auto const blocks_per_group = m_superblock.blocks_per_group;
+ auto const num_block_groups = (m_superblock.blocks_count + blocks_per_group - 1) / blocks_per_group;
+
+ m_block_group_descriptors = kstd::vector<block_group_descriptor>(num_block_groups);
+
+ auto const block_group_descriptor_table_offset = block_size == 1024 ? 2 * block_size : block_size;
+ kernel::devices::block_device_utils::read(m_device, m_block_group_descriptors.data(),
+ 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};