#include "xfs_bit.h"
 #include "xfs_mount.h"
 #include "xfs_trans.h"
+#include "xfs_trans_priv.h"
 #include "xfs_buf_item.h"
 #include "xfs_inode.h"
 #include "xfs_inode_item.h"
        xfs_buf_item_free(bip);
 }
 
-/*
- * Invoke the error state callback for each log item affected by the failed I/O.
- *
- * If a metadata buffer write fails with a non-permanent error, the buffer is
- * eventually resubmitted and so the completion callbacks are not run. The error
- * state may need to be propagated to the log items attached to the buffer,
- * however, so the next AIL push of the item knows hot to handle it correctly.
- */
-STATIC void
-xfs_buf_do_callbacks_fail(
-       struct xfs_buf          *bp)
-{
-       struct xfs_ail          *ailp = bp->b_mount->m_ail;
-       struct xfs_log_item     *lip;
-
-       /*
-        * Buffer log item errors are handled directly by xfs_buf_item_push()
-        * and xfs_buf_iodone_callback_error, and they have no IO error
-        * callbacks. Check only for items in b_li_list.
-        */
-       if (list_empty(&bp->b_li_list))
-               return;
-
-       spin_lock(&ailp->ail_lock);
-       list_for_each_entry(lip, &bp->b_li_list, li_bio_list) {
-               if (lip->li_ops->iop_error)
-                       lip->li_ops->iop_error(lip, bp);
-       }
-       spin_unlock(&ailp->ail_lock);
-}
-
 /*
  * Decide if we're going to retry the write after a failure, and prepare
  * the buffer for retrying the write.
        struct xfs_buf          *bp)
 {
        if (bp->b_error) {
+               struct xfs_log_item *lip;
                int ret = xfs_buf_iodone_error(bp);
 
                if (ret == XBF_IOERROR_FINISH)
                if (ret == XBF_IOERROR_DONE)
                        return;
                ASSERT(ret == XBF_IOERROR_FAIL);
-               xfs_buf_do_callbacks_fail(bp);
+               spin_lock(&bp->b_mount->m_ail->ail_lock);
+               list_for_each_entry(lip, &bp->b_li_list, li_bio_list) {
+                       xfs_set_li_failed(lip, bp);
+               }
+               spin_unlock(&bp->b_mount->m_ail->ail_lock);
                xfs_buf_ioerror(bp, 0);
                xfs_buf_relse(bp);
                return;
        struct xfs_buf          *bp)
 {
        if (bp->b_error) {
+               struct xfs_log_item *lip;
                int ret = xfs_buf_iodone_error(bp);
 
                if (ret == XBF_IOERROR_FINISH)
                if (ret == XBF_IOERROR_DONE)
                        return;
                ASSERT(ret == XBF_IOERROR_FAIL);
-               xfs_buf_do_callbacks_fail(bp);
+               spin_lock(&bp->b_mount->m_ail->ail_lock);
+               list_for_each_entry(lip, &bp->b_li_list, li_bio_list) {
+                       xfs_set_li_failed(lip, bp);
+               }
+               spin_unlock(&bp->b_mount->m_ail->ail_lock);
                xfs_buf_ioerror(bp, 0);
                xfs_buf_relse(bp);
                return;
                if (ret == XBF_IOERROR_DONE)
                        return;
                ASSERT(ret == XBF_IOERROR_FAIL);
-               xfs_buf_do_callbacks_fail(bp);
+               ASSERT(list_empty(&bp->b_li_list));
                xfs_buf_ioerror(bp, 0);
                xfs_buf_relse(bp);
                return;
 
        wait_event(dqp->q_pinwait, (atomic_read(&dqp->q_pincount) == 0));
 }
 
-/*
- * Callback used to mark a buffer with XFS_LI_FAILED when items in the buffer
- * have been failed during writeback
- *
- * this informs the AIL that the dquot is already flush locked on the next push,
- * and acquires a hold on the buffer to ensure that it isn't reclaimed before
- * dirty data makes it to disk.
- */
-STATIC void
-xfs_dquot_item_error(
-       struct xfs_log_item     *lip,
-       struct xfs_buf          *bp)
-{
-       ASSERT(!completion_done(&DQUOT_ITEM(lip)->qli_dquot->q_flush));
-       xfs_set_li_failed(lip, bp);
-}
-
 STATIC uint
 xfs_qm_dquot_logitem_push(
        struct xfs_log_item     *lip,
        .iop_release    = xfs_qm_dquot_logitem_release,
        .iop_committing = xfs_qm_dquot_logitem_committing,
        .iop_push       = xfs_qm_dquot_logitem_push,
-       .iop_error      = xfs_dquot_item_error
 };
 
 /*
 
                wake_up_bit(&ip->i_flags, __XFS_IPINNED_BIT);
 }
 
-/*
- * Callback used to mark a buffer with XFS_LI_FAILED when items in the buffer
- * have been failed during writeback
- *
- * This informs the AIL that the inode is already flush locked on the next push,
- * and acquires a hold on the buffer to ensure that it isn't reclaimed before
- * dirty data makes it to disk.
- */
-STATIC void
-xfs_inode_item_error(
-       struct xfs_log_item     *lip,
-       struct xfs_buf          *bp)
-{
-       ASSERT(xfs_isiflocked(INODE_ITEM(lip)->ili_inode));
-       xfs_set_li_failed(lip, bp);
-}
-
 STATIC uint
 xfs_inode_item_push(
        struct xfs_log_item     *lip,
        .iop_committed  = xfs_inode_item_committed,
        .iop_push       = xfs_inode_item_push,
        .iop_committing = xfs_inode_item_committing,
-       .iop_error      = xfs_inode_item_error
 };