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