dp = args->dp;
        args->blkno = 0;
        error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp,
-                                            XFS_ATTR_FORK);
+                                            XFS_ATTR_FORK, NULL);
        if (error)
                return(error);
        ASSERT(bp != NULL);
                 * remove the "old" attr from that block (neat, huh!)
                 */
                error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1,
-                                                    &bp, XFS_ATTR_FORK);
+                                                    &bp, XFS_ATTR_FORK, NULL);
                if (error)
                        return(error);
                ASSERT(bp != NULL);
        dp = args->dp;
        args->blkno = 0;
        error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp,
-                                            XFS_ATTR_FORK);
+                                            XFS_ATTR_FORK, NULL);
        if (error) {
                return(error);
        }
 
        args->blkno = 0;
        error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp,
-                                            XFS_ATTR_FORK);
+                                            XFS_ATTR_FORK, NULL);
        if (error)
                return(error);
        ASSERT(bp != NULL);
        trace_xfs_attr_leaf_list(context);
 
        context->cursor->blkno = 0;
-       error = xfs_da_read_buf(NULL, context->dp, 0, -1, &bp, XFS_ATTR_FORK);
+       error = xfs_da_read_buf(NULL, context->dp, 0, -1, &bp, XFS_ATTR_FORK,
+                               NULL);
        if (error)
                return XFS_ERROR(error);
        ASSERT(bp != NULL);
                state->path.blk[0].bp = NULL;
 
                error = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp,
-                                                    XFS_ATTR_FORK);
+                                                    XFS_ATTR_FORK, NULL);
                if (error)
                        goto out;
                ASSERT((((xfs_attr_leafblock_t *)bp->b_addr)->hdr.info.magic) ==
                        error = xfs_da_read_buf(state->args->trans,
                                                state->args->dp,
                                                blk->blkno, blk->disk_blkno,
-                                               &blk->bp, XFS_ATTR_FORK);
+                                               &blk->bp, XFS_ATTR_FORK, NULL);
                        if (error)
                                return(error);
                } else {
                        error = xfs_da_read_buf(state->args->trans,
                                                state->args->dp,
                                                blk->blkno, blk->disk_blkno,
-                                               &blk->bp, XFS_ATTR_FORK);
+                                               &blk->bp, XFS_ATTR_FORK, NULL);
                        if (error)
                                return(error);
                } else {
        bp = NULL;
        if (cursor->blkno > 0) {
                error = xfs_da_read_buf(NULL, context->dp, cursor->blkno, -1,
-                                             &bp, XFS_ATTR_FORK);
+                                             &bp, XFS_ATTR_FORK, NULL);
                if ((error != 0) && (error != EFSCORRUPTED))
                        return(error);
                if (bp) {
                for (;;) {
                        error = xfs_da_read_buf(NULL, context->dp,
                                                      cursor->blkno, -1, &bp,
-                                                     XFS_ATTR_FORK);
+                                                     XFS_ATTR_FORK, NULL);
                        if (error)
                                return(error);
                        if (unlikely(bp == NULL)) {
                cursor->blkno = be32_to_cpu(leaf->hdr.info.forw);
                xfs_trans_brelse(NULL, bp);
                error = xfs_da_read_buf(NULL, context->dp, cursor->blkno, -1,
-                                             &bp, XFS_ATTR_FORK);
+                                             &bp, XFS_ATTR_FORK, NULL);
                if (error)
                        return(error);
                if (unlikely((bp == NULL))) {
 
        if (error)
                goto out;
        error = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp1,
-                                            XFS_ATTR_FORK);
+                                            XFS_ATTR_FORK, NULL);
        if (error)
                goto out;
        ASSERT(bp1 != NULL);
                if (blkno == 0)
                        continue;
                error = xfs_da_read_buf(state->args->trans, state->args->dp,
-                                       blkno, -1, &bp, XFS_ATTR_FORK);
+                                       blkno, -1, &bp, XFS_ATTR_FORK, NULL);
                if (error)
                        return(error);
                ASSERT(bp != NULL);
         * Set up the operation.
         */
        error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp,
