diff options
-rw-r--r-- | fs/buffer.c | 4 | ||||
-rw-r--r-- | fs/jbd/commit.c | 2 | ||||
-rw-r--r-- | fs/ntfs/aops.c | 2 | ||||
-rw-r--r-- | fs/ntfs/compress.c | 2 | ||||
-rw-r--r-- | fs/ntfs/mft.c | 4 | ||||
-rw-r--r-- | fs/reiserfs/inode.c | 2 | ||||
-rw-r--r-- | fs/reiserfs/journal.c | 4 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 2 | ||||
-rw-r--r-- | include/linux/buffer_head.h | 8 |
9 files changed, 17 insertions, 13 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index 4dbe52948e8f..38653e36e225 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 | } |
@@ -3000,7 +3000,7 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) | |||
3000 | 3000 | ||
3001 | if (rw == SWRITE || rw == SWRITE_SYNC) | 3001 | if (rw == SWRITE || rw == SWRITE_SYNC) |
3002 | lock_buffer(bh); | 3002 | lock_buffer(bh); |
3003 | else if (test_set_buffer_locked(bh)) | 3003 | else if (!trylock_buffer(bh)) |
3004 | continue; | 3004 | continue; |
3005 | 3005 | ||
3006 | if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) { | 3006 | if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) { |
diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c index 81a9ad7177ca..ae08c057e751 100644 --- a/fs/jbd/commit.c +++ b/fs/jbd/commit.c | |||
@@ -221,7 +221,7 @@ write_out_data: | |||
221 | * blocking lock_buffer(). | 221 | * blocking lock_buffer(). |
222 | */ | 222 | */ |
223 | if (buffer_dirty(bh)) { | 223 | if (buffer_dirty(bh)) { |
224 | if (test_set_buffer_locked(bh)) { | 224 | if (!trylock_buffer(bh)) { |
225 | BUFFER_TRACE(bh, "needs blocking lock"); | 225 | BUFFER_TRACE(bh, "needs blocking lock"); |
226 | spin_unlock(&journal->j_list_lock); | 226 | spin_unlock(&journal->j_list_lock); |
227 | /* Write out all data to prevent deadlocks */ | 227 | /* Write out all data to prevent deadlocks */ |
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 00e9ccde8e42..b38f944f0667 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c | |||
@@ -1194,7 +1194,7 @@ lock_retry_remap: | |||
1194 | tbh = bhs[i]; | 1194 | tbh = bhs[i]; |
1195 | if (!tbh) | 1195 | if (!tbh) |
1196 | continue; | 1196 | continue; |
1197 | if (unlikely(test_set_buffer_locked(tbh))) | 1197 | if (!trylock_buffer(tbh)) |
1198 | BUG(); | 1198 | BUG(); |
1199 | /* The buffer dirty state is now irrelevant, just clean it. */ | 1199 | /* The buffer dirty state is now irrelevant, just clean it. */ |
1200 | clear_buffer_dirty(tbh); | 1200 | clear_buffer_dirty(tbh); |
diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c index 33ff314cc507..9669541d0119 100644 --- a/fs/ntfs/compress.c +++ b/fs/ntfs/compress.c | |||
@@ -665,7 +665,7 @@ lock_retry_remap: | |||
665 | for (i = 0; i < nr_bhs; i++) { | 665 | for (i = 0; i < nr_bhs; i++) { |
666 | struct buffer_head *tbh = bhs[i]; | 666 | struct buffer_head *tbh = bhs[i]; |
667 | 667 | ||
668 | if (unlikely(test_set_buffer_locked(tbh))) | 668 | if (!trylock_buffer(tbh)) |
669 | continue; | 669 | continue; |
670 | if (unlikely(buffer_uptodate(tbh))) { | 670 | if (unlikely(buffer_uptodate(tbh))) { |
671 | unlock_buffer(tbh); | 671 | unlock_buffer(tbh); |
diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index 790defb847e7..17d32ca6bc35 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c | |||
@@ -586,7 +586,7 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no, | |||
586 | for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { | 586 | for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { |
587 | struct buffer_head *tbh = bhs[i_bhs]; | 587 | struct buffer_head *tbh = bhs[i_bhs]; |
588 | 588 | ||
589 | if (unlikely(test_set_buffer_locked(tbh))) | 589 | if (!trylock_buffer(tbh)) |
590 | BUG(); | 590 | BUG(); |
591 | BUG_ON(!buffer_uptodate(tbh)); | 591 | BUG_ON(!buffer_uptodate(tbh)); |
592 | clear_buffer_dirty(tbh); | 592 | clear_buffer_dirty(tbh); |
@@ -779,7 +779,7 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync) | |||
779 | for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { | 779 | for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { |
780 | struct buffer_head *tbh = bhs[i_bhs]; | 780 | struct buffer_head *tbh = bhs[i_bhs]; |
781 | 781 | ||
782 | if (unlikely(test_set_buffer_locked(tbh))) | 782 | if (!trylock_buffer(tbh)) |
783 | BUG(); | 783 | BUG(); |
784 | BUG_ON(!buffer_uptodate(tbh)); | 784 | BUG_ON(!buffer_uptodate(tbh)); |
785 | clear_buffer_dirty(tbh); | 785 | clear_buffer_dirty(tbh); |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 192269698a8a..5699171212ae 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -2435,7 +2435,7 @@ static int reiserfs_write_full_page(struct page *page, | |||
2435 | if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) { | 2435 | if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) { |
2436 | lock_buffer(bh); | 2436 | lock_buffer(bh); |
2437 | } else { | 2437 | } else { |
2438 | if (test_set_buffer_locked(bh)) { | 2438 | if (!trylock_buffer(bh)) { |
2439 | redirty_page_for_writepage(wbc, page); | 2439 | redirty_page_for_writepage(wbc, page); |
2440 | continue; | 2440 | continue; |
2441 | } | 2441 | } |
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index ce2208b27118..c21df71943a6 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c | |||
@@ -855,7 +855,7 @@ static int write_ordered_buffers(spinlock_t * lock, | |||
855 | jh = JH_ENTRY(list->next); | 855 | jh = JH_ENTRY(list->next); |
856 | bh = jh->bh; | 856 | bh = jh->bh; |
857 | get_bh(bh); | 857 | get_bh(bh); |
858 | if (test_set_buffer_locked(bh)) { | 858 | if (!trylock_buffer(bh)) { |
859 | if (!buffer_dirty(bh)) { | 859 | if (!buffer_dirty(bh)) { |
860 | list_move(&jh->list, &tmp); | 860 | list_move(&jh->list, &tmp); |
861 | goto loop_next; | 861 | goto loop_next; |
@@ -3871,7 +3871,7 @@ int reiserfs_prepare_for_journal(struct super_block *p_s_sb, | |||
3871 | { | 3871 | { |
3872 | PROC_INFO_INC(p_s_sb, journal.prepare); | 3872 | PROC_INFO_INC(p_s_sb, journal.prepare); |
3873 | 3873 | ||
3874 | if (test_set_buffer_locked(bh)) { | 3874 | if (!trylock_buffer(bh)) { |
3875 | if (!wait) | 3875 | if (!wait) |
3876 | return 0; | 3876 | return 0; |
3877 | lock_buffer(bh); | 3877 | lock_buffer(bh); |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index fa73179233ad..fa47e43b8b41 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -1104,7 +1104,7 @@ xfs_page_state_convert( | |||
1104 | * that we are writing into for the first time. | 1104 | * that we are writing into for the first time. |
1105 | */ | 1105 | */ |
1106 | type = IOMAP_NEW; | 1106 | type = IOMAP_NEW; |
1107 | if (!test_and_set_bit(BH_Lock, &bh->b_state)) { | 1107 | if (trylock_buffer(bh)) { |
1108 | ASSERT(buffer_mapped(bh)); | 1108 | ASSERT(buffer_mapped(bh)); |
1109 | if (iomap_valid) | 1109 | if (iomap_valid) |
1110 | all_bh = 1; | 1110 | all_bh = 1; |
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 50cfe8ceb478..eadaab44015f 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h | |||
@@ -115,7 +115,6 @@ BUFFER_FNS(Uptodate, uptodate) | |||
115 | BUFFER_FNS(Dirty, dirty) | 115 | BUFFER_FNS(Dirty, dirty) |
116 | TAS_BUFFER_FNS(Dirty, dirty) | 116 | TAS_BUFFER_FNS(Dirty, dirty) |
117 | BUFFER_FNS(Lock, locked) | 117 | BUFFER_FNS(Lock, locked) |
118 | TAS_BUFFER_FNS(Lock, locked) | ||
119 | BUFFER_FNS(Req, req) | 118 | BUFFER_FNS(Req, req) |
120 | TAS_BUFFER_FNS(Req, req) | 119 | TAS_BUFFER_FNS(Req, req) |
121 | BUFFER_FNS(Mapped, mapped) | 120 | BUFFER_FNS(Mapped, mapped) |
@@ -321,10 +320,15 @@ static inline void wait_on_buffer(struct buffer_head *bh) | |||
321 | __wait_on_buffer(bh); | 320 | __wait_on_buffer(bh); |
322 | } | 321 | } |
323 | 322 | ||
323 | static inline int trylock_buffer(struct buffer_head *bh) | ||
324 | { | ||
325 | return likely(!test_and_set_bit(BH_Lock, &bh->b_state)); | ||
326 | } | ||
327 | |||
324 | static inline void lock_buffer(struct buffer_head *bh) | 328 | static inline void lock_buffer(struct buffer_head *bh) |
325 | { | 329 | { |
326 | might_sleep(); | 330 | might_sleep(); |
327 | if (test_set_buffer_locked(bh)) | 331 | if (!trylock_buffer(bh)) |
328 | __lock_buffer(bh); | 332 | __lock_buffer(bh); |
329 | } | 333 | } |
330 | 334 | ||