aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2023-05-31 11:00:21 +0200
committerCarlos Maiolino <cem@kernel.org>2023-06-09 10:27:50 +0200
commit7e7856ceee84ea52363416ad7dfa933679c8250f (patch)
tree0662c9666863f89d6d4bc64a7ba16724db1ee1ae
parente70bf9ba99546b22a362e58d968e838feb886a6a (diff)
downloadxfsprogs-dev-7e7856ceee84ea52363416ad7dfa933679c8250f.tar.gz
xfs: hoist rmap record flag checks from scrub
Source kernel commit: 7d7d6d2fd0444904f12e70d9c930556c4eb44337 Move the rmap record flag checks from xchk_rmapbt_rec into xfs_rmap_check_irec so that they are applied everywhere. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Carlos Maiolino <cem@kernel.org>
-rw-r--r--libxfs/xfs_rmap.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c
index a5b48f0ec2..4657d7da7f 100644
--- a/libxfs/xfs_rmap.c
+++ b/libxfs/xfs_rmap.c
@@ -211,6 +211,10 @@ xfs_rmap_check_irec(
const struct xfs_rmap_irec *irec)
{
struct xfs_mount *mp = cur->bc_mp;
+ bool is_inode;
+ bool is_unwritten;
+ bool is_bmbt;
+ bool is_attr;
if (irec->rm_blockcount == 0)
return __this_address;
@@ -231,6 +235,24 @@ xfs_rmap_check_irec(
irec->rm_owner >= XFS_RMAP_OWN_MIN)))
return __this_address;
+ /* Check flags. */
+ is_inode = !XFS_RMAP_NON_INODE_OWNER(irec->rm_owner);
+ is_bmbt = irec->rm_flags & XFS_RMAP_BMBT_BLOCK;
+ is_attr = irec->rm_flags & XFS_RMAP_ATTR_FORK;
+ is_unwritten = irec->rm_flags & XFS_RMAP_UNWRITTEN;
+
+ if (is_bmbt && irec->rm_offset != 0)
+ return __this_address;
+
+ if (!is_inode && irec->rm_offset != 0)
+ return __this_address;
+
+ if (is_unwritten && (is_bmbt || !is_inode || is_attr))
+ return __this_address;
+
+ if (!is_inode && (is_bmbt || is_unwritten || is_attr))
+ return __this_address;
+
return NULL;
}