[Victoria Falls] Print only the root directory information.

Move the InodeTable creating to the Init function which (somewhat)
requires us to stop taking the Ext2BlockReader as a reference (the reference
from the Init function goes out of scope). Make the Ext2BlockReader Init
function return a shared ptr by default.
This commit is contained in:
Drew Galbraith 2023-08-01 10:39:26 -07:00
parent bed685af65
commit 083ed52ddd
7 changed files with 44 additions and 45 deletions

View file

@ -4,14 +4,21 @@
#include <mammoth/debug.h>
glcr::ErrorOr<Ext2Driver> Ext2Driver::Init(ScopedDenaliClient&& denali) {
ASSIGN_OR_RETURN(Ext2BlockReader reader,
ASSIGN_OR_RETURN(glcr::SharedPtr<Ext2BlockReader> reader,
Ext2BlockReader::Init(glcr::Move(denali)));
Superblock* superblock = reader.GetSuperblock();
return Ext2Driver(glcr::Move(reader));
ASSIGN_OR_RETURN(
MappedMemoryRegion bgdt,
reader->ReadBlocks(reader->BgdtBlockNum(), reader->BgdtBlockSize()));
BlockGroupDescriptor* bgds =
reinterpret_cast<BlockGroupDescriptor*>(bgdt.vaddr());
glcr::UniquePtr<InodeTable> inode_table(new InodeTable(reader, bgds));
return Ext2Driver(reader, glcr::Move(inode_table));
}
glcr::ErrorCode Ext2Driver::ProbePartition() {
Superblock* superblock = ext2_reader_.GetSuperblock();
Superblock* superblock = ext2_reader_->GetSuperblock();
if (superblock->magic != 0xEF53) {
dbgln("Invalid EXT2 magic code: %x");
return glcr::INVALID_ARGUMENT;
@ -30,28 +37,11 @@ glcr::ErrorCode Ext2Driver::ProbePartition() {
dbgln("Created by: %x", superblock->creator_os);
ASSIGN_OR_RETURN(MappedMemoryRegion bgdt,
ext2_reader_.ReadBlocks(ext2_reader_.BgdtBlockNum(),
ext2_reader_.BgdtBlockSize()));
BlockGroupDescriptor* bgds =
reinterpret_cast<BlockGroupDescriptor*>(bgdt.vaddr());
return glcr::OK;
}
uint64_t num_block_groups = ext2_reader_.NumberOfBlockGroups();
for (uint64_t i = 0; i < num_block_groups; i++) {
dbgln("BGD %x", i);
dbgln("Block Bitmap: %x", bgds[i].block_bitmap);
dbgln("Inode Bitmap: %x", bgds[i].inode_bitmap);
dbgln("Inode Table: %x", bgds[i].inode_table);
dbgln("Free blocks: %x", bgds[i].free_blocks_count);
dbgln("Free inodes: %x", bgds[i].free_inodes_count);
}
// FIXME: Move this to initialization.
inode_table_ =
glcr::UniquePtr<InodeTable>(new InodeTable(ext2_reader_, bgds));
ASSIGN_OR_RETURN(Inode * root, inode_table_->GetInode(2));
return ProbeDirectory(root);
glcr::ErrorOr<Inode*> Ext2Driver::GetInode(uint32_t inode_number) {
return inode_table_->GetInode(inode_number);
}
glcr::ErrorCode Ext2Driver::ProbeDirectory(Inode* inode) {
@ -62,7 +52,7 @@ glcr::ErrorCode Ext2Driver::ProbeDirectory(Inode* inode) {
// This calculation is cursed.
uint64_t real_block_cnt =
(inode->blocks - 1) / (ext2_reader_.BlockSize() / 512) + 1;
(inode->blocks - 1) / (ext2_reader_->BlockSize() / 512) + 1;
if (real_block_cnt > 12) {
dbgln("Cant handle indirect blocks yet");
@ -72,9 +62,9 @@ glcr::ErrorCode Ext2Driver::ProbeDirectory(Inode* inode) {
for (uint64_t i = 0; i < real_block_cnt; i++) {
dbgln("Getting block %lx", inode->block[i]);
ASSIGN_OR_RETURN(MappedMemoryRegion block,
ext2_reader_.ReadBlock(inode->block[i]));
ext2_reader_->ReadBlock(inode->block[i]));
uint64_t addr = block.vaddr();
while (addr < block.vaddr() + ext2_reader_.BlockSize()) {
while (addr < block.vaddr() + ext2_reader_->BlockSize()) {
DirEntry* entry = reinterpret_cast<DirEntry*>(addr);
glcr::String name(entry->name, entry->name_len);
switch (entry->file_type) {