Commit 861093ef authored by Naohiro Aota's avatar Naohiro Aota Committed by David Sterba

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: default avatarChristoph Hellwig <hch@infradead.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 9c93c238
...@@ -1805,9 +1805,9 @@ static int submit_eb_subpage(struct page *page, struct writeback_control *wbc) ...@@ -1805,9 +1805,9 @@ static int submit_eb_subpage(struct page *page, struct writeback_control *wbc)
* previous call. * previous call.
* Return <0 for fatal error. * Return <0 for fatal error.
*/ */
static int submit_eb_page(struct page *page, struct writeback_control *wbc, static int submit_eb_page(struct page *page, struct btrfs_eb_write_context *ctx)
struct extent_buffer **eb_context)
{ {
struct writeback_control *wbc = ctx->wbc;
struct address_space *mapping = page->mapping; struct address_space *mapping = page->mapping;
struct btrfs_block_group *cache = NULL; struct btrfs_block_group *cache = NULL;
struct extent_buffer *eb; struct extent_buffer *eb;
...@@ -1836,7 +1836,7 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc, ...@@ -1836,7 +1836,7 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc,
return 0; return 0;
} }
if (eb == *eb_context) { if (eb == ctx->eb) {
spin_unlock(&mapping->private_lock); spin_unlock(&mapping->private_lock);
return 0; return 0;
} }
...@@ -1845,6 +1845,8 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc, ...@@ -1845,6 +1845,8 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc,
if (!ret) if (!ret)
return 0; return 0;
ctx->eb = eb;
if (!btrfs_check_meta_write_pointer(eb->fs_info, eb, &cache)) { if (!btrfs_check_meta_write_pointer(eb->fs_info, eb, &cache)) {
/* /*
* If for_sync, this hole will be filled with * 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, ...@@ -1858,8 +1860,6 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc,
return ret; return ret;
} }
*eb_context = eb;
if (!lock_extent_buffer_for_io(eb, wbc)) { if (!lock_extent_buffer_for_io(eb, wbc)) {
btrfs_revert_meta_write_pointer(cache, eb); btrfs_revert_meta_write_pointer(cache, eb);
if (cache) if (cache)
...@@ -1882,7 +1882,7 @@ static int submit_eb_page(struct page *page, struct writeback_control *wbc, ...@@ -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, int btree_write_cache_pages(struct address_space *mapping,
struct writeback_control *wbc) 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; struct btrfs_fs_info *fs_info = BTRFS_I(mapping->host)->root->fs_info;
int ret = 0; int ret = 0;
int done = 0; int done = 0;
...@@ -1924,7 +1924,7 @@ int btree_write_cache_pages(struct address_space *mapping, ...@@ -1924,7 +1924,7 @@ int btree_write_cache_pages(struct address_space *mapping,
for (i = 0; i < nr_folios; i++) { for (i = 0; i < nr_folios; i++) {
struct folio *folio = fbatch.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) if (ret == 0)
continue; continue;
if (ret < 0) { if (ret < 0) {
......
...@@ -93,6 +93,11 @@ struct extent_buffer { ...@@ -93,6 +93,11 @@ struct extent_buffer {
#endif #endif
}; };
struct btrfs_eb_write_context {
struct writeback_control *wbc;
struct extent_buffer *eb;
};
/* /*
* Get the correct offset inside the page of extent buffer. * Get the correct offset inside the page of extent buffer.
* *
......
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