* already been ran (aka, ordered extent inserted) and all pages are still
  * locked.
  */
-int extent_write_locked_range(struct inode *inode, u64 start, u64 end)
+int extent_write_locked_range(struct inode *inode, u64 start, u64 end,
+                             struct writeback_control *wbc)
 {
        bool found_error = false;
        int first_error = 0;
        const u32 sectorsize = fs_info->sectorsize;
        loff_t i_size = i_size_read(inode);
        u64 cur = start;
-       struct writeback_control wbc_writepages = {
-               .sync_mode      = WB_SYNC_ALL,
-               .range_start    = start,
-               .range_end      = end,
-               .no_cgroup_owner = 1,
-       };
        struct btrfs_bio_ctrl bio_ctrl = {
-               .wbc = &wbc_writepages,
-               /* We're called from an async helper function */
-               .opf = REQ_OP_WRITE | REQ_BTRFS_CGROUP_PUNT |
-                       wbc_to_write_flags(&wbc_writepages),
+               .wbc = wbc,
+               .opf = REQ_OP_WRITE | wbc_to_write_flags(wbc),
        };
 
+       if (wbc->no_cgroup_owner)
+               bio_ctrl.opf |= REQ_BTRFS_CGROUP_PUNT;
+
        ASSERT(IS_ALIGNED(start, sectorsize) && IS_ALIGNED(end + 1, sectorsize));
 
-       wbc_attach_fdatawrite_inode(&wbc_writepages, inode);
        while (cur <= end) {
                u64 cur_end = min(round_down(cur, PAGE_SIZE) + PAGE_SIZE - 1, end);
                struct page *page;
 
        submit_write_bio(&bio_ctrl, found_error ? ret : 0);
 
-       wbc_detach_inode(&wbc_writepages);
        if (found_error)
                return first_error;
        return ret;
 
 int try_release_extent_buffer(struct page *page);
 
 int btrfs_read_folio(struct file *file, struct folio *folio);
-int extent_write_locked_range(struct inode *inode, u64 start, u64 end);
+int extent_write_locked_range(struct inode *inode, u64 start, u64 end,
+                             struct writeback_control *wbc);
 int extent_writepages(struct address_space *mapping,
                      struct writeback_control *wbc);
 int btree_write_cache_pages(struct address_space *mapping,
 
        unsigned long nr_written = 0;
        int page_started = 0;
        int ret;
+       struct writeback_control wbc = {
+               .sync_mode              = WB_SYNC_ALL,
+               .range_start            = start,
+               .range_end              = end,
+               .no_cgroup_owner        = 1,
+       };
 
        /*
         * Call cow_file_range() to run the delalloc range directly, since we
        }
 
        /* All pages will be unlocked, including @locked_page */
-       return extent_write_locked_range(&inode->vfs_inode, start, end);
+       wbc_attach_fdatawrite_inode(&wbc, &inode->vfs_inode);
+       ret = extent_write_locked_range(&inode->vfs_inode, start, end, &wbc);
+       wbc_detach_inode(&wbc);
+       return ret;
 }
 
 static int submit_one_async_extent(struct btrfs_inode *inode,
 static noinline int run_delalloc_zoned(struct btrfs_inode *inode,
                                       struct page *locked_page, u64 start,
                                       u64 end, int *page_started,
-                                      unsigned long *nr_written)
+                                      unsigned long *nr_written,
+                                      struct writeback_control *wbc)
 {
        u64 done_offset = end;
        int ret;
                        account_page_redirty(locked_page);
                }
                locked_page_done = true;
-               extent_write_locked_range(&inode->vfs_inode, start, done_offset);
-
+               extent_write_locked_range(&inode->vfs_inode, start, done_offset,
+                                         wbc);
                start = done_offset + 1;
        }
 
 
        if (zoned)
                ret = run_delalloc_zoned(inode, locked_page, start, end,
-                                        page_started, nr_written);
+                                        page_started, nr_written, wbc);
        else
                ret = cow_file_range(inode, locked_page, start, end,
                                     page_started, nr_written, 1, NULL);