提交 d4a34e16 编写于 作者: E Eric Sandeen 提交者: Darrick J. Wong

xfs: properly handle free inodes in extent hint validators

When inodes are freed in xfs_ifree(), di_flags is cleared (so extent size
hints are removed) but the actual extent size fields are left intact.
This causes the extent hint validators to fail on freed inodes which once
had extent size hints.

This can be observed (for example) by running xfs/229 twice on a
non-crc xfs filesystem, or presumably on V5 with ikeep.

Fixes: 7d71a671 ("xfs: verify extent size hint is valid in inode verifier")
Fixes: 02a0fda8 ("xfs: verify COW extent size hint is valid in inode verifier")
Signed-off-by: NEric Sandeen <sandeen@redhat.com>
Reviewed-by: NBrian Foster <bfoster@redhat.com>
Reviewed-by: NDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: NDarrick J. Wong <darrick.wong@oracle.com>
上级 9991274f
...@@ -731,7 +731,8 @@ xfs_inode_validate_extsize( ...@@ -731,7 +731,8 @@ xfs_inode_validate_extsize(
if ((hint_flag || inherit_flag) && extsize == 0) if ((hint_flag || inherit_flag) && extsize == 0)
return __this_address; return __this_address;
if (!(hint_flag || inherit_flag) && extsize != 0) /* free inodes get flags set to zero but extsize remains */
if (mode && !(hint_flag || inherit_flag) && extsize != 0)
return __this_address; return __this_address;
if (extsize_bytes % blocksize_bytes) if (extsize_bytes % blocksize_bytes)
...@@ -777,7 +778,8 @@ xfs_inode_validate_cowextsize( ...@@ -777,7 +778,8 @@ xfs_inode_validate_cowextsize(
if (hint_flag && cowextsize == 0) if (hint_flag && cowextsize == 0)
return __this_address; return __this_address;
if (!hint_flag && cowextsize != 0) /* free inodes get flags set to zero but cowextsize remains */
if (mode && !hint_flag && cowextsize != 0)
return __this_address; return __this_address;
if (hint_flag && rt_flag) if (hint_flag && rt_flag)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册