Commit 79fb65a1 authored by Josef Bacik's avatar Josef Bacik

Btrfs: don't call readahead hook until we have read the entire eb

Martin Steigerwald reported a BUG_ON() where we were given a bogus bytenr to
map.  Turns out he is using > PAGESIZE leafsizes.  The readahead stuff is called
every time we do a completion, but we may not have finished reading in all the
pages, so the bytenr we read off the node could be completely bogus.  Fix this
by only calling the readahead hook once all pages have been read in.  Thanks,
Reported-by: default avatarMartin Steigerwald <Martin@lichtvoll.de>
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
parent 9bb91873
...@@ -636,10 +636,9 @@ static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end, ...@@ -636,10 +636,9 @@ static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,
if (!ret) if (!ret)
set_extent_buffer_uptodate(eb); set_extent_buffer_uptodate(eb);
err: err:
if (test_bit(EXTENT_BUFFER_READAHEAD, &eb->bflags)) { if (reads_done &&
clear_bit(EXTENT_BUFFER_READAHEAD, &eb->bflags); test_and_clear_bit(EXTENT_BUFFER_READAHEAD, &eb->bflags))
btree_readahead_hook(root, eb, eb->start, ret); btree_readahead_hook(root, eb, eb->start, ret);
}
if (ret) { if (ret) {
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment