mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 06:02:05 +00:00
btrfs: introduce struct to consolidate extent buffer write context
Introduce btrfs_eb_write_context to consolidate writeback_control and the exntent buffer context. This will help adding a block group context as well. While at it, move the eb context setting before btrfs_check_meta_write_pointer(). We can set it here because we anyway need to skip pages in the same eb if that eb is rejected by btrfs_check_meta_write_pointer(). Suggested-by: Christoph Hellwig <hch@infradead.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
9c93c238c1
commit
861093eff4
@ -1805,9 +1805,9 @@ static int submit_eb_subpage(struct page *page, struct writeback_control *wbc)
|
||||
* previous call.
|
||||
* Return <0 for fatal error.
|
||||
*/
|
||||
static int submit_eb_page(struct page *page, struct writeback_control *wbc,
|
||||
struct extent_buffer **eb_context)
|
||||
static int submit_eb_page(struct page *page, struct btrfs_eb_write_context *ctx)
|
||||
{
|
||||
struct writeback_control *wbc = ctx->wbc;
|
||||
struct address_space *mapping = page->mapping;
|
||||
struct btrfs_block_group *cache = NULL;
|
||||
struct extent_buffer *eb;
|
||||
@ -1836,7 +1836,7 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (eb == *eb_context) {
|
||||
if (eb == ctx->eb) {
|
||||
spin_unlock(&mapping->private_lock);
|
||||
return 0;
|
||||
}
|
||||
@ -1845,6 +1845,8 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc,
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
ctx->eb = eb;
|
||||
|
||||
if (!btrfs_check_meta_write_pointer(eb->fs_info, eb, &cache)) {
|
||||
/*
|
||||
* If for_sync, this hole will be filled with
|
||||
@ -1858,8 +1860,6 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc,
|
||||
return ret;
|
||||
}
|
||||
|
||||
*eb_context = eb;
|
||||
|
||||
if (!lock_extent_buffer_for_io(eb, wbc)) {
|
||||
btrfs_revert_meta_write_pointer(cache, eb);
|
||||
if (cache)
|
||||
@ -1882,7 +1882,7 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc,
|
||||
int btree_write_cache_pages(struct address_space *mapping,
|
||||
struct writeback_control *wbc)
|
||||
{
|
||||
struct extent_buffer *eb_context = NULL;
|
||||
struct btrfs_eb_write_context ctx = { .wbc = wbc };
|
||||
struct btrfs_fs_info *fs_info = BTRFS_I(mapping->host)->root->fs_info;
|
||||
int ret = 0;
|
||||
int done = 0;
|
||||
@ -1924,7 +1924,7 @@ retry:
|
||||
for (i = 0; i < nr_folios; i++) {
|
||||
struct folio *folio = fbatch.folios[i];
|
||||
|
||||
ret = submit_eb_page(&folio->page, wbc, &eb_context);
|
||||
ret = submit_eb_page(&folio->page, &ctx);
|
||||
if (ret == 0)
|
||||
continue;
|
||||
if (ret < 0) {
|
||||
|
@ -93,6 +93,11 @@ struct extent_buffer {
|
||||
#endif
|
||||
};
|
||||
|
||||
struct btrfs_eb_write_context {
|
||||
struct writeback_control *wbc;
|
||||
struct extent_buffer *eb;
|
||||
};
|
||||
|
||||
/*
|
||||
* Get the correct offset inside the page of extent buffer.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user