-                                            XFS_ATTR_FORK);
+                                            XFS_ATTR_FORK, NULL);
        if (error) {
                return(error);
        }
         * Set up the operation.
         */
        error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp,
-                                            XFS_ATTR_FORK);
+                                            XFS_ATTR_FORK, NULL);
        if (error) {
                return(error);
        }
         * Read the block containing the "old" attr
         */
        error = xfs_da_read_buf(args->trans, args->dp, args->blkno, -1, &bp1,
-                                            XFS_ATTR_FORK);
+                                            XFS_ATTR_FORK, NULL);
        if (error) {
                return(error);
        }
         */
        if (args->blkno2 != args->blkno) {
                error = xfs_da_read_buf(args->trans, args->dp, args->blkno2,
-                                       -1, &bp2, XFS_ATTR_FORK);
+                                       -1, &bp2, XFS_ATTR_FORK, NULL);
                if (error) {
                        return(error);
                }
         * the extents in reverse order the extent containing
         * block 0 must still be there.
         */
-       error = xfs_da_read_buf(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK);
+       error = xfs_da_read_buf(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK, NULL);
        if (error)
                return(error);
        blkno = XFS_BUF_ADDR(bp);
                 * before we come back to this one.
                 */
                error = xfs_da_read_buf(*trans, dp, child_fsb, -2, &child_bp,
-                                               XFS_ATTR_FORK);
+                                               XFS_ATTR_FORK, NULL);
                if (error)
                        return(error);
                if (child_bp) {
                 */
                if ((i+1) < count) {
                        error = xfs_da_read_buf(*trans, dp, 0, parent_blkno,
-                               &bp, XFS_ATTR_FORK);
+                               &bp, XFS_ATTR_FORK, NULL);
                        if (error)
                                return(error);
                        child_fsb = be32_to_cpu(node->btree[i+1].before);
 
        child = be32_to_cpu(oldroot->btree[0].before);
        ASSERT(child != 0);
        error = xfs_da_read_buf(args->trans, args->dp, child, -1, &bp,
-                                            args->whichfork);
+                                            args->whichfork, NULL);
        if (error)
                return(error);
        ASSERT(bp != NULL);
                if (blkno == 0)
                        continue;
                error = xfs_da_read_buf(state->args->trans, state->args->dp,
-                                       blkno, -1, &bp, state->args->whichfork);
+                                       blkno, -1, &bp, state->args->whichfork,
+                                       NULL);
                if (error)
                        return(error);
                ASSERT(bp != NULL);
                 */
                blk->blkno = blkno;
                error = xfs_da_read_buf(args->trans, args->dp, blkno,
-                                       -1, &blk->bp, args->whichfork);
+                                       -1, &blk->bp, args->whichfork, NULL);
                if (error) {
                        blk->blkno = 0;
                        state->path.active--;
                if (old_info->back) {
                        error = xfs_da_read_buf(args->trans, args->dp,
                                                be32_to_cpu(old_info->back),
-                                               -1, &bp, args->whichfork);
+                                               -1, &bp, args->whichfork, NULL);
                        if (error)
                                return(error);
                        ASSERT(bp != NULL);
                if (old_info->forw) {
                        error = xfs_da_read_buf(args->trans, args->dp,
                                                be32_to_cpu(old_info->forw),
-                                               -1, &bp, args->whichfork);
+                                               -1, &bp, args->whichfork, NULL);
                        if (error)
                                return(error);
                        ASSERT(bp != NULL);
                if (drop_info->back) {
                        error = xfs_da_read_buf(args->trans, args->dp,
                                                be32_to_cpu(drop_info->back),
-                                               -1, &bp, args->whichfork);
+                                               -1, &bp, args->whichfork, NULL);
                        if (error)
                                return(error);
                        ASSERT(bp != NULL);
                if (drop_info->forw) {
                        error = xfs_da_read_buf(args->trans, args->dp,
                                                be32_to_cpu(drop_info->forw),
-                                               -1, &bp, args->whichfork);
+                                               -1, &bp, args->whichfork, NULL);
                        if (error)
                                return(error);
                        ASSERT(bp != NULL);
                 */
                blk->blkno = blkno;
                error = xfs_da_read_buf(args->trans, args->dp, blkno, -1,
-                                                    &blk->bp, args->whichfork);
+                                       &blk->bp, args->whichfork, NULL);
                if (error)
                        return(error);
                ASSERT(blk->bp != NULL);
         * Read the last block in the btree space.
         */
        last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs;
