From: Andreas Dilger Date: Fri, 8 Aug 2025 08:04:27 +0000 (-0600) Subject: ext2fs: fix fast symlink blocks check X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ae7370a5fa175c609bd7c780a5ffaefdd58efc91;p=thirdparty%2Fe2fsprogs.git ext2fs: fix fast symlink blocks check Use ext4_inode_is_fast_symlink() in ext2fs_inode_has_valid_blocks2() instead of depending exclusively on i_blocks == 0 to determine if an inode is a fast symlink. Otherwise, if a fast symlink has a large external xattr inode that increases i_blocks, it will be incorrectly reported as having invalid blocks. Change-Id: Ibde2348da39401601abedd603bd7e4ef97091abe Fixes: 0684a4f33 ("Overhaul extended attribute handling") Signed-off-by: Andreas Dilger Reviewed-by: Li Dongyang Reviewed-on: https://review.whamcloud.com/59871 Lustre-bug-id: https://jira.whamcloud.com/browse/LU-19121 Message-ID: <20250808080505.1307694-1-adilger@dilger.ca> Signed-off-by: Theodore Ts'o --- diff --git a/lib/ext2fs/valid_blk.c b/lib/ext2fs/valid_blk.c index db5d90ae..332e9c66 100644 --- a/lib/ext2fs/valid_blk.c +++ b/lib/ext2fs/valid_blk.c @@ -43,6 +43,7 @@ int ext2fs_inode_has_valid_blocks2(ext2_filsys fs, struct ext2_inode *inode) /* With no EA block, we can rely on i_blocks */ if (inode->i_blocks == 0) return 0; + return !ext2fs_is_fast_symlink(inode); } else { /* With an EA block, life gets more tricky */ if (inode->i_size >= EXT2_N_BLOCKS*4) diff --git a/tests/f_ea_inode_fast_symlink/expect.1 b/tests/f_ea_inode_fast_symlink/expect.1 new file mode 100644 index 00000000..b88456d0 --- /dev/null +++ b/tests/f_ea_inode_fast_symlink/expect.1 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 14/256 files (0.0% non-contiguous), 1147/8192 blocks +Exit status is 0 diff --git a/tests/f_ea_inode_fast_symlink/expect.2 b/tests/f_ea_inode_fast_symlink/expect.2 new file mode 100644 index 00000000..b88456d0 --- /dev/null +++ b/tests/f_ea_inode_fast_symlink/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 14/256 files (0.0% non-contiguous), 1147/8192 blocks +Exit status is 0 diff --git a/tests/f_ea_inode_fast_symlink/image.gz b/tests/f_ea_inode_fast_symlink/image.gz new file mode 100644 index 00000000..f3872b37 Binary files /dev/null and b/tests/f_ea_inode_fast_symlink/image.gz differ diff --git a/tests/f_ea_inode_fast_symlink/name b/tests/f_ea_inode_fast_symlink/name new file mode 100644 index 00000000..9eebeded --- /dev/null +++ b/tests/f_ea_inode_fast_symlink/name @@ -0,0 +1 @@ +fast symlink with ea_inode