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 0fb86426a..510948229 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 2deff4469..9210739ac 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 116203228..40659073d 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 375a2bf9c..d47352dc8 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 a6745c415..e09a786ac 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 28b740428..5d448fe53 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 87e2fd647..3348a2b31 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 4f2853c5b..6c0a746c9 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 -- 2.47.2