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