trace_xchk_btree_rec(bs->sc, cur, 0);
 
-       /* If this isn't the first record, are they in order? */
-       if (cur->bc_levels[0].ptr > 1 &&
+       /* Are all records across all record blocks in order? */
+       if (bs->lastrec_valid &&
            !cur->bc_ops->recs_inorder(cur, &bs->lastrec, rec))
                xchk_btree_set_corrupt(bs->sc, cur, 0);
        memcpy(&bs->lastrec, rec, cur->bc_ops->rec_len);
+       bs->lastrec_valid = true;
 
        if (cur->bc_nlevels == 1)
                return;
 
        trace_xchk_btree_key(bs->sc, cur, level);
 
-       /* If this isn't the first key, are they in order? */
-       if (cur->bc_levels[level].ptr > 1 &&
-           !cur->bc_ops->keys_inorder(cur, &bs->lastkey[level - 1], key))
+       /* Are all low keys across all node blocks in order? */
+       if (bs->lastkey[level - 1].valid &&
+           !cur->bc_ops->keys_inorder(cur, &bs->lastkey[level - 1].key, key))
                xchk_btree_set_corrupt(bs->sc, cur, level);
-       memcpy(&bs->lastkey[level - 1], key, cur->bc_ops->key_len);
+       memcpy(&bs->lastkey[level - 1].key, key, cur->bc_ops->key_len);
+       bs->lastkey[level - 1].valid = true;
 
        if (level + 1 >= cur->bc_nlevels)
                return;
 
        struct xchk_btree               *bs,
        const union xfs_btree_rec       *rec);
 
+struct xchk_btree_key {
+       union xfs_btree_key             key;
+       bool                            valid;
+};
+
 struct xchk_btree {
        /* caller-provided scrub state */
        struct xfs_scrub                *sc;
        void                            *private;
 
        /* internal scrub state */
+       bool                            lastrec_valid;
        union xfs_btree_rec             lastrec;
        struct list_head                to_check;
 
        /* this element must come last! */
-       union xfs_btree_key             lastkey[];
+       struct xchk_btree_key           lastkey[];
 };
 
 /*