]> git.apps.os.sepia.ceph.com Git - xfsprogs-dev.git/commitdiff
xfs: consolidate btree block verification
authorChristoph Hellwig <hch@lst.de>
Mon, 22 Apr 2024 17:01:08 +0000 (10:01 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 3 Jun 2024 18:37:39 +0000 (11:37 -0700)
Source kernel commit: 4ce0c711d9ab3a435bc605cd2f36a3f6b4e12c05

Add a __xfs_btree_check_block helper that can be called by the scrub code
to validate a btree block of any form, and move the duplicate error
handling code from xfs_btree_check_sblock and xfs_btree_check_lblock into
xfs_btree_check_block and thus remove these two helpers.

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>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
libxfs/xfs_btree.c
libxfs/xfs_btree.h

index 2f5848b9d51b24d33029892ed4faf03abdf4a622..fae121acecb401a4d6cdcdd086209760a22c242a 100644 (file)
@@ -95,7 +95,7 @@ xfs_btree_check_sblock_siblings(
  * Check a long btree block header.  Return the address of the failing check,
  * or NULL if everything is ok.
  */
-xfs_failaddr_t
+static xfs_failaddr_t
 __xfs_btree_check_lblock(
        struct xfs_btree_cur    *cur,
        struct xfs_btree_block  *block,
@@ -144,33 +144,11 @@ __xfs_btree_check_lblock(
        return fa;
 }
 
-/* Check a long btree block header. */
-static int
-xfs_btree_check_lblock(
-       struct xfs_btree_cur    *cur,
-       struct xfs_btree_block  *block,
-       int                     level,
-       struct xfs_buf          *bp)
-{
-       struct xfs_mount        *mp = cur->bc_mp;
-       xfs_failaddr_t          fa;
-
-       fa = __xfs_btree_check_lblock(cur, block, level, bp);
-       if (XFS_IS_CORRUPT(mp, fa != NULL) ||
-           XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BTREE_CHECK_LBLOCK)) {
-               if (bp)
-                       trace_xfs_btree_corrupt(bp, _RET_IP_);
-               xfs_btree_mark_sick(cur);
-               return -EFSCORRUPTED;
-       }
-       return 0;
-}
-
 /*
  * Check a short btree block header.  Return the address of the failing check,
  * or NULL if everything is ok.
  */
-xfs_failaddr_t
+static xfs_failaddr_t
 __xfs_btree_check_sblock(
        struct xfs_btree_cur    *cur,
        struct xfs_btree_block  *block,
@@ -206,26 +184,28 @@ __xfs_btree_check_sblock(
        return fa;
 }
 
-/* Check a short btree block header. */
-STATIC int
-xfs_btree_check_sblock(
+/*
+ * Internal btree block check.
+ *
+ * Return NULL if the block is ok or the address of the failed check otherwise.
+ */
+xfs_failaddr_t
+__xfs_btree_check_block(
        struct xfs_btree_cur    *cur,
        struct xfs_btree_block  *block,
        int                     level,
        struct xfs_buf          *bp)
 {
-       struct xfs_mount        *mp = cur->bc_mp;
-       xfs_failaddr_t          fa;
+       if (cur->bc_ops->ptr_len == XFS_BTREE_SHORT_PTR_LEN)
+               return __xfs_btree_check_sblock(cur, block, level, bp);
+       return __xfs_btree_check_lblock(cur, block, level, bp);
+}
 
-       fa = __xfs_btree_check_sblock(cur, block, level, bp);
-       if (XFS_IS_CORRUPT(mp, fa != NULL) ||
-           XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BTREE_CHECK_SBLOCK)) {
-               if (bp)
-                       trace_xfs_btree_corrupt(bp, _RET_IP_);
-               xfs_btree_mark_sick(cur);
-               return -EFSCORRUPTED;
-       }
-       return 0;
+static inline unsigned int xfs_btree_block_errtag(struct xfs_btree_cur *cur)
+{
+       if (cur->bc_ops->ptr_len == XFS_BTREE_SHORT_PTR_LEN)
+               return XFS_ERRTAG_BTREE_CHECK_SBLOCK;
+       return XFS_ERRTAG_BTREE_CHECK_LBLOCK;
 }
 
 /*
@@ -238,10 +218,18 @@ xfs_btree_check_block(
        int                     level,  /* level of the btree block */
        struct xfs_buf          *bp)    /* buffer containing block, if any */
 {
-       if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN)
-               return xfs_btree_check_lblock(cur, block, level, bp);
-       else
-               return xfs_btree_check_sblock(cur, block, level, bp);
+       struct xfs_mount        *mp = cur->bc_mp;
+       xfs_failaddr_t          fa;
+
+       fa = __xfs_btree_check_block(cur, block, level, bp);
+       if (XFS_IS_CORRUPT(mp, fa != NULL) ||
+           XFS_TEST_ERROR(false, mp, xfs_btree_block_errtag(cur))) {
+               if (bp)
+                       trace_xfs_btree_corrupt(bp, _RET_IP_);
+               xfs_btree_mark_sick(cur);
+               return -EFSCORRUPTED;
+       }
+       return 0;
 }
 
 int
index ca4a305eb0711ac1787612238f1d594c9ef12cee..d3afa6209ff80e51d0b71d84d90d5b0a3d9cae75 100644 (file)
@@ -334,15 +334,8 @@ xfs_btree_cur_sizeof(unsigned int nlevels)
  */
 #define        XFS_BUF_TO_BLOCK(bp)    ((struct xfs_btree_block *)((bp)->b_addr))
 
-/*
- * Internal long and short btree block checks.  They return NULL if the
- * block is ok or the address of the failed check otherwise.
- */
-xfs_failaddr_t __xfs_btree_check_lblock(struct xfs_btree_cur *cur,
+xfs_failaddr_t __xfs_btree_check_block(struct xfs_btree_cur *cur,
                struct xfs_btree_block *block, int level, struct xfs_buf *bp);
-xfs_failaddr_t __xfs_btree_check_sblock(struct xfs_btree_cur *cur,
-               struct xfs_btree_block *block, int level, struct xfs_buf *bp);
-
 int __xfs_btree_check_ptr(struct xfs_btree_cur *cur,
                const union xfs_btree_ptr *ptr, int index, int level);