From 4fd17a59ea7a700d206f9d067c7e6fc3dccd2e70 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Wed, 22 Nov 2023 16:41:12 -0800 Subject: [PATCH] [Victoriafalls] Update ext2 driver to read doubly-indirect blocks. --- sys/victoriafalls/fs/ext2/ext2_driver.cpp | 30 ++++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/sys/victoriafalls/fs/ext2/ext2_driver.cpp b/sys/victoriafalls/fs/ext2/ext2_driver.cpp index eb18e40..afab0c3 100644 --- a/sys/victoriafalls/fs/ext2/ext2_driver.cpp +++ b/sys/victoriafalls/fs/ext2/ext2_driver.cpp @@ -104,9 +104,10 @@ glcr::ErrorOr Ext2Driver::ReadFile( return glcr::UNIMPLEMENTED; } + mmth::OwnedMemoryRegion double_indirect_block; if (inode->block[13]) { - dbgln("Can't handle doubly-indirect blocks yet."); - return glcr::UNIMPLEMENTED; + ASSIGN_OR_RETURN(double_indirect_block, + ext2_reader_->ReadBlock(inode->block[13])); } mmth::OwnedMemoryRegion indirect_block; @@ -119,10 +120,31 @@ glcr::ErrorOr Ext2Driver::ReadFile( blocks_to_read.PushBack(inode->block[i]); } + uint32_t* indr_block_array = + reinterpret_cast(indirect_block.vaddr()); for (uint64_t i = 12; i < 268 && i < real_block_cnt; i++) { - uint32_t* block_array = reinterpret_cast(indirect_block.vaddr()); uint64_t offset = i - 12; - blocks_to_read.PushBack(block_array[offset]); + blocks_to_read.PushBack(indr_block_array[offset]); + } + + uint32_t* dbl_indr_block_array = + reinterpret_cast(double_indirect_block.vaddr()); + for (uint64_t i = 0; i < 256; i++) { + uint64_t block = 268 + (256 * i); + if (block >= real_block_cnt) { + break; + } + ASSIGN_OR_RETURN(mmth::OwnedMemoryRegion single_indr_block, + ext2_reader_->ReadBlock(dbl_indr_block_array[i])); + uint32_t* single_indr_block_array = + reinterpret_cast(single_indr_block.vaddr()); + for (uint64_t j = 0; j < 256; j++) { + uint64_t block_inner = block + j; + if (block_inner >= real_block_cnt) { + break; + } + blocks_to_read.PushBack(single_indr_block_array[j]); + } } return ext2_reader_->ReadBlocks(blocks_to_read);