diff options
Diffstat (limited to 'fs/gfs2/log.c')
| -rw-r--r-- | fs/gfs2/log.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index 6c6af9f5e3ab..ad305854bdc6 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
| 19 | #include <linux/kthread.h> | 19 | #include <linux/kthread.h> |
| 20 | #include <linux/freezer.h> | 20 | #include <linux/freezer.h> |
| 21 | #include <linux/bio.h> | ||
| 21 | 22 | ||
| 22 | #include "gfs2.h" | 23 | #include "gfs2.h" |
| 23 | #include "incore.h" | 24 | #include "incore.h" |
| @@ -584,7 +585,6 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags, int pull) | |||
| 584 | memset(bh->b_data, 0, bh->b_size); | 585 | memset(bh->b_data, 0, bh->b_size); |
| 585 | set_buffer_uptodate(bh); | 586 | set_buffer_uptodate(bh); |
| 586 | clear_buffer_dirty(bh); | 587 | clear_buffer_dirty(bh); |
| 587 | unlock_buffer(bh); | ||
| 588 | 588 | ||
| 589 | gfs2_ail1_empty(sdp, 0); | 589 | gfs2_ail1_empty(sdp, 0); |
| 590 | tail = current_tail(sdp); | 590 | tail = current_tail(sdp); |
| @@ -601,8 +601,23 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags, int pull) | |||
| 601 | hash = gfs2_disk_hash(bh->b_data, sizeof(struct gfs2_log_header)); | 601 | hash = gfs2_disk_hash(bh->b_data, sizeof(struct gfs2_log_header)); |
| 602 | lh->lh_hash = cpu_to_be32(hash); | 602 | lh->lh_hash = cpu_to_be32(hash); |
| 603 | 603 | ||
| 604 | set_buffer_dirty(bh); | 604 | bh->b_end_io = end_buffer_write_sync; |
| 605 | if (sync_dirty_buffer(bh)) | 605 | if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) |
| 606 | goto skip_barrier; | ||
| 607 | get_bh(bh); | ||
| 608 | submit_bh(WRITE_BARRIER | (1 << BIO_RW_META), bh); | ||
| 609 | wait_on_buffer(bh); | ||
| 610 | if (buffer_eopnotsupp(bh)) { | ||
| 611 | clear_buffer_eopnotsupp(bh); | ||
| 612 | set_buffer_uptodate(bh); | ||
| 613 | set_bit(SDF_NOBARRIERS, &sdp->sd_flags); | ||
| 614 | lock_buffer(bh); | ||
| 615 | skip_barrier: | ||
| 616 | get_bh(bh); | ||
| 617 | submit_bh(WRITE_SYNC | (1 << BIO_RW_META), bh); | ||
| 618 | wait_on_buffer(bh); | ||
| 619 | } | ||
| 620 | if (!buffer_uptodate(bh)) | ||
| 606 | gfs2_io_error_bh(sdp, bh); | 621 | gfs2_io_error_bh(sdp, bh); |
| 607 | brelse(bh); | 622 | brelse(bh); |
| 608 | 623 | ||
