freefs.c revision d1154eb460efe588eaed3d439c1caaca149fa362
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * freefs.c --- free an ext2 filesystem
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * %Begin-Header%
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file may be redistributed under the terms of the GNU Library
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * General Public License, version 2.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * %End-Header%
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if HAVE_UNISTD_H
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ext2_fs.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ext2fsP.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_free(ext2_filsys fs)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!fs || (fs->magic != EXT2_ET_MAGIC_EXT2FS_FILSYS))
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->image_io != fs->io) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (fs->image_io)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			io_channel_close(fs->image_io);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->io) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		io_channel_close(fs->io);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->device_name)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_mem(&fs->device_name);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->super)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_mem(&fs->super);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->orig_super)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_mem(&fs->orig_super);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->group_desc)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_mem(&fs->group_desc);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->block_map)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_block_bitmap(fs->block_map);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->inode_map)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_inode_bitmap(fs->inode_map);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->badblocks)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_badblocks_list_free(fs->badblocks);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fs->badblocks = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->dblist)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_dblist(fs->dblist);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (fs->icache)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_inode_cache(fs->icache);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fs->magic = 0;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ext2fs_free_mem(&fs);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the inode cache structure
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (--icache->refcount)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (icache->buffer)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_mem(&icache->buffer);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (icache->cache)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_mem(&icache->cache);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	icache->buffer_blk = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ext2fs_free_mem(&icache);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This procedure frees a badblocks list.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_u32_list_free(ext2_u32_list bb)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (bb->list)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_mem(&bb->list);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	bb->list = 0;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ext2fs_free_mem(&bb);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_badblocks_list_free(ext2_badblocks_list bb)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ext2fs_u32_list_free((ext2_u32_list) bb);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a directory block list
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_free_dblist(ext2_dblist dblist)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!dblist || (dblist->magic != EXT2_ET_MAGIC_DBLIST))
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dblist->list)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_free_mem(&dblist->list);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dblist->list = 0;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dblist->fs && dblist->fs->dblist == dblist)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		dblist->fs->dblist = 0;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dblist->magic = 0;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ext2fs_free_mem(&dblist);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)