xfs: add a xfs_btree_ptrs_equal helper
authorChristoph Hellwig <hch@lst.de>
Thu, 22 Feb 2024 20:43:34 +0000 (12:43 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:43:34 +0000 (12:43 -0800)
This only has a single caller and thus might be a bit questionable,
but I think it really improves the readability of
xfs_btree_visit_block.

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

index ecdd5ea27a0386f546a90c5072f86491a070a851..aa60a46b8eecc43532d1dfa1736936cc7195f3c7 100644 (file)
@@ -1043,6 +1043,17 @@ xfs_btree_set_ptr_null(
                ptr->s = cpu_to_be32(NULLAGBLOCK);
 }
 
+static inline bool
+xfs_btree_ptrs_equal(
+       struct xfs_btree_cur            *cur,
+       union xfs_btree_ptr             *ptr1,
+       union xfs_btree_ptr             *ptr2)
+{
+       if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN)
+               return ptr1->l == ptr2->l;
+       return ptr1->s == ptr2->s;
+}
+
 /*
  * Get/set/init sibling pointers
  */
@@ -4365,7 +4376,7 @@ xfs_btree_visit_block(
 {
        struct xfs_btree_block          *block;
        struct xfs_buf                  *bp;
-       union xfs_btree_ptr             rptr;
+       union xfs_btree_ptr             rptr, bufptr;
        int                             error;
 
        /* do right sibling readahead */
@@ -4388,19 +4399,12 @@ xfs_btree_visit_block(
         * return the same block without checking if the right sibling points
         * back to us and creates a cyclic reference in the btree.
         */
-       if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN) {
-               if (be64_to_cpu(rptr.l) == XFS_DADDR_TO_FSB(cur->bc_mp,
-                                                       xfs_buf_daddr(bp))) {
-                       xfs_btree_mark_sick(cur);
-                       return -EFSCORRUPTED;
-               }
-       } else {
-               if (be32_to_cpu(rptr.s) == xfs_daddr_to_agbno(cur->bc_mp,
-                                                       xfs_buf_daddr(bp))) {
-                       xfs_btree_mark_sick(cur);
-                       return -EFSCORRUPTED;
-               }
+       xfs_btree_buf_to_ptr(cur, bp, &bufptr);
+       if (xfs_btree_ptrs_equal(cur, &rptr, &bufptr)) {
+               xfs_btree_mark_sick(cur);
+               return -EFSCORRUPTED;
        }
+
        return xfs_btree_lookup_get_block(cur, level, &rptr, &block);
 }