alloc_stats.c revision 5711ed297b1a3d94086256b5b3b891d4f77b21ca
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * alloc_stats.c --- Update allocation statistics for ext2fs
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2001 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 Public
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License.
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * %End-Header%
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <stdio.h>
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ext2_fs.h"
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ext2fs.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)			       int inuse, int isdir)
20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles){
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)	int	group = ext2fs_group_of_ino(fs, ino);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (inuse > 0)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		ext2fs_mark_inode_bitmap(fs->inode_map, ino);
259ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch	else
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch		ext2fs_unmark_inode_bitmap(fs->inode_map, ino);
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	fs->group_desc[group].bg_free_inodes_count -= inuse;
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	if (isdir)
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch		fs->group_desc[group].bg_used_dirs_count += inuse;
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	/* We don't strictly need to be clearing the uninit flag if inuse < 0
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	 * (i.e. freeing inodes) but it also means something is bad. */
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	fs->group_desc[group].bg_flags &= ~EXT2_BG_INODE_UNINIT;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2_ino_t first_unused_inode =	fs->super->s_inodes_per_group -
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			fs->group_desc[group].bg_itable_unused +
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)			group * fs->super->s_inodes_per_group + 1;
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		if (ino >= first_unused_inode)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			fs->group_desc[group].bg_itable_unused =
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)				group * fs->super->s_inodes_per_group +
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				fs->super->s_inodes_per_group - ino;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ext2fs_group_desc_csum_set(fs, group);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fs->super->s_free_inodes_count -= inuse;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ext2fs_mark_super_dirty(fs);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ext2fs_mark_ib_dirty(fs);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	ext2fs_inode_alloc_stats2(fs, ino, inuse, 0);
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	int	group = ext2fs_group_of_blk(fs, blk);
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	if (inuse > 0)
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)		ext2fs_mark_block_bitmap(fs->block_map, blk);
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	else
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)		ext2fs_unmark_block_bitmap(fs->block_map, blk);
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	fs->group_desc[group].bg_free_blocks_count -= inuse;
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	fs->group_desc[group].bg_flags &= ~EXT2_BG_BLOCK_UNINIT;
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	ext2fs_group_desc_csum_set(fs, group);
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	fs->super->s_free_blocks_count -= inuse;
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	ext2fs_mark_super_dirty(fs);
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	ext2fs_mark_bb_dirty(fs);
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)