bp->b_iodone = NULL;
                } else {
                        spin_lock(&ailp->xa_lock);
-                       xfs_trans_ail_delete(ailp, (xfs_log_item_t *)bip);
+                       xfs_trans_ail_delete(ailp, lip, SHUTDOWN_LOG_IO_ERROR);
                        xfs_buf_item_relse(bp);
                        ASSERT(bp->b_fspriv == NULL);
                }
         * Either way, AIL is useless if we're forcing a shutdown.
         */
        spin_lock(&ailp->xa_lock);
-       xfs_trans_ail_delete(ailp, lip);
+       xfs_trans_ail_delete(ailp, lip, SHUTDOWN_CORRUPT_INCORE);
        xfs_buf_item_free(BUF_ITEM(lip));
 }
 
                /* xfs_trans_ail_delete() drops the AIL lock. */
                spin_lock(&ailp->xa_lock);
                if (lip->li_lsn == qip->qli_flush_lsn)
-                       xfs_trans_ail_delete(ailp, lip);
+                       xfs_trans_ail_delete(ailp, lip, SHUTDOWN_CORRUPT_INCORE);
                else
                        spin_unlock(&ailp->xa_lock);
        }
 
                spin_lock(&mp->m_ail->xa_lock);
                if (lip->li_flags & XFS_LI_IN_AIL)
-                       xfs_trans_ail_delete(mp->m_ail, lip);
+                       xfs_trans_ail_delete(mp->m_ail, lip,
+                                            SHUTDOWN_CORRUPT_INCORE);
                else
                        spin_unlock(&mp->m_ail->xa_lock);
                error = XFS_ERROR(EIO);
 
         * xfs_trans_ail_delete() drops the AIL lock.
         */
        spin_lock(&ailp->xa_lock);
-       xfs_trans_ail_delete(ailp, (xfs_log_item_t *)qfs);
+       xfs_trans_ail_delete(ailp, &qfs->qql_item, SHUTDOWN_LOG_IO_ERROR);
 
        kmem_free(qfs);
        kmem_free(qfe);
 
        if (!test_and_clear_bit(XFS_EFI_COMMITTED, &efip->efi_flags)) {
                spin_lock(&ailp->xa_lock);
                /* xfs_trans_ail_delete() drops the AIL lock. */
-               xfs_trans_ail_delete(ailp, &efip->efi_item);
+               xfs_trans_ail_delete(ailp, &efip->efi_item,
+                                    SHUTDOWN_LOG_IO_ERROR);
                xfs_efi_item_free(efip);
        }
 }
 
        /*
         * Unlocks the flush lock
         */
-       xfs_iflush_abort(iq);
+       xfs_iflush_abort(iq, false);
        kmem_free(ilist);
        xfs_perag_put(pag);
        return XFS_ERROR(EFSCORRUPTED);
        /*
         * Unlocks the flush lock
         */
-       xfs_iflush_abort(ip);
+       xfs_iflush_abort(ip, false);
        return error;
 }
 
 
                        ASSERT(i <= need_ail);
                }
                /* xfs_trans_ail_delete_bulk() drops the AIL lock. */
-               xfs_trans_ail_delete_bulk(ailp, log_items, i);
+               xfs_trans_ail_delete_bulk(ailp, log_items, i,
+                                         SHUTDOWN_CORRUPT_INCORE);
        }
 
 
 }
 
 /*
- * This is the inode flushing abort routine.  It is called
- * from xfs_iflush when the filesystem is shutting down to clean
- * up the inode state.
- * It is responsible for removing the inode item
- * from the AIL if it has not been re-logged, and unlocking the inode's
- * flush lock.
+ * This is the inode flushing abort routine.  It is called from xfs_iflush when
+ * the filesystem is shutting down to clean up the inode state.  It is
+ * responsible for removing the inode item from the AIL if it has not been
+ * re-logged, and unlocking the inode's flush lock.
  */
 void
 xfs_iflush_abort(
-       xfs_inode_t             *ip)
+       xfs_inode_t             *ip,
+       bool                    stale)
 {
        xfs_inode_log_item_t    *iip = ip->i_itemp;
 
                        spin_lock(&ailp->xa_lock);
                        if (iip->ili_item.li_flags & XFS_LI_IN_AIL) {
                                /* xfs_trans_ail_delete() drops the AIL lock. */
-                               xfs_trans_ail_delete(ailp, (xfs_log_item_t *)iip);
+                               xfs_trans_ail_delete(ailp, &iip->ili_item,
+                                               stale ?
+                                                    SHUTDOWN_LOG_IO_ERROR :
+                                                    SHUTDOWN_CORRUPT_INCORE);
                        } else
                                spin_unlock(&ailp->xa_lock);
                }
        struct xfs_buf          *bp,
        struct xfs_log_item     *lip)
 {
-       xfs_iflush_abort(INODE_ITEM(lip)->ili_inode);
+       xfs_iflush_abort(INODE_ITEM(lip)->ili_inode, true);
 }
 
 /*
 
 extern void xfs_inode_item_destroy(struct xfs_inode *);
 extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *);
 extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *);
-extern void xfs_iflush_abort(struct xfs_inode *);
+extern void xfs_iflush_abort(struct xfs_inode *, bool);
 extern int xfs_inode_item_format_convert(xfs_log_iovec_t *,
                                         xfs_inode_log_format_t *);
 
 
                                 * xfs_trans_ail_delete() drops the
                                 * AIL lock.
                                 */
-                               xfs_trans_ail_delete(ailp, lip);
+                               xfs_trans_ail_delete(ailp, lip,
+                                                    SHUTDOWN_CORRUPT_INCORE);
                                xfs_efi_item_free(efip);
                                spin_lock(&ailp->xa_lock);
                                break;
 
                goto reclaim;
        if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
                xfs_iunpin_wait(ip);
-               xfs_iflush_abort(ip);
+               xfs_iflush_abort(ip, false);
                goto reclaim;
        }
        if (xfs_ipincount(ip)) {
 
 xfs_trans_ail_delete_bulk(
        struct xfs_ail          *ailp,
        struct xfs_log_item     **log_items,
-       int                     nr_items) __releases(ailp->xa_lock)
+       int                     nr_items,
+       int                     shutdown_type) __releases(ailp->xa_lock)
 {
        xfs_log_item_t          *mlip;
        int                     mlip_changed = 0;
                                xfs_alert_tag(mp, XFS_PTAG_AILDELETE,
                "%s: attempting to delete a log item that is not in the AIL",
                                                __func__);
-                               xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
+                               xfs_force_shutdown(mp, shutdown_type);
                        }
                        return;
                }
 
 }
 
 void   xfs_trans_ail_delete_bulk(struct xfs_ail *ailp,
-                               struct xfs_log_item **log_items, int nr_items)
+                               struct xfs_log_item **log_items, int nr_items,
+                               int shutdown_type)
                                __releases(ailp->xa_lock);
 static inline void
 xfs_trans_ail_delete(
        struct xfs_ail  *ailp,
-       xfs_log_item_t  *lip) __releases(ailp->xa_lock)
+       xfs_log_item_t  *lip,
+       int             shutdown_type) __releases(ailp->xa_lock)
 {
-       xfs_trans_ail_delete_bulk(ailp, &lip, 1);
+       xfs_trans_ail_delete_bulk(ailp, &lip, 1, shutdown_type);
 }
 
 void                   xfs_ail_push(struct xfs_ail *, xfs_lsn_t);