aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorArne Jansen <sensille@gmx.net>2011-06-10 08:06:53 -0400
committerArne Jansen <sensille@gmx.net>2011-10-02 02:47:55 -0400
commitbb82ab88dfdb12948af58989c75bfe904bc1b09d (patch)
tree1311f5b5ec398cad99aa0da120aed0ee8a224a36 /fs/btrfs/extent_io.c
parent286d6e70aa6cf0f0235653eb1049bfc04610b4fb (diff)
btrfs: add an extra wait mode to read_extent_buffer_pages
read_extent_buffer_pages currently has two modes, either trigger a read without waiting for anything, or wait for the I/O to finish. The former also bails when it's unable to lock the page. This patch now adds an additional parameter to allow it to block on page lock, but don't wait for completion. Changes v5: - merge the 2 wait parameters into one and define WAIT_NONE, WAIT_COMPLETE and WAIT_PAGE_LOCK Change v6: - fix bug introduced in v5 Signed-off-by: Arne Jansen <sensille@gmx.net>
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index d418164a35f1..823028e73cf8 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -3349,8 +3349,7 @@ int extent_buffer_uptodate(struct extent_io_tree *tree,
3349} 3349}
3350 3350
3351int read_extent_buffer_pages(struct extent_io_tree *tree, 3351int read_extent_buffer_pages(struct extent_io_tree *tree,
3352 struct extent_buffer *eb, 3352 struct extent_buffer *eb, u64 start, int wait,
3353 u64 start, int wait,
3354 get_extent_t *get_extent, int mirror_num) 3353 get_extent_t *get_extent, int mirror_num)
3355{ 3354{
3356 unsigned long i; 3355 unsigned long i;
@@ -3386,7 +3385,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
3386 num_pages = num_extent_pages(eb->start, eb->len); 3385 num_pages = num_extent_pages(eb->start, eb->len);
3387 for (i = start_i; i < num_pages; i++) { 3386 for (i = start_i; i < num_pages; i++) {
3388 page = extent_buffer_page(eb, i); 3387 page = extent_buffer_page(eb, i);
3389 if (!wait) { 3388 if (wait == WAIT_NONE) {
3390 if (!trylock_page(page)) 3389 if (!trylock_page(page))
3391 goto unlock_exit; 3390 goto unlock_exit;
3392 } else { 3391 } else {
@@ -3430,7 +3429,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
3430 if (bio) 3429 if (bio)
3431 submit_one_bio(READ, bio, mirror_num, bio_flags); 3430 submit_one_bio(READ, bio, mirror_num, bio_flags);
3432 3431
3433 if (ret || !wait) 3432 if (ret || wait != WAIT_COMPLETE)
3434 return ret; 3433 return ret;
3435 3434
3436 for (i = start_i; i < num_pages; i++) { 3435 for (i = start_i; i < num_pages; i++) {