]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: factor out a btree block owner check
authorDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:35:23 +0000 (12:35 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:35:23 +0000 (12:35 -0800)
Hoist the btree block owner check into a separate helper so that we
don't have an ugly multiline if statement.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_btree.c

index b869d6eb6a0b75ade42ec8e7cc1da0e455acaaa9..6d6683d8663fae814d58bee7a04d4d43fd29046b 100644 (file)
@@ -1777,6 +1777,33 @@ error0:
        return error;
 }
 
+/*
+ * Check the btree block owner now that we have the context to know who the
+ * real owner is.
+ */
+static inline xfs_failaddr_t
+xfs_btree_check_block_owner(
+       struct xfs_btree_cur    *cur,
+       struct xfs_btree_block  *block)
+{
+       __u64                   owner;
+
+       if (!xfs_has_crc(cur->bc_mp) ||
+           (cur->bc_flags & XFS_BTREE_BMBT_INVALID_OWNER))
+               return NULL;
+
+       owner = xfs_btree_owner(cur);
+       if (cur->bc_ops->geom_flags & XFS_BTGEO_LONG_PTRS) {
+               if (be64_to_cpu(block->bb_u.l.bb_owner) != owner)
+                       return __this_address;
+       } else {
+               if (be32_to_cpu(block->bb_u.s.bb_owner) != owner)
+                       return __this_address;
+       }
+
+       return NULL;
+}
+
 int
 xfs_btree_lookup_get_block(
        struct xfs_btree_cur            *cur,   /* btree cursor */
@@ -1815,11 +1842,7 @@ xfs_btree_lookup_get_block(
                return error;
 
        /* Check the inode owner since the verifiers don't. */
-       if (xfs_has_crc(cur->bc_mp) &&
-           !(cur->bc_flags & XFS_BTREE_BMBT_INVALID_OWNER) &&
-           (cur->bc_ops->geom_flags & XFS_BTGEO_LONG_PTRS) &&
-           be64_to_cpu((*blkp)->bb_u.l.bb_owner) !=
-                       cur->bc_ino.ip->i_ino)
+       if (xfs_btree_check_block_owner(cur, *blkp) != NULL)
                goto out_bad;
 
        /* Did we get the level we were looking for? */