diff options
Diffstat (limited to 'fs/buffer.c')
-rw-r--r-- | fs/buffer.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index 4dbe52948e8f..ac78d4c19b3b 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -1720,7 +1720,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, | |||
1720 | */ | 1720 | */ |
1721 | if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) { | 1721 | if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) { |
1722 | lock_buffer(bh); | 1722 | lock_buffer(bh); |
1723 | } else if (test_set_buffer_locked(bh)) { | 1723 | } else if (!trylock_buffer(bh)) { |
1724 | redirty_page_for_writepage(wbc, page); | 1724 | redirty_page_for_writepage(wbc, page); |
1725 | continue; | 1725 | continue; |
1726 | } | 1726 | } |
@@ -2926,14 +2926,17 @@ int submit_bh(int rw, struct buffer_head * bh) | |||
2926 | BUG_ON(!buffer_mapped(bh)); | 2926 | BUG_ON(!buffer_mapped(bh)); |
2927 | BUG_ON(!bh->b_end_io); | 2927 | BUG_ON(!bh->b_end_io); |
2928 | 2928 | ||
2929 | if (buffer_ordered(bh) && (rw == WRITE)) | 2929 | /* |
2930 | rw = WRITE_BARRIER; | 2930 | * Mask in barrier bit for a write (could be either a WRITE or a |
2931 | * WRITE_SYNC | ||
2932 | */ | ||
2933 | if (buffer_ordered(bh) && (rw & WRITE)) | ||
2934 | rw |= WRITE_BARRIER; | ||
2931 | 2935 | ||
2932 | /* | 2936 | /* |
2933 | * Only clear out a write error when rewriting, should this | 2937 | * Only clear out a write error when rewriting |
2934 | * include WRITE_SYNC as well? | ||
2935 | */ | 2938 | */ |
2936 | if (test_set_buffer_req(bh) && (rw == WRITE || rw == WRITE_BARRIER)) | 2939 | if (test_set_buffer_req(bh) && (rw & WRITE)) |
2937 | clear_buffer_write_io_error(bh); | 2940 | clear_buffer_write_io_error(bh); |
2938 | 2941 | ||
2939 | /* | 2942 | /* |
@@ -3000,7 +3003,7 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) | |||
3000 | 3003 | ||
3001 | if (rw == SWRITE || rw == SWRITE_SYNC) | 3004 | if (rw == SWRITE || rw == SWRITE_SYNC) |
3002 | lock_buffer(bh); | 3005 | lock_buffer(bh); |
3003 | else if (test_set_buffer_locked(bh)) | 3006 | else if (!trylock_buffer(bh)) |
3004 | continue; | 3007 | continue; |
3005 | 3008 | ||
3006 | if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) { | 3009 | if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) { |