struct xfs_perag        *pag = bp->b_pag;
        xfs_failaddr_t          fa;
        unsigned int            level;
+       xfs_btnum_t             btnum = XFS_BTNUM_BNOi;
+
+       if (!xfs_verify_magic(bp, block->bb_magic))
+               return __this_address;
+
+       if (xfs_sb_version_hascrc(&mp->m_sb)) {
+               fa = xfs_btree_sblock_v5hdr_verify(bp);
+               if (fa)
+                       return fa;
+       }
 
        /*
-        * magic number and level verification
-        *
-        * During growfs operations, we can't verify the exact level or owner as
-        * the perag is not fully initialised and hence not attached to the
-        * buffer.  In this case, check against the maximum tree depth.
+        * The perag may not be attached during grow operations or fully
+        * initialized from the AGF during log recovery. Therefore we can only
+        * check against maximum tree depth from those contexts.
         *
-        * Similarly, during log recovery we will have a perag structure
-        * attached, but the agf information will not yet have been initialised
-        * from the on disk AGF. Again, we can only check against maximum limits
-        * in this case.
+        * Otherwise check against the per-tree limit. Peek at one of the
+        * verifier magic values to determine the type of tree we're verifying
+        * against.
         */
        level = be16_to_cpu(block->bb_level);
-       switch (block->bb_magic) {
-       case cpu_to_be32(XFS_ABTB_CRC_MAGIC):
-               fa = xfs_btree_sblock_v5hdr_verify(bp);
-               if (fa)
-                       return fa;
-               /* fall through */
-       case cpu_to_be32(XFS_ABTB_MAGIC):
-               if (pag && pag->pagf_init) {
-                       if (level >= pag->pagf_levels[XFS_BTNUM_BNOi])
-                               return __this_address;
-               } else if (level >= mp->m_ag_maxlevels)
+       if (bp->b_ops->magic[0] == cpu_to_be32(XFS_ABTC_MAGIC))
+               btnum = XFS_BTNUM_CNTi;
+       if (pag && pag->pagf_init) {
+               if (level >= pag->pagf_levels[btnum])
                        return __this_address;
-               break;
-       case cpu_to_be32(XFS_ABTC_CRC_MAGIC):
-               fa = xfs_btree_sblock_v5hdr_verify(bp);
-               if (fa)
-                       return fa;
-               /* fall through */
-       case cpu_to_be32(XFS_ABTC_MAGIC):
-               if (pag && pag->pagf_init) {
-                       if (level >= pag->pagf_levels[XFS_BTNUM_CNTi])
-                               return __this_address;
-               } else if (level >= mp->m_ag_maxlevels)
-                       return __this_address;
-               break;
-       default:
+       } else if (level >= mp->m_ag_maxlevels)
                return __this_address;
-       }
 
        return xfs_btree_sblock_verify(bp, mp->m_alloc_mxr[level != 0]);
 }
 
 const struct xfs_buf_ops xfs_bnobt_buf_ops = {
        .name = "xfs_bnobt",
+       .magic = { cpu_to_be32(XFS_ABTB_MAGIC),
+                  cpu_to_be32(XFS_ABTB_CRC_MAGIC) },
        .verify_read = xfs_allocbt_read_verify,
        .verify_write = xfs_allocbt_write_verify,
        .verify_struct = xfs_allocbt_verify,
 
 const struct xfs_buf_ops xfs_cntbt_buf_ops = {
        .name = "xfs_cntbt",
+       .magic = { cpu_to_be32(XFS_ABTC_MAGIC),
+                  cpu_to_be32(XFS_ABTC_CRC_MAGIC) },
        .verify_read = xfs_allocbt_read_verify,
        .verify_write = xfs_allocbt_write_verify,
        .verify_struct = xfs_allocbt_verify,