gfs2: clear ail1 list when gfs2 withdraws
[linux-2.6-microblaze.git] / fs / gfs2 / log.c
index d1ab041..9ebec6f 100644 (file)
@@ -103,16 +103,22 @@ __acquires(&sdp->sd_ail_lock)
                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)
@@ -859,6 +865,8 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
                                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);
@@ -871,6 +879,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
                        atomic_set(&sdp->sd_freeze_state, SFS_FROZEN);
        }
 
+out:
        trace_gfs2_log_flush(sdp, 0, flags);
        up_write(&sdp->sd_log_flush_lock);