btrfs: introduce struct to consolidate extent buffer write context
authorNaohiro Aota <naohiro.aota@wdc.com>
Mon, 7 Aug 2023 16:12:31 +0000 (01:12 +0900)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Aug 2023 12:52:19 +0000 (14:52 +0200)
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>
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h

index 36d80cb8cfa32d1073d97120239dbce8982fb3c6..3ee83ff7f9108840b37a14daa3e384dd5a1b2d77 100644 (file)
@@ -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) {
index adda14c1b763e342126587cad1f952049572719a..e243a8eac9106d2e9568d502b30a3a1a5cff9c8d 100644 (file)
@@ -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.
  *