|
@@ -1096,8 +1096,10 @@ static int cow_file_range_async(struct inode *inode, struct page *locked_page,
|
|
|
async_cow->end = cur_end;
|
|
|
INIT_LIST_HEAD(&async_cow->extents);
|
|
|
|
|
|
- btrfs_init_work(&async_cow->work, async_cow_start,
|
|
|
- async_cow_submit, async_cow_free);
|
|
|
+ btrfs_init_work(&async_cow->work,
|
|
|
+ btrfs_delalloc_helper,
|
|
|
+ async_cow_start, async_cow_submit,
|
|
|
+ async_cow_free);
|
|
|
|
|
|
nr_pages = (cur_end - start + PAGE_CACHE_SIZE) >>
|
|
|
PAGE_CACHE_SHIFT;
|
|
@@ -1881,7 +1883,8 @@ static int btrfs_writepage_start_hook(struct page *page, u64 start, u64 end)
|
|
|
|
|
|
SetPageChecked(page);
|
|
|
page_cache_get(page);
|
|
|
- btrfs_init_work(&fixup->work, btrfs_writepage_fixup_worker, NULL, NULL);
|
|
|
+ btrfs_init_work(&fixup->work, btrfs_fixup_helper,
|
|
|
+ btrfs_writepage_fixup_worker, NULL, NULL);
|
|
|
fixup->page = page;
|
|
|
btrfs_queue_work(root->fs_info->fixup_workers, &fixup->work);
|
|
|
return -EBUSY;
|
|
@@ -2822,7 +2825,8 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
|
|
|
struct inode *inode = page->mapping->host;
|
|
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
|
struct btrfs_ordered_extent *ordered_extent = NULL;
|
|
|
- struct btrfs_workqueue *workers;
|
|
|
+ struct btrfs_workqueue *wq;
|
|
|
+ btrfs_work_func_t func;
|
|
|
|
|
|
trace_btrfs_writepage_end_io_hook(page, start, end, uptodate);
|
|
|
|
|
@@ -2831,13 +2835,17 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
|
|
|
end - start + 1, uptodate))
|
|
|
return 0;
|
|
|
|
|
|
- btrfs_init_work(&ordered_extent->work, finish_ordered_fn, NULL, NULL);
|
|
|
+ if (btrfs_is_free_space_inode(inode)) {
|
|
|
+ wq = root->fs_info->endio_freespace_worker;
|
|
|
+ func = btrfs_freespace_write_helper;
|
|
|
+ } else {
|
|
|
+ wq = root->fs_info->endio_write_workers;
|
|
|
+ func = btrfs_endio_write_helper;
|
|
|
+ }
|
|
|
|
|
|
- if (btrfs_is_free_space_inode(inode))
|
|
|
- workers = root->fs_info->endio_freespace_worker;
|
|
|
- else
|
|
|
- workers = root->fs_info->endio_write_workers;
|
|
|
- btrfs_queue_work(workers, &ordered_extent->work);
|
|
|
+ btrfs_init_work(&ordered_extent->work, func, finish_ordered_fn, NULL,
|
|
|
+ NULL);
|
|
|
+ btrfs_queue_work(wq, &ordered_extent->work);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -7208,7 +7216,8 @@ again:
|
|
|
if (!ret)
|
|
|
goto out_test;
|
|
|
|
|
|
- btrfs_init_work(&ordered->work, finish_ordered_fn, NULL, NULL);
|
|
|
+ btrfs_init_work(&ordered->work, btrfs_endio_write_helper,
|
|
|
+ finish_ordered_fn, NULL, NULL);
|
|
|
btrfs_queue_work(root->fs_info->endio_write_workers,
|
|
|
&ordered->work);
|
|
|
out_test:
|
|
@@ -8535,7 +8544,9 @@ struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode,
|
|
|
work->inode = inode;
|
|
|
work->wait = wait;
|
|
|
work->delay_iput = delay_iput;
|
|
|
- btrfs_init_work(&work->work, btrfs_run_delalloc_work, NULL, NULL);
|
|
|
+ WARN_ON_ONCE(!inode);
|
|
|
+ btrfs_init_work(&work->work, btrfs_flush_delalloc_helper,
|
|
|
+ btrfs_run_delalloc_work, NULL, NULL);
|
|
|
|
|
|
return work;
|
|
|
}
|