xfs: fix di_metatype field of inodes that won't load

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>
Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Darrick J. Wong 2024-11-03 20:18:59 -08:00
parent aec2eb7da8
commit 5dab2daa8a
2 changed files with 12 additions and 3 deletions

View File

@ -443,8 +443,13 @@ xchk_dinode(
break;
case 2:
case 3:
if (!xfs_dinode_is_metadir(dip) && dip->di_metatype)
xchk_ino_set_corrupt(sc, ino);
if (xfs_dinode_is_metadir(dip)) {
if (be16_to_cpu(dip->di_metatype) >= XFS_METAFILE_MAX)
xchk_ino_set_corrupt(sc, ino);
} else {
if (dip->di_metatype != 0)
xchk_ino_set_corrupt(sc, ino);
}
if (dip->di_mode == 0 && sc->ip)
xchk_ino_set_corrupt(sc, ino);

View File

@ -526,8 +526,12 @@ xrep_dinode_nlinks(
return;
}
if (!xfs_dinode_is_metadir(dip))
if (xfs_dinode_is_metadir(dip)) {
if (be16_to_cpu(dip->di_metatype) >= XFS_METAFILE_MAX)
dip->di_metatype = cpu_to_be16(XFS_METAFILE_UNKNOWN);
} else {
dip->di_metatype = 0;
}
}
/* Fix any conflicting flags that the verifiers complain about. */