goto out;
 
        /* Log might have been flushed while we waited for the flush lock */
-       if (gl && !test_bit(GLF_LFLUSH, &gl->gl_flags)) {
-               up_write(&sdp->sd_log_flush_lock);
-               return;
-       }
+       if (gl && !test_bit(GLF_LFLUSH, &gl->gl_flags))
+               goto out;
        trace_gfs2_log_flush(sdp, 1, flags);
 
        if (flags & GFS2_LOG_HEAD_FLUSH_SHUTDOWN)
                if (unlikely (state == SFS_FROZEN))
                        if (gfs2_assert_withdraw_delayed(sdp,
                               !tr->tr_num_buf_new && !tr->tr_num_databuf_new))
-                               goto out;
+                               goto out_withdraw;
        }
 
        if (unlikely(state == SFS_FROZEN))
                if (gfs2_assert_withdraw_delayed(sdp, !sdp->sd_log_num_revoke))
-                       goto out;
+                       goto out_withdraw;
        if (gfs2_assert_withdraw_delayed(sdp,
                        sdp->sd_log_num_revoke == sdp->sd_log_committed_revoke))
-               goto out;
+               goto out_withdraw;
 
        gfs2_ordered_write(sdp);
        if (gfs2_withdrawn(sdp))
-               goto out;
+               goto out_withdraw;
        lops_before_commit(sdp, tr);
        if (gfs2_withdrawn(sdp))
-               goto out;
+               goto out_withdraw;
        gfs2_log_submit_bio(&sdp->sd_log_bio, REQ_OP_WRITE);
        if (gfs2_withdrawn(sdp))
-               goto out;
+               goto out_withdraw;
 
        if (sdp->sd_log_head != sdp->sd_log_flush_head) {
                log_flush_wait(sdp);
                log_write_header(sdp, flags);
        }
        if (gfs2_withdrawn(sdp))
-               goto out;
+               goto out_withdraw;
        lops_after_commit(sdp, tr);
 
        gfs2_log_lock(sdp);
                if (!sdp->sd_log_idle) {
                        empty_ail1_list(sdp);
                        if (gfs2_withdrawn(sdp))
-                               goto out;
+                               goto out_withdraw;
                        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:
-       if (gfs2_withdrawn(sdp)) {
-               trans_drain(tr);
-               /**
-                * If the tr_list is empty, we're withdrawing during a log
-                * flush that targets a transaction, but the transaction was
-                * never queued onto any of the ail lists. Here we add it to
-                * ail1 just so that ail_drain() will find and free it.
-                */
-               spin_lock(&sdp->sd_ail_lock);
-               if (tr && list_empty(&tr->tr_list))
-                       list_add(&tr->tr_list, &sdp->sd_ail1_list);
-               spin_unlock(&sdp->sd_ail_lock);
-               ail_drain(sdp); /* frees all transactions */
-               tr = NULL;
-       }
-
+out_end:
        trace_gfs2_log_flush(sdp, 0, flags);
+out:
        up_write(&sdp->sd_log_flush_lock);
-
        gfs2_trans_free(sdp, tr);
+       if (gfs2_withdrawing(sdp))
+               gfs2_withdraw(sdp);
+       return;
+
+out_withdraw:
+       trans_drain(tr);
+       /**
+        * If the tr_list is empty, we're withdrawing during a log
+        * flush that targets a transaction, but the transaction was
+        * never queued onto any of the ail lists. Here we add it to
+        * ail1 just so that ail_drain() will find and free it.
+        */
+       spin_lock(&sdp->sd_ail_lock);
+       if (tr && list_empty(&tr->tr_list))
+               list_add(&tr->tr_list, &sdp->sd_ail1_list);
+       spin_unlock(&sdp->sd_ail_lock);
+       ail_drain(sdp); /* frees all transactions */
+       tr = NULL;
+       goto out_end;
 }
 
 /**