freefs.c revision d1154eb460efe588eaed3d439c1caaca149fa362
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * freefs.c --- free an ext2 filesystem 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * %Begin-Header% 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file may be redistributed under the terms of the GNU Library 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * General Public License, version 2. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * %End-Header% 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if HAVE_UNISTD_H 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ext2_fs.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ext2fsP.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_free(ext2_filsys fs) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!fs || (fs->magic != EXT2_ET_MAGIC_EXT2FS_FILSYS)) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->image_io != fs->io) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->image_io) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_channel_close(fs->image_io); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->io) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_channel_close(fs->io); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->device_name) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&fs->device_name); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->super) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&fs->super); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->orig_super) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&fs->orig_super); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->group_desc) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&fs->group_desc); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->block_map) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_block_bitmap(fs->block_map); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->inode_map) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_inode_bitmap(fs->inode_map); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->badblocks) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_badblocks_list_free(fs->badblocks); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fs->badblocks = 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->dblist) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_dblist(fs->dblist); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fs->icache) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_inode_cache(fs->icache); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fs->magic = 0; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&fs); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the inode cache structure 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (--icache->refcount) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icache->buffer) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&icache->buffer); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icache->cache) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&icache->cache); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icache->buffer_blk = 0; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&icache); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This procedure frees a badblocks list. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_u32_list_free(ext2_u32_list bb) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bb->list) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&bb->list); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb->list = 0; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&bb); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_badblocks_list_free(ext2_badblocks_list bb) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_u32_list_free((ext2_u32_list) bb); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a directory block list 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_free_dblist(ext2_dblist dblist) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dblist || (dblist->magic != EXT2_ET_MAGIC_DBLIST)) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dblist->list) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&dblist->list); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dblist->list = 0; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dblist->fs && dblist->fs->dblist == dblist) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dblist->fs->dblist = 0; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dblist->magic = 0; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem(&dblist); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)