[PATCH 20/26] xfs: fix di_metatype field of inodes that won't load

Darrick J. Wong
2024-08-23T00:07:22Z

From: Darrick J. Wong <djwong@kernel.org>

Make sure that the di_metatype field is at least set plausibly so that
later scrubbers could set the real type.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
fs/xfs/scrub/inode.c | 10 +++++++---
fs/xfs/scrub/inode_repair.c | 6 +++++-
2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/fs/xfs/scrub/inode.c b/fs/xfs/scrub/inode.c
index 45222552a51cc..07987a6569c43 100644
--- a/fs/xfs/scrub/inode.c
+++ b/fs/xfs/scrub/inode.c
@@ -443,9 +443,13 @@ xchk_dinode(
break;
case 2:
case 3:
- if (!(dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA)) &&
- dip->di_onlink != 0)
- xchk_ino_set_corrupt(sc, ino);
+ if (dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA)) {
+ if (be16_to_cpu(dip->di_metatype) >= XFS_METAFILE_MAX)
+ xchk_ino_set_corrupt(sc, ino);
+ } else {
+ if (dip->di_onlink != 0)
+ xchk_ino_set_corrupt(sc, ino);
+ }

if (dip->di_mode == 0 && sc->ip)
xchk_ino_set_corrupt(sc, ino);
diff --git a/fs/xfs/scrub/inode_repair.c b/fs/xfs/scrub/inode_repair.c
index 91d0da58443a1..e3f9a91807de7 100644
--- a/fs/xfs/scrub/inode_repair.c
+++ b/fs/xfs/scrub/inode_repair.c
@@ -526,8 +526,12 @@ xrep_dinode_nlinks(
return;
}

- if (!(dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA)))
+ if (dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA)) {
+ if (be16_to_cpu(dip->di_metatype) >= XFS_METAFILE_MAX)
+ dip->di_metatype = cpu_to_be16(XFS_METAFILE_UNKNOWN);
+ } else {
dip->di_onlink = 0;
+ }
}

/* Fix any conflicting flags that the verifiers complain about. */