#include #include #include #include "ext2fs.h" /* Read a block of data */ void ext2fs_read_block(SuperBlock *super, uint32_t index, char *buf) { struct Ext2Super *rsuper = super->data; super->back->pos = index * (1024 << rsuper->blockSize); file_read(super->back, buf, 1024 << rsuper->blockSize); } /* Get the data block address from inode block index */ uint32_t ext2fs_get_data_addr(SuperBlock *super, struct Ext2Inode *inode, uint32_t index) { uint32_t tmp; char block[PAGE_SIZE]; struct Ext2Super *rsuper = super->data; /* Blocks per indirect block */ uint32_t bpib = (1024 << rsuper->blockSize) / sizeof(uint32_t); /* Direct blocks */ if (index < 12) return inode->directBlock[index]; index -= 12; /* Single indirect block */ if (index < bpib) { ext2fs_read_block(super, inode->singleBlock, block); return *((uint32_t *) block + index); } index -= bpib; /* Double indirect block */ if (index < bpib*bpib) { panic("Attempted to read from double indirect block"); } index -= bpib*bpib; /* Triple indirect block */ if (index < bpib*bpib*bpib) { panic("Attempted to read from triple indirect block"); } return 0; }