From: Darrick J. Wong <djwong@xxxxxxxxxx> 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@xxxxxxxxxx> Reviewed-by: Christoph Hellwig <hch@xxxxxx> --- 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 45222552a51ccb..07987a6569c43a 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 7700fcd8170448..b0808b54a51285 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. */