aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2024-02-15 09:27:54 +0100
committerCarlos Maiolino <cem@kernel.org>2024-02-15 12:56:43 +0100
commit53d96fc6b19415dfe1dedcf95099b3333ae4fe92 (patch)
tree0001ba20e2411e57d824cd2062772f91ef22499b
parent8fdde9dd48edc32a2f5e5a061a12e8dad54c3c7e (diff)
downloadxfsprogs-dev-53d96fc6b19415dfe1dedcf95099b3333ae4fe92.tar.gz
xfs: inode recovery does not validate the recovered inode
Source kernel commit: 038ca189c0d2c1570b4d922f25b524007c85cf94 Discovered when trying to track down a weird recovery corruption issue that wasn't detected at recovery time. The specific corruption was a zero extent count field when big extent counts are in use, and it turns out the dinode verifier doesn't detect that specific corruption case, either. So fix it too. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Chandan Babu R <chandanbabu@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
-rw-r--r--libxfs/xfs_inode_buf.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c
index 74a1bd2274..fd351c252a 100644
--- a/libxfs/xfs_inode_buf.c
+++ b/libxfs/xfs_inode_buf.c
@@ -507,6 +507,9 @@ xfs_dinode_verify(
if (mode && nextents + naextents > nblocks)
return __this_address;
+ if (nextents + naextents == 0 && nblocks != 0)
+ return __this_address;
+
if (S_ISDIR(mode) && nextents > mp->m_dir_geo->max_extents)
return __this_address;