Skip to content

Commit bb82ab8

Browse files
author
Arne Jansen
committed
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 <[email protected]>
1 parent 286d6e7 commit bb82ab8

File tree

3 files changed

+9
-6
lines changed

3 files changed

+9
-6
lines changed

fs/btrfs/disk-io.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,8 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root,
367367
clear_bit(EXTENT_BUFFER_CORRUPT, &eb->bflags);
368368
io_tree = &BTRFS_I(root->fs_info->btree_inode)->io_tree;
369369
while (1) {
370-
ret = read_extent_buffer_pages(io_tree, eb, start, 1,
370+
ret = read_extent_buffer_pages(io_tree, eb, start,
371+
WAIT_COMPLETE,
371372
btree_get_extent, mirror_num);
372373
if (!ret &&
373374
!verify_parent_transid(io_tree, eb, parent_transid))
@@ -974,7 +975,7 @@ int readahead_tree_block(struct btrfs_root *root, u64 bytenr, u32 blocksize,
974975
if (!buf)
975976
return 0;
976977
read_extent_buffer_pages(&BTRFS_I(btree_inode)->io_tree,
977-
buf, 0, 0, btree_get_extent, 0);
978+
buf, 0, WAIT_NONE, btree_get_extent, 0);
978979
free_extent_buffer(buf);
979980
return ret;
980981
}

fs/btrfs/extent_io.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3349,8 +3349,7 @@ int extent_buffer_uptodate(struct extent_io_tree *tree,
33493349
}
33503350

33513351
int read_extent_buffer_pages(struct extent_io_tree *tree,
3352-
struct extent_buffer *eb,
3353-
u64 start, int wait,
3352+
struct extent_buffer *eb, u64 start, int wait,
33543353
get_extent_t *get_extent, int mirror_num)
33553354
{
33563355
unsigned long i;
@@ -3386,7 +3385,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
33863385
num_pages = num_extent_pages(eb->start, eb->len);
33873386
for (i = start_i; i < num_pages; i++) {
33883387
page = extent_buffer_page(eb, i);
3389-
if (!wait) {
3388+
if (wait == WAIT_NONE) {
33903389
if (!trylock_page(page))
33913390
goto unlock_exit;
33923391
} else {
@@ -3430,7 +3429,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
34303429
if (bio)
34313430
submit_one_bio(READ, bio, mirror_num, bio_flags);
34323431

3433-
if (ret || !wait)
3432+
if (ret || wait != WAIT_COMPLETE)
34343433
return ret;
34353434

34363435
for (i = start_i; i < num_pages; i++) {

fs/btrfs/extent_io.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,9 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,
248248
struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
249249
u64 start, unsigned long len);
250250
void free_extent_buffer(struct extent_buffer *eb);
251+
#define WAIT_NONE 0
252+
#define WAIT_COMPLETE 1
253+
#define WAIT_PAGE_LOCK 2
251254
int read_extent_buffer_pages(struct extent_io_tree *tree,
252255
struct extent_buffer *eb, u64 start, int wait,
253256
get_extent_t *get_extent, int mirror_num);

0 commit comments

Comments
 (0)