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)