void ext2fs_free(ext2_filsys fs) { if (!fs || (fs->magic != EXT2_ET_MAGIC_EXT2FS_FILSYS)) return; if (fs->image_io != fs->io) { if (fs->image_io) io_channel_close(fs->image_io); } if (fs->io) { io_channel_close(fs->io); } ext2fs_free_mem(&fs->device_name); ext2fs_free_mem(&fs->super); ext2fs_free_mem(&fs->orig_super); ext2fs_free_mem(&fs->group_desc); ext2fs_free_block_bitmap(fs->block_map); ext2fs_free_inode_bitmap(fs->inode_map); ext2fs_badblocks_list_free(fs->badblocks); fs->badblocks = 0; ext2fs_free_dblist(fs->dblist); if (fs->icache) ext2fs_free_inode_cache(fs->icache); fs->magic = 0; ext2fs_free_mem(&fs); }
errcode_t ext2fs_create_inode_cache(ext2_filsys fs, unsigned int cache_size) { unsigned i; errcode_t retval; if (fs->icache) return 0; retval = ext2fs_get_mem(sizeof(struct ext2_inode_cache), &fs->icache); if (retval) return retval; memset(fs->icache, 0, sizeof(struct ext2_inode_cache)); retval = ext2fs_get_mem(fs->blocksize, &fs->icache->buffer); if (retval) goto errout; fs->icache->buffer_blk = 0; fs->icache->cache_last = -1; fs->icache->cache_size = cache_size; fs->icache->refcount = 1; retval = ext2fs_get_array(fs->icache->cache_size, sizeof(struct ext2_inode_cache_ent), &fs->icache->cache); if (retval) goto errout; for (i = 0; i < fs->icache->cache_size; i++) { retval = ext2fs_get_mem(EXT2_INODE_SIZE(fs->super), &fs->icache->cache[i].inode); if (retval) goto errout; } ext2fs_flush_icache(fs); return 0; errout: ext2fs_free_inode_cache(fs->icache); fs->icache = 0; return retval; }