From: Darrick J. Wong Date: Sat, 26 Jul 2014 20:28:58 +0000 (-0400) Subject: e2fsck: during pass1b delete_file, only free a cluster once X-Git-Tag: v1.42.12~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8dd650ab9ac394c6d6d19b02e8bb22d5a1e5da0d;p=thirdparty%2Fe2fsprogs.git 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 --- diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c index ec6c2bc0e..bb81d5e99 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 8fcb4ac26..2b7bff4ae 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; }