summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2024-11-03 20:18:59 -0800
committerDarrick J. Wong <djwong@kernel.org>2024-11-05 13:38:34 -0800
commit5dab2daa8aa1a127523f2babaf9611d91c28acea (patch)
tree479dd5ea1068f9d0c4c6f0c81d1b490073af6040
parentaec2eb7da8f777998164a8ce4e38b84fd0136f97 (diff)
downloadlinux-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.c9
-rw-r--r--fs/xfs/scrub/inode_repair.c6
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. */