-       if ((error = xfs_da_read_buf(tp, ip, last_blkno, -1, &last_buf, w)))
+       error = xfs_da_read_buf(tp, ip, last_blkno, -1, &last_buf, w, NULL);
+       if (error)
                return error;
        /*
         * Copy the last block into the dead buffer and log it.
         * If the moved block has a left sibling, fix up the pointers.
         */
        if ((sib_blkno = be32_to_cpu(dead_info->back))) {
-               if ((error = xfs_da_read_buf(tp, ip, sib_blkno, -1, &sib_buf, w)))
+               error = xfs_da_read_buf(tp, ip, sib_blkno, -1, &sib_buf, w,
+                                       NULL);
+               if (error)
                        goto done;
                sib_info = sib_buf->b_addr;
                if (unlikely(
         * If the moved block has a right sibling, fix up the pointers.
         */
        if ((sib_blkno = be32_to_cpu(dead_info->forw))) {
-               if ((error = xfs_da_read_buf(tp, ip, sib_blkno, -1, &sib_buf, w)))
+               error = xfs_da_read_buf(tp, ip, sib_blkno, -1, &sib_buf, w,
+                                       NULL);
+               if (error)
                        goto done;
                sib_info = sib_buf->b_addr;
                if (unlikely(
         * Walk down the tree looking for the parent of the moved block.
         */
        for (;;) {
-               if ((error = xfs_da_read_buf(tp, ip, par_blkno, -1, &par_buf, w)))
+               error = xfs_da_read_buf(tp, ip, par_blkno, -1, &par_buf, w,
+                                       NULL);
+               if (error)
                        goto done;
                par_node = par_buf->b_addr;
                if (unlikely(par_node->hdr.info.magic !=
                        error = XFS_ERROR(EFSCORRUPTED);
                        goto done;
                }
-               if ((error = xfs_da_read_buf(tp, ip, par_blkno, -1, &par_buf, w)))
+               error = xfs_da_read_buf(tp, ip, par_blkno, -1, &par_buf, w,
+                                       NULL);
+               if (error)
                        goto done;
                par_node = par_buf->b_addr;
                if (unlikely(
        xfs_dablk_t             bno,
        xfs_daddr_t             mappedbno,
        struct xfs_buf          **bpp,
-       int                     whichfork)
+       int                     whichfork,
+       xfs_buf_iodone_t        verifier)
 {
        struct xfs_buf          *bp;
        struct xfs_buf_map      map;
 
        error = xfs_trans_read_buf_map(dp->i_mount, trans,
                                        dp->i_mount->m_ddev_targp,
-                                       mapp, nmap, 0, &bp, NULL);
+                                       mapp, nmap, 0, &bp, verifier);
        if (error)
                goto out_free;
 
        struct xfs_trans        *trans,
        struct xfs_inode        *dp,
        xfs_dablk_t             bno,
-       int                     whichfork)
+       int                     whichfork,
+       xfs_buf_iodone_t        verifier)
 {
        xfs_daddr_t             mappedbno = -1;
        struct xfs_buf_map      map;
 
 #ifndef __XFS_DA_BTREE_H__
 #define        __XFS_DA_BTREE_H__
 
-struct xfs_buf;
 struct xfs_bmap_free;
 struct xfs_inode;
 struct xfs_mount;
                              struct xfs_buf **bp, int whichfork);
 int    xfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp,
                               xfs_dablk_t bno, xfs_daddr_t mappedbno,
-                              struct xfs_buf **bpp, int whichfork);
+                              struct xfs_buf **bpp, int whichfork,
+                              xfs_buf_iodone_t verifier);
 xfs_daddr_t    xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp,
-                       xfs_dablk_t bno, int whichfork);
+                               xfs_dablk_t bno, int whichfork,
+                               xfs_buf_iodone_t verifier);
 int    xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
                                          struct xfs_buf *dead_buf);
 
 
        /*
         * Read the (one and only) directory block into dabuf bp.
         */
-       if ((error =
-           xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &bp, XFS_DATA_FORK))) {
+       error = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &bp,
+                               XFS_DATA_FORK, NULL);
+       if (error)
                return error;
