btrfs: simplify metadata pages reading
Metadata pages currently use __do_readpage to read metadata pages, unfortunately this function is also used to deal with ordinary data pages. This makes the metadata pages reading code to go through multiple hoops in order to adhere to __do_readpage invariants. Most of these are necessary for data pages which could be compressed. For metadata it's enough to simply build a bio and submit it. To this effect simply call submit_extent_page directly from read_extent_buffer_pages which is the only callpath used to populate extent_buffers with data. This in turn enables further cleanups. Reviewed-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
2f1d3e4b93
commit
0420177c08
@ -5573,20 +5573,19 @@ int read_extent_buffer_pages(struct extent_buffer *eb, int wait, int mirror_num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ClearPageError(page);
|
ClearPageError(page);
|
||||||
err = __extent_read_full_page(page,
|
err = submit_extent_page(REQ_OP_READ | REQ_META, NULL,
|
||||||
btree_get_extent, &bio,
|
page, page_offset(page), PAGE_SIZE, 0,
|
||||||
mirror_num, &bio_flags,
|
&bio, end_bio_extent_readpage,
|
||||||
REQ_META);
|
mirror_num, 0, 0, false);
|
||||||
if (err) {
|
if (err) {
|
||||||
ret = err;
|
|
||||||
/*
|
/*
|
||||||
* We use &bio in above __extent_read_full_page,
|
* We failed to submit the bio so it's the
|
||||||
* so we ensure that if it returns error, the
|
* caller's responsibility to perform cleanup
|
||||||
* current page fails to add itself to bio and
|
* i.e unlock page/set error bit.
|
||||||
* it's been unlocked.
|
|
||||||
*
|
|
||||||
* We must dec io_pages by ourselves.
|
|
||||||
*/
|
*/
|
||||||
|
ret = err;
|
||||||
|
SetPageError(page);
|
||||||
|
unlock_page(page);
|
||||||
atomic_dec(&eb->io_pages);
|
atomic_dec(&eb->io_pages);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user