void ext2_disk_mount() { DC = malloc(sizeof(ext2_disk_cache_entry_t) * CACHEENTRIES); SB = malloc(BLOCKSIZE); ext2_disk_read_block(1, (uint8_t *)SB); assert(SB->magic == EXT2_SUPER_MAGIC); if (SB->inode_size == 0) { SB->inode_size = 128; } BGDS = SB->blocks_count / SB->blocks_per_group; ext2_disk_inodes_per_group = SB->inodes_count / BGDS; // load the block group descriptors BGD = malloc(BLOCKSIZE); ext2_disk_read_block(2, (uint8_t *)BGD); #if EXT2_DEBUG_BLOCK_DESCRIPTORS char bg_buffer[BLOCKSIZE]; for (uint32_t i = 0; i < BGDS; ++i) { kprintf("Block Group Descriptor #%d @ %d\n", i, 2 + i * SB->blocks_per_group); kprintf("\tBlock Bitmap @ %d\n", BGD[i].block_bitmap); { kprintf("\t\tExamining block bitmap at %d\n", BGD[i].block_bitmap); ext2_disk_read_block(BGD[i].block_bitmap, (uint8_t *)bg_buffer); uint32_t j = 0; while (BLOCKBIT(j)) { ++j; } kprintf("\t\tFirst free block in group is %d\n", j + BGD[i].block_bitmap - 2); } kprintf("\tInode Bitmap @ %d\n", BGD[i].inode_bitmap); { kprintf("\t\tExamining inode bitmap at %d\n", BGD[i].inode_bitmap); ext2_disk_read_block(BGD[i].inode_bitmap, (uint8_t *)bg_buffer); uint32_t j = 0; while (BLOCKBIT(j)) { ++j; } kprintf("\t\tFirst free inode in group is %d\n", j + ext2_disk_inodes_per_group * i + 1); } kprintf("\tInode Table @ %d\n", BGD[i].inode_table); kprintf("\tFree Blocks = %d\n", BGD[i].free_blocks_count); kprintf("\tFree Inodes = %d\n", BGD[i].free_inodes_count); } #endif ext2_inodetable_t *root_inode = ext2_disk_inode(2); RN = (fs_node_t *)malloc(sizeof(fs_node_t)); assert(ext2_disk_node_root(root_inode, RN)); fs_root = RN; LOG(INFO,"Mounted EXT2 disk, root VFS node is at 0x%x", RN); }
void ext2_disk_mount(uint32_t offset_sector, uint32_t max_sector) { debug_print(NOTICE, "Mounting EXT2 partition between sectors [%d:%d].", offset_sector, max_sector); ext2_offset = offset_sector; BLOCKSIZE = 1024; SB = malloc(BLOCKSIZE); ext2_disk_read_block(1, (uint8_t *)SB); assert(SB->magic == EXT2_SUPER_MAGIC); if (SB->inode_size == 0) { SB->inode_size = 128; } BLOCKSIZE = 1024 << SB->log_block_size; if (BLOCKSIZE > 2048) { CACHEENTRIES /= 4; } PTRS_PER_BLOCK = BLOCKSIZE / 4; debug_print(NOTICE, "Log block size = %d -> %d", SB->log_block_size, BLOCKSIZE); BGDS = SB->blocks_count / SB->blocks_per_group; if (SB->blocks_per_group * BGDS < SB->blocks_count) { BGDS += 1; } ext2_disk_inodes_per_group = SB->inodes_count / BGDS; debug_print(NOTICE, "Allocating cache..."); DC = malloc(sizeof(ext2_disk_cache_entry_t) * CACHEENTRIES); for (uint32_t i = 0; i < CACHEENTRIES; ++i) { DC[i].block = malloc(BLOCKSIZE); if (i % 128 == 0) { debug_print(INFO, "Allocated cache block #%d", i+1); } } debug_print(NOTICE, "Allocated cache."); // load the block group descriptors int bgd_block_span = sizeof(ext2_bgdescriptor_t) * BGDS / BLOCKSIZE + 1; BGD = malloc(BLOCKSIZE * bgd_block_span); debug_print(INFO, "bgd_block_span = %d", bgd_block_span); int bgd_offset = 2; if (BLOCKSIZE > 1024) { bgd_offset = 1; } for (int i = 0; i < bgd_block_span; ++i) { ext2_disk_read_block(bgd_offset + i, (uint8_t *)((uint32_t)BGD + BLOCKSIZE * i)); } #if EXT2_DEBUG_BLOCK_DESCRIPTORS char * bg_buffer = malloc(BLOCKSIZE * sizeof(char)); for (uint32_t i = 0; i < BGDS; ++i) { debug_print(INFO, "Block Group Descriptor #%d @ %d", i, bgd_offset + i * SB->blocks_per_group); debug_print(INFO, "\tBlock Bitmap @ %d", BGD[i].block_bitmap); { debug_print(INFO, "\t\tExamining block bitmap at %d", BGD[i].block_bitmap); ext2_disk_read_block(BGD[i].block_bitmap, (uint8_t *)bg_buffer); uint32_t j = 0; while (BLOCKBIT(j)) { ++j; } debug_print(INFO, "\t\tFirst free block in group is %d", j + BGD[i].block_bitmap - 2); } debug_print(INFO, "\tInode Bitmap @ %d", BGD[i].inode_bitmap); { debug_print(INFO, "\t\tExamining inode bitmap at %d", BGD[i].inode_bitmap); ext2_disk_read_block(BGD[i].inode_bitmap, (uint8_t *)bg_buffer); uint32_t j = 0; while (BLOCKBIT(j)) { ++j; } debug_print(INFO, "\t\tFirst free inode in group is %d", j + ext2_disk_inodes_per_group * i + 1); } debug_print(INFO, "\tInode Table @ %d", BGD[i].inode_table); debug_print(INFO, "\tFree Blocks = %d", BGD[i].free_blocks_count); debug_print(INFO, "\tFree Inodes = %d", BGD[i].free_inodes_count); } free(bg_buffer); #endif ext2_inodetable_t *root_inode = ext2_disk_inode(2); RN = (fs_node_t *)malloc(sizeof(fs_node_t)); if (!ext2_disk_node_root(root_inode, RN)) { debug_print(NOTICE, "Oh dear..."); } debug_print(NOTICE, "Root file system is ready."); fs_root = RN; debug_print(NOTICE, "Mounted EXT2 disk, root VFS node is at 0x%x", RN); }