2 * alloc_stats.c --- Update allocation statistics for ext2fs
4 * Copyright (C) 2001 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Library
8 * General Public License, version 2.
18 void ext2fs_inode_alloc_stats2(ext2_filsys fs
, ext2_ino_t ino
,
21 int group
= ext2fs_group_of_ino(fs
, ino
);
24 if (ino
> fs
->super
->s_inodes_count
) {
25 com_err("ext2fs_inode_alloc_stats2", 0,
26 "Illegal inode number: %lu", (unsigned long) ino
);
31 ext2fs_mark_inode_bitmap2(fs
->inode_map
, ino
);
33 ext2fs_unmark_inode_bitmap2(fs
->inode_map
, ino
);
34 ext2fs_bg_free_inodes_count_set(fs
, group
, ext2fs_bg_free_inodes_count(fs
, group
) - inuse
);
36 ext2fs_bg_used_dirs_count_set(fs
, group
, ext2fs_bg_used_dirs_count(fs
, group
) + inuse
);
38 /* We don't strictly need to be clearing the uninit flag if inuse < 0
39 * (i.e. freeing inodes) but it also means something is bad. */
40 ext2fs_bg_flags_clear(fs
, group
, EXT2_BG_INODE_UNINIT
);
41 if (ext2fs_has_group_desc_csum(fs
)) {
42 ext2_ino_t first_unused_inode
= fs
->super
->s_inodes_per_group
-
43 ext2fs_bg_itable_unused(fs
, group
) +
44 group
* fs
->super
->s_inodes_per_group
+ 1;
46 if (ino
>= first_unused_inode
)
47 ext2fs_bg_itable_unused_set(fs
, group
, group
* fs
->super
->s_inodes_per_group
+ fs
->super
->s_inodes_per_group
- ino
);
48 ext2fs_group_desc_csum_set(fs
, group
);
51 fs
->super
->s_free_inodes_count
-= inuse
;
52 ext2fs_mark_super_dirty(fs
);
53 ext2fs_mark_ib_dirty(fs
);
56 void ext2fs_inode_alloc_stats(ext2_filsys fs
, ext2_ino_t ino
, int inuse
)
58 ext2fs_inode_alloc_stats2(fs
, ino
, inuse
, 0);
61 void ext2fs_block_alloc_stats2(ext2_filsys fs
, blk64_t blk
, int inuse
)
63 int group
= ext2fs_group_of_blk2(fs
, blk
);
66 if (blk
>= ext2fs_blocks_count(fs
->super
)) {
67 com_err("ext2fs_block_alloc_stats", 0,
68 "Illegal block number: %lu", (unsigned long) blk
);
73 ext2fs_mark_block_bitmap2(fs
->block_map
, blk
);
75 ext2fs_unmark_block_bitmap2(fs
->block_map
, blk
);
76 ext2fs_bg_free_blocks_count_set(fs
, group
, ext2fs_bg_free_blocks_count(fs
, group
) - inuse
);
77 ext2fs_bg_flags_clear(fs
, group
, EXT2_BG_BLOCK_UNINIT
);
78 ext2fs_group_desc_csum_set(fs
, group
);
80 ext2fs_free_blocks_count_add(fs
->super
,
81 -inuse
* EXT2FS_CLUSTER_RATIO(fs
));
82 ext2fs_mark_super_dirty(fs
);
83 ext2fs_mark_bb_dirty(fs
);
84 if (fs
->block_alloc_stats
)
85 (fs
->block_alloc_stats
)(fs
, (blk64_t
) blk
, inuse
);
88 void ext2fs_block_alloc_stats(ext2_filsys fs
, blk_t blk
, int inuse
)
90 ext2fs_block_alloc_stats2(fs
, blk
, inuse
);
93 void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs
,
94 void (*func
)(ext2_filsys fs
,
97 void (**old
)(ext2_filsys fs
,
101 if (!fs
|| fs
->magic
!= EXT2_ET_MAGIC_EXT2FS_FILSYS
)
104 *old
= fs
->block_alloc_stats
;
106 fs
->block_alloc_stats
= func
;
109 void ext2fs_block_alloc_stats_range(ext2_filsys fs
, blk64_t blk
,
110 blk_t num
, int inuse
)
113 if (blk
+ num
> ext2fs_blocks_count(fs
->super
)) {
114 com_err("ext2fs_block_alloc_stats_range", 0,
115 "Illegal block range: %llu (%u) ",
116 (unsigned long long) blk
, num
);
123 ext2fs_mark_block_bitmap_range2(fs
->block_map
, blk
, num
);
126 ext2fs_unmark_block_bitmap_range2(fs
->block_map
, blk
, num
);
130 int group
= ext2fs_group_of_blk2(fs
, blk
);
131 blk64_t last_blk
= ext2fs_group_last_block2(fs
, group
);
134 if (blk
+ num
> last_blk
)
135 n
= last_blk
- blk
+ 1;
137 ext2fs_bg_free_blocks_count_set(fs
, group
,
138 ext2fs_bg_free_blocks_count(fs
, group
) -
139 inuse
*n
/EXT2FS_CLUSTER_RATIO(fs
));
140 ext2fs_bg_flags_clear(fs
, group
, EXT2_BG_BLOCK_UNINIT
);
141 ext2fs_group_desc_csum_set(fs
, group
);
142 ext2fs_free_blocks_count_add(fs
->super
, -inuse
* n
);
146 ext2fs_mark_super_dirty(fs
);
147 ext2fs_mark_bb_dirty(fs
);