We got issue as follows: [root@localhost ~]# e2fsck -a img img: recovering journal img: Truncating orphaned inode 188 (uid=0, gid=0, mode=0100666, size=0) img: Truncating orphaned inode 174 (uid=0, gid=0, mode=0100666, size=0) img: clean, 484/128016 files, 118274/512000 blocks [root@localhost ~]# e2fsck -fn img e2fsck 1.46.5 (30-Dec-2021) Pass 1: Checking inodes, blocks, and sizes Inode 174, i_blocks is 2, should be 0. Fix? no Inode 188, i_blocks is 2, should be 0. Fix? no Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information img: ********** WARNING: Filesystem still has errors ********** img: 484/128016 files (24.6% non-contiguous), 118274/512000 blocks File ACL would be set to zero in release_inode_blocks(), but the blocks count will not be subtract acl blocks, which causes this issue. To slove this issue, subtract acl blocks when setting i_file_acl to zero. Signed-off-by: LiJinlin <lijinlin3@xxxxxxxxxx> Signed-off-by: Zhiqiang Liu <liuzhiqiang26@xxxxxxxxxx> --- e2fsck/super.c | 7 +++++-- lib/ext2fs/ext2fs.h | 5 +++++ lib/ext2fs/ext_attr.c | 15 +++++++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/e2fsck/super.c b/e2fsck/super.c index 9495e029..715a8dc9 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -194,6 +194,7 @@ static int release_inode_blocks(e2fsck_t ctx, ext2_ino_t ino, blk64_t blk; errcode_t retval; __u32 count; + __u32 blocks; if (!ext2fs_inode_has_valid_blocks2(fs, EXT2_INODE(inode))) return 0; @@ -238,8 +239,10 @@ static int release_inode_blocks(e2fsck_t ctx, ext2_ino_t ino, blk = ext2fs_file_acl_block(fs, EXT2_INODE(inode)); if (blk) { - retval = ext2fs_adjust_ea_refcount3(fs, blk, block_buf, -1, - &count, ino); + retval = ext2fs_adjust_ea_refcount4(fs, blk, block_buf, -1, + &count, ino, &blocks); + if (retval == 0) + ext2fs_iblk_sub_blocks(fs, EXT2_INODE(inode), blocks); if (retval == EXT2_ET_BAD_EA_BLOCK_NUM) { retval = 0; count = 1; diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index 68f9c1fe..8ebebf31 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -1289,6 +1289,11 @@ extern errcode_t ext2fs_adjust_ea_refcount3(ext2_filsys fs, blk64_t blk, char *block_buf, int adjust, __u32 *newcount, ext2_ino_t inum); +extern errcode_t ext2fs_adjust_ea_refcount4(ext2_filsys fs, blk64_t blk, + char *block_buf, + int adjust, __u32 *newcount, + ext2_ino_t inum, + __u32 *blocks); errcode_t ext2fs_xattrs_write(struct ext2_xattr_handle *handle); errcode_t ext2fs_xattrs_read(struct ext2_xattr_handle *handle); errcode_t ext2fs_xattrs_read_inode(struct ext2_xattr_handle *handle, diff --git a/lib/ext2fs/ext_attr.c b/lib/ext2fs/ext_attr.c index d36fe68d..1538a53a 100644 --- a/lib/ext2fs/ext_attr.c +++ b/lib/ext2fs/ext_attr.c @@ -237,9 +237,10 @@ errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block, void *inbuf) /* * This function adjusts the reference count of the EA block. */ -errcode_t ext2fs_adjust_ea_refcount3(ext2_filsys fs, blk64_t blk, +errcode_t ext2fs_adjust_ea_refcount4(ext2_filsys fs, blk64_t blk, char *block_buf, int adjust, - __u32 *newcount, ext2_ino_t inum) + __u32 *newcount, ext2_ino_t inum, + __u32 *blocks) { errcode_t retval; struct ext2_ext_attr_header *header; @@ -264,6 +265,8 @@ errcode_t ext2fs_adjust_ea_refcount3(ext2_filsys fs, blk64_t blk, header->h_refcount += adjust; if (newcount) *newcount = header->h_refcount; + if (blocks) + *blocks = header->h_blocks; retval = ext2fs_write_ext_attr3(fs, blk, block_buf, inum); if (retval) @@ -275,6 +278,14 @@ errout: return retval; } +errcode_t ext2fs_adjust_ea_refcount3(ext2_filsys fs, blk64_t blk, + char *block_buf, int adjust, + __u32 *newcount, ext2_ino_t inum) +{ + return ext2fs_adjust_ea_refcount4(fs, blk, block_buf, adjust, + newcount, 0, NULL); +} + errcode_t ext2fs_adjust_ea_refcount2(ext2_filsys fs, blk64_t blk, char *block_buf, int adjust, __u32 *newcount) -- 2.27.0 .