From 8dd650ab9ac394c6d6d19b02e8bb22d5a1e5da0d Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Sat, 26 Jul 2014 16:28:58 -0400 Subject: [PATCH] e2fsck: during pass1b delete_file, only free a cluster once If we're forced to delete a crosslinked file, only call ext2fs_block_alloc_stats2() on cluster boundaries, since the block bitmaps are all cluster bitmaps at this point. It's safe to do this only once per cluster since we know all the blocks are going away. Signed-off-by: Darrick J. Wong Signed-off-by: Theodore Ts'o --- e2fsck/pass1b.c | 3 ++- e2fsck/pass2.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c index ec6c2bc..bb81d5e 100644 --- a/e2fsck/pass1b.c +++ b/e2fsck/pass1b.c @@ -625,7 +625,8 @@ static int delete_file_block(ext2_filsys fs, _("internal error: can't find dup_blk for %llu\n"), *block_nr); } else { - ext2fs_block_alloc_stats2(fs, *block_nr, -1); + if ((*block_nr % EXT2FS_CLUSTER_RATIO(ctx->fs)) == 0) + ext2fs_block_alloc_stats2(fs, *block_nr, -1); pb->dup_blocks++; } pb->cur_cluster = lc; diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c index 8fcb4ac..2b7bff4 100644 --- a/e2fsck/pass2.c +++ b/e2fsck/pass2.c @@ -1171,7 +1171,8 @@ static int deallocate_inode_block(ext2_filsys fs, if ((*block_nr < fs->super->s_first_data_block) || (*block_nr >= ext2fs_blocks_count(fs->super))) return 0; - ext2fs_block_alloc_stats2(fs, *block_nr, -1); + if ((*block_nr % EXT2FS_CLUSTER_RATIO(fs)) == 0) + ext2fs_block_alloc_stats2(fs, *block_nr, -1); p->num++; return 0; } -- 1.8.3.1