alloc_stats.c revision d4f34d41be97e23db07d5ed606fcc1a26f5a3c76
18bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o/*
28bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o * alloc_stats.c --- Update allocation statistics for ext2fs
38bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o *
48bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o * Copyright (C) 2001 Theodore Ts'o.
58bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o *
68bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o * %Begin-Header%
78bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o * This file may be redistributed under the terms of the GNU Public
88bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o * License.
98bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o * %End-Header%
108bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o *
118bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o */
128bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o
138bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o#include <stdio.h>
148bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o
158bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o#include "ext2_fs.h"
168bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o#include "ext2fs.h"
178bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o
187f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'ovoid ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
197f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'o			       int inuse, int isdir)
208bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o{
218bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	int	group = ext2fs_group_of_ino(fs, ino);
228bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o
238bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	if (inuse > 0)
248bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o		ext2fs_mark_inode_bitmap(fs->inode_map, ino);
258bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	else
268bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o		ext2fs_unmark_inode_bitmap(fs->inode_map, ino);
278bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	fs->group_desc[group].bg_free_inodes_count -= inuse;
287f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'o	if (isdir)
297f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'o		fs->group_desc[group].bg_used_dirs_count += inuse;
30d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos
31d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos	/* We don't strictly need to be clearing these if inuse < 0
32d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos	 * (i.e. freeing inodes) but it also means something is bad. */
33d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos	fs->group_desc[group].bg_flags &= ~(EXT2_BG_INODE_UNINIT |
34d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos					    EXT2_BG_BLOCK_UNINIT);
35d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos	if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
36d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos				       EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
37d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos		ext2_ino_t first_unused_inode =	fs->super->s_inodes_per_group -
38d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos			fs->group_desc[group].bg_itable_unused +
39d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos			group * fs->super->s_inodes_per_group + 1;
40d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos
41d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos		if (ino >= first_unused_inode)
42d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos			fs->group_desc[group].bg_itable_unused =
43d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos				group * fs->super->s_inodes_per_group +
44d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos				fs->super->s_inodes_per_group - ino;
45d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos
46d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos		ext2fs_group_desc_csum_set(fs, group);
47d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos	}
48d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos
498bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	fs->super->s_free_inodes_count -= inuse;
508bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	ext2fs_mark_super_dirty(fs);
518bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	ext2fs_mark_ib_dirty(fs);
528bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o}
538bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o
547f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'ovoid ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse)
557f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'o{
567f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'o	ext2fs_inode_alloc_stats2(fs, ino, inuse, 0);
577f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'o}
587f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'o
598bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'ovoid ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse)
608bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o{
618bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	int	group = ext2fs_group_of_blk(fs, blk);
628bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o
638bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	if (inuse > 0)
648bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o		ext2fs_mark_block_bitmap(fs->block_map, blk);
658bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	else
668bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o		ext2fs_unmark_block_bitmap(fs->block_map, blk);
678bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	fs->group_desc[group].bg_free_blocks_count -= inuse;
68d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos	fs->group_desc[group].bg_flags &= ~EXT2_BG_BLOCK_UNINIT;
69d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos	ext2fs_group_desc_csum_set(fs, group);
70d4f34d41be97e23db07d5ed606fcc1a26f5a3c76Jose R. Santos
718bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	fs->super->s_free_blocks_count -= inuse;
728bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	ext2fs_mark_super_dirty(fs);
738bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	ext2fs_mark_bb_dirty(fs);
748bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o}
75