test_bit(XFS_LI_FAILED, &lip->li_flags))) {
 
                spin_lock(&ailp->ail_lock);
+               xfs_clear_li_failed(lip);
                if (lip->li_lsn == qip->qli_flush_lsn) {
                        /* xfs_ail_update_finish() drops the AIL lock */
                        tail_lsn = xfs_ail_delete_one(ailp, lip);
                        xfs_ail_update_finish(ailp, tail_lsn);
                } else {
-                       /*
-                        * Clear the failed state since we are about to drop the
-                        * flush lock
-                        */
-                       xfs_clear_li_failed(lip);
                        spin_unlock(&ailp->ail_lock);
                }
        }
 
                /* this is an opencoded batch version of xfs_trans_ail_delete */
                spin_lock(&ailp->ail_lock);
                list_for_each_entry(lip, &tmp, li_bio_list) {
+                       xfs_clear_li_failed(lip);
                        if (lip->li_lsn == INODE_ITEM(lip)->ili_flush_lsn) {
                                xfs_lsn_t lsn = xfs_ail_delete_one(ailp, lip);
                                if (!tail_lsn && lsn)
                                        tail_lsn = lsn;
-                       } else {
-                               xfs_clear_li_failed(lip);
                        }
                }
                xfs_ail_update_finish(ailp, tail_lsn);
 
 
        trace_xfs_ail_delete(lip, mlip->li_lsn, lip->li_lsn);
        xfs_ail_delete(ailp, lip);
-       xfs_clear_li_failed(lip);
        clear_bit(XFS_LI_IN_AIL, &lip->li_flags);
        lip->li_lsn = 0;
 
        }
 
        /* xfs_ail_update_finish() drops the AIL lock */
+       xfs_clear_li_failed(lip);
        tail_lsn = xfs_ail_delete_one(ailp, lip);
        xfs_ail_update_finish(ailp, tail_lsn);
 }