Home | History | Annotate | Download | only in ext2fs
      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 
     22 void 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  */
     75 void 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 
     86 void 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  */
     95 void 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