-       }
        ASSERT(bp != NULL);
        hdr = bp->b_addr;
        /*
         * Can't read the block, give up, else get dabuf in bp.
         */
        error = xfs_da_read_buf(NULL, dp, mp->m_dirdatablk, -1,
-                               &bp, XFS_DATA_FORK);
+                               &bp, XFS_DATA_FORK, NULL);
        if (error)
                return error;
 
        /*
         * Read the buffer, return error if we can't get it.
         */
-       if ((error =
-           xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &bp, XFS_DATA_FORK))) {
+       error = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &bp,
+                               XFS_DATA_FORK, NULL);
+       if (error)
                return error;
-       }
        ASSERT(bp != NULL);
        hdr = bp->b_addr;
        xfs_dir2_data_check(dp, bp);
        /*
         * Read the data block if we don't already have it, give up if it fails.
         */
-       if (dbp == NULL &&
-           (error = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &dbp,
-                   XFS_DATA_FORK))) {
-               return error;
+       if (!dbp) {
+               error = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &dbp,
+                                       XFS_DATA_FORK, NULL);
+               if (error)
+                       return error;
        }
        hdr = dbp->b_addr;
        ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC));
 
         * Read the leaf block.
         */
        error = xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp,
-               XFS_DATA_FORK);
-       if (error) {
+                               XFS_DATA_FORK, NULL);
+       if (error)
                return error;
-       }
        ASSERT(lbp != NULL);
        /*
         * Look up the entry by hash value and name.
         * Just read that one in.
         */
        else {
-               if ((error =
-                   xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, use_block),
-                           -1, &dbp, XFS_DATA_FORK))) {
+               error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, use_block),
+                                       -1, &dbp, XFS_DATA_FORK, NULL);
+               if (error) {
                        xfs_trans_brelse(tp, lbp);
                        return error;
                }
        error = xfs_da_read_buf(NULL, dp, map->br_startoff,
                        map->br_blockcount >= mp->m_dirblkfsbs ?
                            XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1,
-                       &bp, XFS_DATA_FORK);
+                       &bp, XFS_DATA_FORK, NULL);
 
        /*
         * Should just skip over the data block instead of giving up.
                        xfs_da_reada_buf(NULL, dp,
                                        map[mip->ra_index].br_startoff +
                                                        mip->ra_offset,
-                                       XFS_DATA_FORK);
+                                       XFS_DATA_FORK, NULL);
                        mip->ra_current = i;
                }
 
         * Read the leaf block into the buffer.
         */
        error = xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp,
-                                                       XFS_DATA_FORK);
+                                                       XFS_DATA_FORK, NULL);
        if (error)
                return error;
        *lbpp = lbp;
                                xfs_trans_brelse(tp, dbp);
                        error = xfs_da_read_buf(tp, dp,
                                                xfs_dir2_db_to_da(mp, newdb),
-                                               -1, &dbp, XFS_DATA_FORK);
+                                               -1, &dbp, XFS_DATA_FORK, NULL);
                        if (error) {
                                xfs_trans_brelse(tp, lbp);
                                return error;
                        xfs_trans_brelse(tp, dbp);
                        error = xfs_da_read_buf(tp, dp,
                                                xfs_dir2_db_to_da(mp, cidb),
-                                               -1, &dbp, XFS_DATA_FORK);
+                                               -1, &dbp, XFS_DATA_FORK, NULL);
                        if (error) {
                                xfs_trans_brelse(tp, lbp);
                                return error;
        /*
         * Read the offending data block.  We need its buffer.
         */
-       if ((error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp,
-                       XFS_DATA_FORK))) {
+       error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp,
+                               XFS_DATA_FORK, NULL);
+       if (error)
                return error;
-       }
 
        leaf = lbp->b_addr;
        ltp = xfs_dir2_leaf_tail_p(mp, leaf);
        /*
         * Read the freespace block.
         */
