gfs2_assert(sdp, bd->bd_tr == tr);
 
                if (!buffer_busy(bh)) {
-                       if (!buffer_uptodate(bh) &&
-                           !test_and_set_bit(SDF_AIL1_IO_ERROR,
+                       if (buffer_uptodate(bh)) {
+                               list_move(&bd->bd_ail_st_list,
+                                         &tr->tr_ail2_list);
+                               continue;
+                       }
+                       if (!test_and_set_bit(SDF_AIL1_IO_ERROR,
                                              &sdp->sd_flags)) {
                                gfs2_io_error_bh(sdp, bh);
                                gfs2_withdraw_delayed(sdp);
                        }
-                       list_move(&bd->bd_ail_st_list, &tr->tr_ail2_list);
-                       continue;
                }
 
+               if (gfs2_withdrawn(sdp)) {
+                       gfs2_remove_from_ail(bd);
+                       continue;
+               }
                if (!buffer_dirty(bh))
                        continue;
                if (gl == bd->bd_gl)
                                if (gfs2_ail1_empty(sdp))
                                        break;
                        }
+                       if (gfs2_withdrawn(sdp))
+                               goto out;
                        atomic_dec(&sdp->sd_log_blks_free); /* Adjust for unreserved buffer */
                        trace_gfs2_log_blocks(sdp, -1);
                        log_write_header(sdp, flags);
                        atomic_set(&sdp->sd_freeze_state, SFS_FROZEN);
        }
 
+out:
        trace_gfs2_log_flush(sdp, 0, flags);
        up_write(&sdp->sd_log_flush_lock);