xfs_buf_item_free(bip);
 }
 
-
-/*
- * Add the given log item with its callback to the list of callbacks
- * to be called when the buffer's I/O completes.
- */
-void
-xfs_buf_attach_iodone(
-       struct xfs_buf          *bp,
-       void                    (*cb)(struct xfs_buf *, struct xfs_log_item *),
-       struct xfs_log_item     *lip)
-{
-       ASSERT(xfs_buf_islocked(bp));
-
-       lip->li_cb = cb;
-       list_add_tail(&lip->li_bio_list, &bp->b_li_list);
-}
-
 /*
  * Invoke the error state callback for each log item affected by the failed I/O.
  *
 
 bool   xfs_buf_item_put(struct xfs_buf_log_item *);
 void   xfs_buf_item_log(struct xfs_buf_log_item *, uint, uint);
 bool   xfs_buf_item_dirty_format(struct xfs_buf_log_item *);
-void   xfs_buf_attach_iodone(struct xfs_buf *,
-                             void(*)(struct xfs_buf *, struct xfs_log_item *),
-                             struct xfs_log_item *);
 void   xfs_buf_inode_iodone(struct xfs_buf *);
 void   xfs_buf_dquot_iodone(struct xfs_buf *);
 void   xfs_buf_iodone(struct xfs_buf *);
 
        }
 
        /*
-        * Attach an iodone routine so that we can remove this dquot from the
-        * AIL and release the flush lock once the dquot is synced to disk.
+        * Attach the dquot to the buffer so that we can remove this dquot from
+        * the AIL and release the flush lock once the dquot is synced to disk.
         */
        bp->b_flags |= _XBF_DQUOTS;
-       xfs_buf_attach_iodone(bp, NULL, &dqp->q_logitem.qli_item);
+       list_add_tail(&dqp->q_logitem.qli_item.li_bio_list, &bp->b_li_list);
 
        /*
         * If the buffer is pinned then push on the log so we won't
 
                        xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
                                                &iip->ili_item.li_lsn);
 
-                       xfs_buf_attach_iodone(bp, NULL, &iip->ili_item);
+                       list_add_tail(&iip->ili_item.li_bio_list,
+                                               &bp->b_li_list);
 
                        if (ip != free_ip)
                                xfs_iunlock(ip, XFS_ILOCK_EXCL);
         * the flush lock.
         */
        bp->b_flags |= _XBF_INODES;
-       xfs_buf_attach_iodone(bp, NULL, &iip->ili_item);
+       list_add_tail(&iip->ili_item.li_bio_list, &bp->b_li_list);
 
        /* generate the checksum. */
        xfs_dinode_calc_crc(mp, dip);
 
        unsigned long                   li_flags;       /* misc flags */
        struct xfs_buf                  *li_buf;        /* real buffer pointer */
        struct list_head                li_bio_list;    /* buffer item list */
-       void                            (*li_cb)(struct xfs_buf *,
-                                                struct xfs_log_item *);
-                                                       /* buffer item iodone */
-                                                       /* callback func */
        const struct xfs_item_ops       *li_ops;        /* function list */
 
        /* delayed logging */