xfs_clear_li_failed(blip);
                        }
                }
-
-               if (mlip_changed) {
-                       if (!XFS_FORCED_SHUTDOWN(ailp->ail_mount))
-                               xlog_assign_tail_lsn_locked(ailp->ail_mount);
-                       if (list_empty(&ailp->ail_head))
-                               wake_up_all(&ailp->ail_empty);
-               }
-               spin_unlock(&ailp->ail_lock);
-
-               if (mlip_changed)
-                       xfs_log_space_wake(ailp->ail_mount);
+               xfs_ail_update_finish(ailp, mlip_changed);
        }
 
        /*
 
        finish_wait(&ailp->ail_empty, &wait);
 }
 
+void
+xfs_ail_update_finish(
+       struct xfs_ail          *ailp,
+       bool                    do_tail_update) __releases(ailp->ail_lock)
+{
+       struct xfs_mount        *mp = ailp->ail_mount;
+
+       if (!do_tail_update) {
+               spin_unlock(&ailp->ail_lock);
+               return;
+       }
+
+       if (!XFS_FORCED_SHUTDOWN(mp))
+               xlog_assign_tail_lsn_locked(mp);
+
+       if (list_empty(&ailp->ail_head))
+               wake_up_all(&ailp->ail_empty);
+       spin_unlock(&ailp->ail_lock);
+       xfs_log_space_wake(mp);
+}
+
 /*
  * xfs_trans_ail_update - bulk AIL insertion operation.
  *
        if (!list_empty(&tmp))
                xfs_ail_splice(ailp, cur, &tmp, lsn);
 
-       if (mlip_changed) {
-               if (!XFS_FORCED_SHUTDOWN(ailp->ail_mount))
-                       xlog_assign_tail_lsn_locked(ailp->ail_mount);
-               spin_unlock(&ailp->ail_lock);
-
-               xfs_log_space_wake(ailp->ail_mount);
-       } else {
-               spin_unlock(&ailp->ail_lock);
-       }
+       xfs_ail_update_finish(ailp, mlip_changed);
 }
 
 bool
 xfs_trans_ail_delete(
        struct xfs_ail          *ailp,
        struct xfs_log_item     *lip,
-       int                     shutdown_type) __releases(ailp->ail_lock)
+       int                     shutdown_type)
 {
        struct xfs_mount        *mp = ailp->ail_mount;
-       bool                    mlip_changed;
+       bool                    need_update;
 
        if (!test_bit(XFS_LI_IN_AIL, &lip->li_flags)) {
                spin_unlock(&ailp->ail_lock);
                return;
        }
 
-       mlip_changed = xfs_ail_delete_one(ailp, lip);
-       if (mlip_changed) {
-               if (!XFS_FORCED_SHUTDOWN(mp))
-                       xlog_assign_tail_lsn_locked(mp);
-               if (list_empty(&ailp->ail_head))
-                       wake_up_all(&ailp->ail_empty);
-       }
-
-       spin_unlock(&ailp->ail_lock);
-       if (mlip_changed)
-               xfs_log_space_wake(ailp->ail_mount);
+       need_update = xfs_ail_delete_one(ailp, lip);
+       xfs_ail_update_finish(ailp, need_update);
 }
 
 int
 
 }
 
 bool xfs_ail_delete_one(struct xfs_ail *ailp, struct xfs_log_item *lip);
+void xfs_ail_update_finish(struct xfs_ail *ailp, bool do_tail_update)
+                       __releases(ailp->ail_lock);
 void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip,
-               int shutdown_type) __releases(ailp->ail_lock);
+               int shutdown_type);
 
 static inline void
 xfs_trans_ail_remove(