[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,22 +56,12 @@ glcr::ErrorOr<glcr::Vector<DirEntry>> Ext2Driver::ReadDirectory(
dbgln("Reading non directory.");
return glcr::INVALID_ARGUMENT;
}
// 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;
}
ASSIGN_OR_RETURN(mmth::OwnedMemoryRegion dir, ReadInode(inode));
glcr::Vector<DirEntry> directory;
for (uint64_t i = 0; i < real_block_cnt; i++) {
ASSIGN_OR_RETURN(mmth::OwnedMemoryRegion block,
ext2_reader_->ReadBlock(inode->block[i]));
uint64_t addr = block.vaddr();
while (addr < block.vaddr() + ext2_reader_->BlockSize()) {
uint64_t addr = dir.vaddr();
while (addr < dir.vaddr() + ext2_reader_->BlockSize()) {
DirEntry* entry = reinterpret_cast<DirEntry*>(addr);
directory.PushBack(*entry);
glcr::StringView name(entry->name, entry->name_len);
@ -89,7 +79,6 @@ glcr::ErrorOr<glcr::Vector<DirEntry>> Ext2Driver::ReadDirectory(
#endif
addr += entry->record_length;
}
}
return directory;
}
@ -101,7 +90,10 @@ glcr::ErrorOr<mmth::OwnedMemoryRegion> Ext2Driver::ReadFile(
dbgln("Reading non file.");
return glcr::INVALID_ARGUMENT;
}
return ReadInode(inode);
}
glcr::ErrorOr<mmth::OwnedMemoryRegion> Ext2Driver::ReadInode(Inode* inode) {
// This calculation is cursed.
uint64_t real_block_cnt =
(inode->blocks - 1) / (ext2_reader_->BlockSize() / 512) + 1;

View File

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