xfs_bmbt_disk_set_all(&rec->bmbt, &cur->bc_rec.b);
 }
 
-STATIC void
-xfs_bmbt_init_ptr_from_cur(
-       struct xfs_btree_cur    *cur,
-       union xfs_btree_ptr     *ptr)
-{
-       ptr->l = 0;
-}
-
 STATIC int64_t
 xfs_bmbt_key_diff(
        struct xfs_btree_cur            *cur,
        .init_key_from_rec      = xfs_bmbt_init_key_from_rec,
        .init_high_key_from_rec = xfs_bmbt_init_high_key_from_rec,
        .init_rec_from_cur      = xfs_bmbt_init_rec_from_cur,
-       .init_ptr_from_cur      = xfs_bmbt_init_ptr_from_cur,
        .key_diff               = xfs_bmbt_key_diff,
        .diff_two_keys          = xfs_bmbt_diff_two_keys,
        .buf_ops                = &xfs_bmbt_buf_ops,
 
        return xfs_btree_key_addr(cur, keyno, block);
 }
 
+/*
+ * Initialize a pointer to the root block.
+ */
+void
+xfs_btree_init_ptr_from_cur(
+       struct xfs_btree_cur    *cur,
+       union xfs_btree_ptr     *ptr)
+{
+       if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE) {
+               /*
+                * Inode-rooted btrees call xfs_btree_get_iroot to find the root
+                * in xfs_btree_lookup_get_block and don't need a pointer here.
+                */
+               ptr->l = 0;
+       } else {
+               cur->bc_ops->init_ptr_from_cur(cur, ptr);
+       }
+}
+
 /*
  * Lookup the record.  The cursor is made to point to it, based on dir.
  * stat is set to 0 if can't find any such record, 1 for success.
        keyno = 0;
 
        /* initialise start pointer from cursor */
-       cur->bc_ops->init_ptr_from_cur(cur, &ptr);
+       xfs_btree_init_ptr_from_cur(cur, &ptr);
        pp = &ptr;
 
        /*
        XFS_BTREE_STATS_INC(cur, newroot);
 
        /* initialise our start point from the cursor */
-       cur->bc_ops->init_ptr_from_cur(cur, &rptr);
+       xfs_btree_init_ptr_from_cur(cur, &rptr);
 
        /* Allocate the new block. If we can't do it, we're toast. Give up. */
        error = xfs_btree_alloc_block(cur, &rptr, &lptr, stat);
        struct xfs_btree_block          *block = NULL;
        int                             error = 0;
 
-       cur->bc_ops->init_ptr_from_cur(cur, &lptr);
+       xfs_btree_init_ptr_from_cur(cur, &lptr);
 
        /* for each level */
        for (level = cur->bc_nlevels - 1; level >= 0; level--) {
 
        /* Load the root of the btree. */
        level = cur->bc_nlevels - 1;
-       cur->bc_ops->init_ptr_from_cur(cur, &ptr);
+       xfs_btree_init_ptr_from_cur(cur, &ptr);
        error = xfs_btree_lookup_get_block(cur, level, &ptr, &block);
        if (error)
                return error;
 
 void xfs_btree_copy_keys(struct xfs_btree_cur *cur,
                union xfs_btree_key *dst_key,
                const union xfs_btree_key *src_key, int numkeys);
+void xfs_btree_init_ptr_from_cur(struct xfs_btree_cur *cur,
+               union xfs_btree_ptr *ptr);
 
 static inline struct xfs_btree_cur *
 xfs_btree_alloc_cursor(
 
         * error codes for us.
         */
        level = cur->bc_nlevels - 1;
-       cur->bc_ops->init_ptr_from_cur(cur, &ptr);
+       xfs_btree_init_ptr_from_cur(cur, &ptr);
        if (!xchk_btree_ptr_ok(bs, cur->bc_nlevels, &ptr))
                goto out;
        error = xchk_btree_get_block(bs, level, &ptr, &block, &bp);