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 <stdio.h>
     13 #if HAVE_UNISTD_H
     14 #include <unistd.h>
     15 #endif
     16 
     17 #include "ext2_fs.h"
     18 #include "ext2fsP.h"
     19 
     20 static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache);
     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 
     46 	if (fs->badblocks)
     47 		ext2fs_badblocks_list_free(fs->badblocks);
     48 	fs->badblocks = 0;
     49 
     50 	if (fs->dblist)
     51 		ext2fs_free_dblist(fs->dblist);
     52 
     53 	if (fs->icache)
     54 		ext2fs_free_inode_cache(fs->icache);
     55 
     56 	fs->magic = 0;
     57 
     58 	ext2fs_free_mem(&fs);
     59 }
     60 
     61 /*
     62  * Free the inode cache structure
     63  */
     64 static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache)
     65 {
     66 	if (--icache->refcount)
     67 		return;
     68 	if (icache->buffer)
     69 		ext2fs_free_mem(&icache->buffer);
     70 	if (icache->cache)
     71 		ext2fs_free_mem(&icache->cache);
     72 	icache->buffer_blk = 0;
     73 	ext2fs_free_mem(&icache);
     74 }
     75 
     76 /*
     77  * This procedure frees a badblocks list.
     78  */
     79 void ext2fs_u32_list_free(ext2_u32_list bb)
     80 {
     81 	if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST)
     82 		return;
     83 
     84 	if (bb->list)
     85 		ext2fs_free_mem(&bb->list);
     86 	bb->list = 0;
     87 	ext2fs_free_mem(&bb);
     88 }
     89 
     90 void ext2fs_badblocks_list_free(ext2_badblocks_list bb)
     91 {
     92 	ext2fs_u32_list_free((ext2_u32_list) bb);
     93 }
     94 
     95 
     96 /*
     97  * Free a directory block list
     98  */
     99 void ext2fs_free_dblist(ext2_dblist dblist)
    100 {
    101 	if (!dblist || (dblist->magic != EXT2_ET_MAGIC_DBLIST))
    102 		return;
    103 
    104 	if (dblist->list)
    105 		ext2fs_free_mem(&dblist->list);
    106 	dblist->list = 0;
    107 	if (dblist->fs && dblist->fs->dblist == dblist)
    108 		dblist->fs->dblist = 0;
    109 	dblist->magic = 0;
    110 	ext2fs_free_mem(&dblist);
    111 }
    112 
    113