diff options
Diffstat (limited to 'fs/gfs2/lops.c')
-rw-r--r-- | fs/gfs2/lops.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index bf33f822058d..51d27f00ebb4 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c | |||
@@ -51,8 +51,10 @@ static void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh) | |||
51 | /* If this buffer is in the AIL and it has already been written | 51 | /* If this buffer is in the AIL and it has already been written |
52 | * to in-place disk block, remove it from the AIL. | 52 | * to in-place disk block, remove it from the AIL. |
53 | */ | 53 | */ |
54 | spin_lock(&sdp->sd_ail_lock); | ||
54 | if (bd->bd_ail) | 55 | if (bd->bd_ail) |
55 | list_move(&bd->bd_ail_st_list, &bd->bd_ail->ai_ail2_list); | 56 | list_move(&bd->bd_ail_st_list, &bd->bd_ail->ai_ail2_list); |
57 | spin_unlock(&sdp->sd_ail_lock); | ||
56 | get_bh(bh); | 58 | get_bh(bh); |
57 | atomic_inc(&sdp->sd_log_pinned); | 59 | atomic_inc(&sdp->sd_log_pinned); |
58 | trace_gfs2_pin(bd, 1); | 60 | trace_gfs2_pin(bd, 1); |
@@ -80,7 +82,7 @@ static void gfs2_unpin(struct gfs2_sbd *sdp, struct buffer_head *bh, | |||
80 | mark_buffer_dirty(bh); | 82 | mark_buffer_dirty(bh); |
81 | clear_buffer_pinned(bh); | 83 | clear_buffer_pinned(bh); |
82 | 84 | ||
83 | gfs2_log_lock(sdp); | 85 | spin_lock(&sdp->sd_ail_lock); |
84 | if (bd->bd_ail) { | 86 | if (bd->bd_ail) { |
85 | list_del(&bd->bd_ail_st_list); | 87 | list_del(&bd->bd_ail_st_list); |
86 | brelse(bh); | 88 | brelse(bh); |
@@ -91,9 +93,11 @@ static void gfs2_unpin(struct gfs2_sbd *sdp, struct buffer_head *bh, | |||
91 | } | 93 | } |
92 | bd->bd_ail = ai; | 94 | bd->bd_ail = ai; |
93 | list_add(&bd->bd_ail_st_list, &ai->ai_ail1_list); | 95 | list_add(&bd->bd_ail_st_list, &ai->ai_ail1_list); |
94 | clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); | 96 | spin_unlock(&sdp->sd_ail_lock); |
97 | |||
98 | if (test_and_clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags)) | ||
99 | gfs2_glock_schedule_for_reclaim(bd->bd_gl); | ||
95 | trace_gfs2_pin(bd, 0); | 100 | trace_gfs2_pin(bd, 0); |
96 | gfs2_log_unlock(sdp); | ||
97 | unlock_buffer(bh); | 101 | unlock_buffer(bh); |
98 | atomic_dec(&sdp->sd_log_pinned); | 102 | atomic_dec(&sdp->sd_log_pinned); |
99 | } | 103 | } |
@@ -200,7 +204,7 @@ static void buf_lo_before_commit(struct gfs2_sbd *sdp) | |||
200 | } | 204 | } |
201 | 205 | ||
202 | gfs2_log_unlock(sdp); | 206 | gfs2_log_unlock(sdp); |
203 | submit_bh(WRITE_SYNC_PLUG, bh); | 207 | submit_bh(WRITE_SYNC, bh); |
204 | gfs2_log_lock(sdp); | 208 | gfs2_log_lock(sdp); |
205 | 209 | ||
206 | n = 0; | 210 | n = 0; |
@@ -210,7 +214,7 @@ static void buf_lo_before_commit(struct gfs2_sbd *sdp) | |||
210 | gfs2_log_unlock(sdp); | 214 | gfs2_log_unlock(sdp); |
211 | lock_buffer(bd2->bd_bh); | 215 | lock_buffer(bd2->bd_bh); |
212 | bh = gfs2_log_fake_buf(sdp, bd2->bd_bh); | 216 | bh = gfs2_log_fake_buf(sdp, bd2->bd_bh); |
213 | submit_bh(WRITE_SYNC_PLUG, bh); | 217 | submit_bh(WRITE_SYNC, bh); |
214 | gfs2_log_lock(sdp); | 218 | gfs2_log_lock(sdp); |
215 | if (++n >= num) | 219 | if (++n >= num) |
216 | break; | 220 | break; |
@@ -352,7 +356,7 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp) | |||
352 | sdp->sd_log_num_revoke--; | 356 | sdp->sd_log_num_revoke--; |
353 | 357 | ||
354 | if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) { | 358 | if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) { |
355 | submit_bh(WRITE_SYNC_PLUG, bh); | 359 | submit_bh(WRITE_SYNC, bh); |
356 | 360 | ||
357 | bh = gfs2_log_get_buf(sdp); | 361 | bh = gfs2_log_get_buf(sdp); |
358 | mh = (struct gfs2_meta_header *)bh->b_data; | 362 | mh = (struct gfs2_meta_header *)bh->b_data; |
@@ -369,7 +373,7 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp) | |||
369 | } | 373 | } |
370 | gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); | 374 | gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); |
371 | 375 | ||
372 | submit_bh(WRITE_SYNC_PLUG, bh); | 376 | submit_bh(WRITE_SYNC, bh); |
373 | } | 377 | } |
374 | 378 | ||
375 | static void revoke_lo_before_scan(struct gfs2_jdesc *jd, | 379 | static void revoke_lo_before_scan(struct gfs2_jdesc *jd, |
@@ -571,7 +575,7 @@ static void gfs2_write_blocks(struct gfs2_sbd *sdp, struct buffer_head *bh, | |||
571 | ptr = bh_log_ptr(bh); | 575 | ptr = bh_log_ptr(bh); |
572 | 576 | ||
573 | get_bh(bh); | 577 | get_bh(bh); |
574 | submit_bh(WRITE_SYNC_PLUG, bh); | 578 | submit_bh(WRITE_SYNC, bh); |
575 | gfs2_log_lock(sdp); | 579 | gfs2_log_lock(sdp); |
576 | while(!list_empty(list)) { | 580 | while(!list_empty(list)) { |
577 | bd = list_entry(list->next, struct gfs2_bufdata, bd_le.le_list); | 581 | bd = list_entry(list->next, struct gfs2_bufdata, bd_le.le_list); |
@@ -597,7 +601,7 @@ static void gfs2_write_blocks(struct gfs2_sbd *sdp, struct buffer_head *bh, | |||
597 | } else { | 601 | } else { |
598 | bh1 = gfs2_log_fake_buf(sdp, bd->bd_bh); | 602 | bh1 = gfs2_log_fake_buf(sdp, bd->bd_bh); |
599 | } | 603 | } |
600 | submit_bh(WRITE_SYNC_PLUG, bh1); | 604 | submit_bh(WRITE_SYNC, bh1); |
601 | gfs2_log_lock(sdp); | 605 | gfs2_log_lock(sdp); |
602 | ptr += 2; | 606 | ptr += 2; |
603 | } | 607 | } |