From 2a77a784a327835dbf0c8aa92978f201e44fbc26 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Sat, 5 Apr 2003 22:50:44 -0500 Subject: [PATCH] E2fsck now updates the global free block and inode counters from the block group specific counters quietly. This is needed for an experimental patch which eliminates locking the entire filesystem when allocating blocks or inodes; if the filesystem is not unmounted cleanly, the global counts may not be accurate. --- e2fsck/ChangeLog | 9 +++++++++ e2fsck/super.c | 18 ++++++++++++++++++ tests/ChangeLog | 7 +++++++ tests/f_baddir/expect.1 | 3 --- tests/f_dup/expect.1 | 2 +- tests/f_dup2/expect.1 | 2 +- tests/f_end-bitmap/expect.1 | 3 +++ tests/f_lpf/expect.1 | 2 +- 8 files changed, 40 insertions(+), 6 deletions(-) diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index 0fb8642..5109482 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,3 +1,12 @@ +2003-04-05 Theodore Ts'o + + * super.c (check_super_block): Update the global free block and + inode counters from the block group specific counters + quietly. This is needed for an experimental patch which + eliminates locking the entire filesystem when allocating + blocks or inodes; if the filesystem is not unmounted + cleanly, the global counts may not be accurate. + 2003-03-17 Theodore Ts'o * util.c: Explicitly declare e2fsck_global_ctx as extern for the diff --git a/e2fsck/super.c b/e2fsck/super.c index 2deff44..9210739 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -323,6 +323,7 @@ void check_super_block(e2fsck_t ctx) dgrp_t i; blk_t should_be; struct problem_context pctx; + __u32 free_blocks = 0, free_inodes = 0; inodes_per_block = EXT2_INODES_PER_BLOCK(fs->super); ipg_max = inodes_per_block * (blocks_per_group - 4); @@ -462,6 +463,8 @@ void check_super_block(e2fsck_t ctx) ctx->invalid_inode_table_flag[i]++; ctx->invalid_bitmaps++; } + free_blocks += fs->group_desc[i].bg_free_blocks_count; + free_inodes += fs->group_desc[i].bg_free_inodes_count; first_block += fs->super->s_blocks_per_group; last_block += fs->super->s_blocks_per_group; } @@ -488,6 +491,21 @@ void check_super_block(e2fsck_t ctx) } } #endif + + /* + * Update the global counts from the block group counts. This + * is needed for an experimental patch which eliminates + * locking the entire filesystem when allocating blocks or + * inodes; if the filesystem is not unmounted cleanly, the + * global counts may not be accurate. + */ + if (!(ctx->options & E2F_OPT_READONLY) && + ((free_blocks != fs->super->s_free_blocks_count) || + (free_inodes != fs->super->s_free_inodes_count))) { + fs->super->s_free_blocks_count = free_blocks; + fs->super->s_free_inodes_count = free_inodes; + ext2fs_mark_super_dirty(fs); + } /* * For the Hurd, check to see if the filetype option is set, diff --git a/tests/ChangeLog b/tests/ChangeLog index 1162032..4065907 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,10 @@ +2003-04-05 Theodore Ts'o + + * f_baddir, f_dup, f_dup2, f_end-bitmap, f_lpf: Update test cases + to deal with changes to automatically calculate and update + the global inode and block counts at the beginning of the + e2fsck run. + 2003-03-25 Theodore Ts'o * f_h_badnode, f_h_badroot, f_h_reindex: Updated expect script to diff --git a/tests/f_baddir/expect.1 b/tests/f_baddir/expect.1 index 375a2bf..d47352d 100644 --- a/tests/f_baddir/expect.1 +++ b/tests/f_baddir/expect.1 @@ -39,9 +39,6 @@ Pass 5: Checking group summary information Block bitmap differences: -22 Fix? yes -Free blocks count wrong (74, counted=75). -Fix? yes - Inode bitmap differences: -13 Fix? yes diff --git a/tests/f_dup/expect.1 b/tests/f_dup/expect.1 index a6745c4..e09a786 100644 --- a/tests/f_dup/expect.1 +++ b/tests/f_dup/expect.1 @@ -26,7 +26,7 @@ Pass 5: Checking group summary information Free blocks count wrong for group #0 (44, counted=60). Fix? yes -Free blocks count wrong (62, counted=60). +Free blocks count wrong (44, counted=60). Fix? yes Padding at end of block bitmap is not set. Fix? yes diff --git a/tests/f_dup2/expect.1 b/tests/f_dup2/expect.1 index 28b7404..5d448fe 100644 --- a/tests/f_dup2/expect.1 +++ b/tests/f_dup2/expect.1 @@ -33,7 +33,7 @@ Pass 5: Checking group summary information Free blocks count wrong for group #0 (8, counted=22). Fix? yes -Free blocks count wrong (26, counted=22). +Free blocks count wrong (8, counted=22). Fix? yes Padding at end of block bitmap is not set. Fix? yes diff --git a/tests/f_end-bitmap/expect.1 b/tests/f_end-bitmap/expect.1 index 87e2fd6..3348a2b 100644 --- a/tests/f_end-bitmap/expect.1 +++ b/tests/f_end-bitmap/expect.1 @@ -8,6 +8,9 @@ Pass 5: Checking group summary information Free blocks count wrong for group #0 (44, counted=63). Fix? yes +Free blocks count wrong (44, counted=63). +Fix? yes + Padding at end of block bitmap is not set. Fix? yes diff --git a/tests/f_lpf/expect.1 b/tests/f_lpf/expect.1 index 4f2853c..6c0a746 100644 --- a/tests/f_lpf/expect.1 +++ b/tests/f_lpf/expect.1 @@ -30,7 +30,7 @@ Fix? yes Free blocks count wrong for group #0 (24, counted=33). Fix? yes -Free blocks count wrong (38, counted=33). +Free blocks count wrong (24, counted=33). Fix? yes Inode bitmap differences: +13 -- 1.8.3.1