-       if ((error = xfs_da_read_buf(tp, dp, mp->m_dirfreeblk, -1, &fbp,
-                       XFS_DATA_FORK))) {
+       error = xfs_da_read_buf(tp, dp,  mp->m_dirfreeblk, -1, &fbp,
+                               XFS_DATA_FORK, NULL);
+       if (error)
                return error;
-       }
        free = fbp->b_addr;
        ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
        ASSERT(!free->hdr.firstdb);
 
                                 */
                                error = xfs_da_read_buf(tp, dp,
                                                xfs_dir2_db_to_da(mp, newfdb),
-                                               -1, &curbp, XFS_DATA_FORK);
+                                               -1, &curbp, XFS_DATA_FORK, NULL);
                                if (error)
                                        return error;
                                free = curbp->b_addr;
                        } else {
                                error = xfs_da_read_buf(tp, dp,
                                                xfs_dir2_db_to_da(mp, newdb),
-                                               -1, &curbp, XFS_DATA_FORK);
+                                               -1, &curbp, XFS_DATA_FORK, NULL);
                                if (error)
                                        return error;
                        }
                 * read in the free block.
                 */
                fdb = xfs_dir2_db_to_fdb(mp, db);
-               if ((error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb),
-                               -1, &fbp, XFS_DATA_FORK))) {
+               error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, fdb),
+                                       -1, &fbp, XFS_DATA_FORK, NULL);
+               if (error)
                        return error;
-               }
                free = fbp->b_addr;
                ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
                ASSERT(be32_to_cpu(free->hdr.firstdb) ==
                /*
                 * Read the sibling leaf block.
                 */
-               if ((error =
-                   xfs_da_read_buf(state->args->trans, state->args->dp, blkno,
-                           -1, &bp, XFS_DATA_FORK))) {
+               error = xfs_da_read_buf(state->args->trans, state->args->dp,
+                                       blkno, -1, &bp, XFS_DATA_FORK, NULL);
+               if (error)
                        return error;
-               }
                ASSERT(bp != NULL);
                /*
                 * Count bytes in the two blocks combined.
                         * This should be really rare, so there's no reason
                         * to avoid it.
                         */
-                       if ((error = xfs_da_read_buf(tp, dp,
-                                       xfs_dir2_db_to_da(mp, fbno), -2, &fbp,
-                                       XFS_DATA_FORK))) {
+                       error = xfs_da_read_buf(tp, dp,
+                                               xfs_dir2_db_to_da(mp, fbno), -2,
+                                               &fbp, XFS_DATA_FORK, NULL);
+                       if (error)
                                return error;
-                       }
-                       if (unlikely(fbp == NULL)) {
+                       if (!fbp)
                                continue;
-                       }
                        free = fbp->b_addr;
                        ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));
                        findex = 0;
                 * that was just allocated.
                 */
                fbno = xfs_dir2_db_to_fdb(mp, dbno);
-               if (unlikely(error = xfs_da_read_buf(tp, dp,
-                               xfs_dir2_db_to_da(mp, fbno), -2, &fbp,
-                               XFS_DATA_FORK)))
+               error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, fbno), -2,
+                                       &fbp, XFS_DATA_FORK, NULL);
+               if (error)
                        return error;
 
                /*
                 * Read the data block in.
                 */
                error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, dbno),
-                               -1, &dbp, XFS_DATA_FORK);
+                                       -1, &dbp, XFS_DATA_FORK, NULL);
                if (error)
                        return error;
                hdr = dbp->b_addr;
        /*
         * Read the freespace block.
         */
-       if (unlikely(error = xfs_da_read_buf(tp, dp, (xfs_dablk_t)fo, -2, &bp,
-                       XFS_DATA_FORK))) {
+       error = xfs_da_read_buf(tp, dp, (xfs_dablk_t)fo, -2, &bp,
+                               XFS_DATA_FORK, NULL);
+       if (error)
                return error;
-       }
-
        /*
         * There can be holes in freespace.  If fo is a hole, there's
         * nothing to do.
 
         */
        mode = xfs_ilock_map_shared(ip);
        if (ip->i_d.di_nextents > 0)
-               xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK);
+               xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK, NULL);
        xfs_iunlock(ip, mode);
        return 0;
 }