diff options
author | Darrick J. Wong <djwong@kernel.org> | 2024-11-03 20:18:59 -0800 |
---|---|---|
committer | Darrick J. Wong <djwong@kernel.org> | 2024-11-05 13:38:34 -0800 |
commit | 5dab2daa8aa1a127523f2babaf9611d91c28acea (patch) | |
tree | 479dd5ea1068f9d0c4c6f0c81d1b490073af6040 | |
parent | aec2eb7da8f777998164a8ce4e38b84fd0136f97 (diff) | |
download | linux-5dab2daa8aa1a127523f2babaf9611d91c28acea.tar.gz linux-5dab2daa8aa1a127523f2babaf9611d91c28acea.tar.bz2 linux-5dab2daa8aa1a127523f2babaf9611d91c28acea.zip |
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>
-rw-r--r-- | fs/xfs/scrub/inode.c | 9 | ||||
-rw-r--r-- | fs/xfs/scrub/inode_repair.c | 6 |
2 files changed, 12 insertions, 3 deletions
diff --git a/fs/xfs/scrub/inode.c b/fs/xfs/scrub/inode.c index ac5c56416533..25ee66e7649d 100644 --- a/fs/xfs/scrub/inode.c +++ b/fs/xfs/scrub/inode.c @@ -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); diff --git a/fs/xfs/scrub/inode_repair.c b/fs/xfs/scrub/inode_repair.c index eaa1e1afe3a4..5a58ddd27bd2 100644 --- a/fs/xfs/scrub/inode_repair.c +++ b/fs/xfs/scrub/inode_repair.c @@ -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. */ |