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