1 /* 2 * freefs.c --- free an ext2 filesystem 3 * 4 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. 5 * 6 * %Begin-Header% 7 * This file may be redistributed under the terms of the GNU Library 8 * General Public License, version 2. 9 * %End-Header% 10 */ 11 12 #include "config.h" 13 #include <stdio.h> 14 #if HAVE_UNISTD_H 15 #include <unistd.h> 16 #endif 17 18 #include "ext2_fs.h" 19 #include "ext2fsP.h" 20 #include "hashmap.h" 21 ext2fs_free(ext2_filsys fs)22void ext2fs_free(ext2_filsys fs) 23 { 24 if (!fs || (fs->magic != EXT2_ET_MAGIC_EXT2FS_FILSYS)) 25 return; 26 if (fs->image_io != fs->io) { 27 if (fs->image_io) 28 io_channel_close(fs->image_io); 29 } 30 if (fs->io) { 31 io_channel_close(fs->io); 32 } 33 if (fs->device_name) 34 ext2fs_free_mem(&fs->device_name); 35 if (fs->super) 36 ext2fs_free_mem(&fs->super); 37 if (fs->orig_super) 38 ext2fs_free_mem(&fs->orig_super); 39 if (fs->group_desc) 40 ext2fs_free_mem(&fs->group_desc); 41 if (fs->block_map) 42 ext2fs_free_block_bitmap(fs->block_map); 43 if (fs->inode_map) 44 ext2fs_free_inode_bitmap(fs->inode_map); 45 if (fs->image_header) 46 ext2fs_free_mem(&fs->image_header); 47 48 if (fs->badblocks) 49 ext2fs_badblocks_list_free(fs->badblocks); 50 fs->badblocks = 0; 51 52 if (fs->dblist) 53 ext2fs_free_dblist(fs->dblist); 54 55 if (fs->icache) 56 ext2fs_free_inode_cache(fs->icache); 57 58 if (fs->mmp_buf) 59 ext2fs_free_mem(&fs->mmp_buf); 60 if (fs->mmp_cmp) 61 ext2fs_free_mem(&fs->mmp_cmp); 62 63 if (fs->block_sha_map) 64 ext2fs_hashmap_free(fs->block_sha_map); 65 66 fs->magic = 0; 67 68 ext2fs_zero_blocks2(NULL, 0, 0, NULL, NULL); 69 ext2fs_free_mem(&fs); 70 } 71 72 /* 73 * This procedure frees a badblocks list. 74 */ ext2fs_u32_list_free(ext2_u32_list bb)75void ext2fs_u32_list_free(ext2_u32_list bb) 76 { 77 if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST) 78 return; 79 80 if (bb->list) 81 ext2fs_free_mem(&bb->list); 82 bb->list = 0; 83 ext2fs_free_mem(&bb); 84 } 85 ext2fs_badblocks_list_free(ext2_badblocks_list bb)86void ext2fs_badblocks_list_free(ext2_badblocks_list bb) 87 { 88 ext2fs_u32_list_free((ext2_u32_list) bb); 89 } 90 91 92 /* 93 * Free a directory block list 94 */ ext2fs_free_dblist(ext2_dblist dblist)95void ext2fs_free_dblist(ext2_dblist dblist) 96 { 97 if (!dblist || (dblist->magic != EXT2_ET_MAGIC_DBLIST)) 98 return; 99 100 if (dblist->list) 101 ext2fs_free_mem(&dblist->list); 102 dblist->list = 0; 103 if (dblist->fs && dblist->fs->dblist == dblist) 104 dblist->fs->dblist = 0; 105 dblist->magic = 0; 106 ext2fs_free_mem(&dblist); 107 } 108 109