2 * freefs.c --- free an ext2 filesystem
4 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Public
17 #include <linux/ext2_fs.h>
21 static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache);
23 void ext2fs_free(ext2_filsys fs)
25 if (!fs || (fs->magic != EXT2_ET_MAGIC_EXT2FS_FILSYS))
28 io_channel_close(fs->io);
31 ext2fs_free_mem((void **) &fs->device_name);
33 ext2fs_free_mem((void **) &fs->super);
35 ext2fs_free_mem((void **) &fs->group_desc);
37 ext2fs_free_block_bitmap(fs->block_map);
39 ext2fs_free_inode_bitmap(fs->inode_map);
42 badblocks_list_free(fs->badblocks);
46 ext2fs_free_dblist(fs->dblist);
49 ext2fs_free_inode_cache(fs->icache);
53 ext2fs_free_mem((void **) &fs);
56 void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap)
58 if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_GENERIC_BITMAP))
62 if (bitmap->description) {
63 ext2fs_free_mem((void **) &bitmap->description);
64 bitmap->description = 0;
67 ext2fs_free_mem((void **) &bitmap->bitmap);
70 ext2fs_free_mem((void **) &bitmap);
73 void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap)
75 if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_INODE_BITMAP))
78 bitmap->magic = EXT2_ET_MAGIC_GENERIC_BITMAP;
79 ext2fs_free_generic_bitmap(bitmap);
82 void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap)
84 if (!bitmap || (bitmap->magic != EXT2_ET_MAGIC_BLOCK_BITMAP))
87 bitmap->magic = EXT2_ET_MAGIC_GENERIC_BITMAP;
88 ext2fs_free_generic_bitmap(bitmap);
92 * Free the inode cache structure
94 static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache)
96 if (--icache->refcount)
99 ext2fs_free_mem((void **) &icache->buffer);
101 ext2fs_free_mem((void **) &icache->cache);
102 icache->buffer_blk = 0;
103 ext2fs_free_mem((void **) &icache);
107 * This procedure frees a badblocks list.
109 void ext2fs_badblocks_list_free(ext2_badblocks_list bb)
111 if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST)
115 ext2fs_free_mem((void **) &bb->list);
117 ext2fs_free_mem((void **) &bb);
121 * Free a directory block list
123 void ext2fs_free_dblist(ext2_dblist dblist)
125 if (!dblist || (dblist->magic != EXT2_ET_MAGIC_DBLIST))
129 ext2fs_free_mem((void **) &dblist->list);
131 if (dblist->fs && dblist->fs->dblist == dblist)
132 dblist->fs->dblist = 0;
134 ext2fs_free_mem((void **) &dblist);