#include "kernel/filesystem/ext2/filesystem.hpp" #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 #include #include #include #include namespace kernel::filesystem::ext2 { namespace { constexpr size_t SUPERBLOCK_OFFSET = 1024; constexpr uint16_t EXT2_MAGIC = 0xEF53; // Mode bits // constexpr uint16_t S_IFMT = 0xF000; // constexpr uint16_t S_IFREG = 0x8000; // constexpr uint16_t S_IFDIR = 0x4000; // auto S_ISREG(uint16_t mode) -> bool // { // return (mode & S_IFMT) == S_IFREG; // } // auto S_ISDIR(uint16_t mode) -> bool // { // return (mode & S_IFMT) == S_IFDIR; // } } // namespace auto filesystem::mount(kstd::shared_ptr const & device) -> int { kernel::filesystem::filesystem::mount(device); kernel::devices::block_device_utils::read(m_device, &m_superblock, SUPERBLOCK_OFFSET, sizeof(m_superblock)); if (m_superblock.magic != EXT2_MAGIC) { 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(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}; // TODO BA-FS26 implement m_root_inode = kstd::make_shared(); // devices::block_device_utils::read(device, nullptr, 0, 0); // TODO BA-FS26 just for testing return 0; } auto filesystem::lookup(kstd::shared_ptr const & /*parent*/, std::string_view name) -> kstd::shared_ptr { // TODO BA-FS26 implement ext2 directory traversal and inode loading if (name == "dev") { // TODO BA-FS26 just for testing return nullptr; } return kstd::make_shared(); } auto filesystem::get_block_size() -> size_t { return 1024U << m_superblock.log_block_size; } auto filesystem::get_inode_size() -> size_t { return m_superblock.rev_level == 0 ? 128 : m_superblock.inode_size; } } // namespace kernel::filesystem::ext2