[VictoriaFallS] Refactor Ext2Driver to share inode reading code.

This commit is contained in:
Drew Galbraith 2024-01-11 18:29:05 -08:00
parent 5eb72da9c8
commit d74918409c
2 changed files with 23 additions and 29 deletions

View File

@ -56,39 +56,28 @@ glcr::ErrorOr<glcr::Vector<DirEntry>> Ext2Driver::ReadDirectory(
dbgln("Reading non directory."); dbgln("Reading non directory.");
return glcr::INVALID_ARGUMENT; return glcr::INVALID_ARGUMENT;
} }
ASSIGN_OR_RETURN(mmth::OwnedMemoryRegion dir, ReadInode(inode));
// This calculation is cursed.
uint64_t real_block_cnt =
(inode->blocks - 1) / (ext2_reader_->BlockSize() / 512) + 1;
if (real_block_cnt > 12) {
dbgln("Cant handle indirect blocks yet");
return glcr::FAILED_PRECONDITION;
}
glcr::Vector<DirEntry> directory; glcr::Vector<DirEntry> directory;
for (uint64_t i = 0; i < real_block_cnt; i++) {
ASSIGN_OR_RETURN(mmth::OwnedMemoryRegion block, uint64_t addr = dir.vaddr();
ext2_reader_->ReadBlock(inode->block[i])); while (addr < dir.vaddr() + ext2_reader_->BlockSize()) {
uint64_t addr = block.vaddr(); DirEntry* entry = reinterpret_cast<DirEntry*>(addr);
while (addr < block.vaddr() + ext2_reader_->BlockSize()) { directory.PushBack(*entry);
DirEntry* entry = reinterpret_cast<DirEntry*>(addr); glcr::StringView name(entry->name, entry->name_len);
directory.PushBack(*entry);
glcr::StringView name(entry->name, entry->name_len);
#if EXT2_DEBUG #if EXT2_DEBUG
switch (entry->file_type) { switch (entry->file_type) {
case kExt2FtFile: case kExt2FtFile:
dbgln("FILE (0x{x}): {}", entry->inode, name); dbgln("FILE (0x{x}): {}", entry->inode, name);
break; break;
case kExt2FtDirectory: case kExt2FtDirectory:
dbgln("DIR (0x{x}): {}", entry->inode, name); dbgln("DIR (0x{x}): {}", entry->inode, name);
break; break;
default: default:
dbgln("UNK (0x{x}): {}", entry->inode, name); dbgln("UNK (0x{x}): {}", entry->inode, name);
}
#endif
addr += entry->record_length;
} }
#endif
addr += entry->record_length;
} }
return directory; return directory;
} }
@ -101,7 +90,10 @@ glcr::ErrorOr<mmth::OwnedMemoryRegion> Ext2Driver::ReadFile(
dbgln("Reading non file."); dbgln("Reading non file.");
return glcr::INVALID_ARGUMENT; return glcr::INVALID_ARGUMENT;
} }
return ReadInode(inode);
}
glcr::ErrorOr<mmth::OwnedMemoryRegion> Ext2Driver::ReadInode(Inode* inode) {
// This calculation is cursed. // This calculation is cursed.
uint64_t real_block_cnt = uint64_t real_block_cnt =
(inode->blocks - 1) / (ext2_reader_->BlockSize() / 512) + 1; (inode->blocks - 1) / (ext2_reader_->BlockSize() / 512) + 1;

View File

@ -28,4 +28,6 @@ class Ext2Driver {
Ext2Driver(const glcr::SharedPtr<Ext2BlockReader>& reader, Ext2Driver(const glcr::SharedPtr<Ext2BlockReader>& reader,
glcr::UniquePtr<InodeTable> inode_table) glcr::UniquePtr<InodeTable> inode_table)
: ext2_reader_(reader), inode_table_(glcr::Move(inode_table)) {} : ext2_reader_(reader), inode_table_(glcr::Move(inode_table)) {}
glcr::ErrorOr<mmth::OwnedMemoryRegion> ReadInode(Inode* inode);
}; };