Commit ba8b04c1 authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

btrfs: extend btrfs_set_extent_delalloc and its friends to support in-band...

btrfs: extend btrfs_set_extent_delalloc and its friends to support in-band dedupe and subpage size patchset

Extend btrfs_set_extent_delalloc() and extent_clear_unlock_delalloc()
parameters for both in-band dedupe and subpage sector size patchset.

This should reduce conflict of both patchset and the effort to rebase
them.

Cc: Chandan Rajendra <chandan@linux.vnet.ibm.com>
Cc: David Sterba <dsterba@suse.cz>
Signed-off-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 897a41b1
...@@ -3119,7 +3119,7 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput); ...@@ -3119,7 +3119,7 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput);
int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, int delay_iput, int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, int delay_iput,
int nr); int nr);
int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end,
struct extent_state **cached_state); struct extent_state **cached_state, int dedupe);
int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
struct btrfs_root *new_root, struct btrfs_root *new_root,
struct btrfs_root *parent_root, struct btrfs_root *parent_root,
......
...@@ -1730,7 +1730,7 @@ STATIC u64 find_lock_delalloc_range(struct inode *inode, ...@@ -1730,7 +1730,7 @@ STATIC u64 find_lock_delalloc_range(struct inode *inode,
} }
void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end,
struct page *locked_page, u64 delalloc_end, struct page *locked_page,
unsigned clear_bits, unsigned clear_bits,
unsigned long page_ops) unsigned long page_ops)
{ {
......
...@@ -413,7 +413,7 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset, ...@@ -413,7 +413,7 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset,
void extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end); void extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end);
void extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end); void extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end);
void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end,
struct page *locked_page, u64 delalloc_end, struct page *locked_page,
unsigned bits_to_clear, unsigned bits_to_clear,
unsigned long page_ops); unsigned long page_ops);
struct bio * struct bio *
......
...@@ -503,7 +503,7 @@ int btrfs_dirty_pages(struct btrfs_root *root, struct inode *inode, ...@@ -503,7 +503,7 @@ int btrfs_dirty_pages(struct btrfs_root *root, struct inode *inode,
end_of_last_block = start_pos + num_bytes - 1; end_of_last_block = start_pos + num_bytes - 1;
err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block, err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block,
cached); cached, 0);
if (err) if (err)
return err; return err;
......
...@@ -560,8 +560,9 @@ static noinline void compress_file_range(struct inode *inode, ...@@ -560,8 +560,9 @@ static noinline void compress_file_range(struct inode *inode,
* we don't need to create any more async work items. * we don't need to create any more async work items.
* Unlock and free up our temp pages. * Unlock and free up our temp pages.
*/ */
extent_clear_unlock_delalloc(inode, start, end, NULL, extent_clear_unlock_delalloc(inode, start, end, end,
clear_flags, PAGE_UNLOCK | NULL, clear_flags,
PAGE_UNLOCK |
PAGE_CLEAR_DIRTY | PAGE_CLEAR_DIRTY |
PAGE_SET_WRITEBACK | PAGE_SET_WRITEBACK |
page_error_op | page_error_op |
...@@ -835,6 +836,8 @@ static noinline void submit_compressed_extents(struct inode *inode, ...@@ -835,6 +836,8 @@ static noinline void submit_compressed_extents(struct inode *inode,
* clear dirty, set writeback and unlock the pages. * clear dirty, set writeback and unlock the pages.
*/ */
extent_clear_unlock_delalloc(inode, async_extent->start, extent_clear_unlock_delalloc(inode, async_extent->start,
async_extent->start +
async_extent->ram_size - 1,
async_extent->start + async_extent->start +
async_extent->ram_size - 1, async_extent->ram_size - 1,
NULL, EXTENT_LOCKED | EXTENT_DELALLOC, NULL, EXTENT_LOCKED | EXTENT_DELALLOC,
...@@ -856,7 +859,8 @@ static noinline void submit_compressed_extents(struct inode *inode, ...@@ -856,7 +859,8 @@ static noinline void submit_compressed_extents(struct inode *inode,
tree->ops->writepage_end_io_hook(p, start, end, tree->ops->writepage_end_io_hook(p, start, end,
NULL, 0); NULL, 0);
p->mapping = NULL; p->mapping = NULL;
extent_clear_unlock_delalloc(inode, start, end, NULL, 0, extent_clear_unlock_delalloc(inode, start, end, end,
NULL, 0,
PAGE_END_WRITEBACK | PAGE_END_WRITEBACK |
PAGE_SET_ERROR); PAGE_SET_ERROR);
free_async_extent_pages(async_extent); free_async_extent_pages(async_extent);
...@@ -871,6 +875,8 @@ static noinline void submit_compressed_extents(struct inode *inode, ...@@ -871,6 +875,8 @@ static noinline void submit_compressed_extents(struct inode *inode,
btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1); btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1);
out_free: out_free:
extent_clear_unlock_delalloc(inode, async_extent->start, extent_clear_unlock_delalloc(inode, async_extent->start,
async_extent->start +
async_extent->ram_size - 1,
async_extent->start + async_extent->start +
async_extent->ram_size - 1, async_extent->ram_size - 1,
NULL, EXTENT_LOCKED | EXTENT_DELALLOC | NULL, EXTENT_LOCKED | EXTENT_DELALLOC |
...@@ -966,7 +972,8 @@ static noinline int cow_file_range(struct inode *inode, ...@@ -966,7 +972,8 @@ static noinline int cow_file_range(struct inode *inode,
ret = cow_file_range_inline(root, inode, start, end, 0, 0, ret = cow_file_range_inline(root, inode, start, end, 0, 0,
NULL); NULL);
if (ret == 0) { if (ret == 0) {
extent_clear_unlock_delalloc(inode, start, end, NULL, extent_clear_unlock_delalloc(inode, start, end,
delalloc_end, NULL,
EXTENT_LOCKED | EXTENT_DELALLOC | EXTENT_LOCKED | EXTENT_DELALLOC |
EXTENT_DEFRAG, PAGE_UNLOCK | EXTENT_DEFRAG, PAGE_UNLOCK |
PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK | PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
...@@ -1062,7 +1069,8 @@ static noinline int cow_file_range(struct inode *inode, ...@@ -1062,7 +1069,8 @@ static noinline int cow_file_range(struct inode *inode,
op |= PAGE_SET_PRIVATE2; op |= PAGE_SET_PRIVATE2;
extent_clear_unlock_delalloc(inode, start, extent_clear_unlock_delalloc(inode, start,
start + ram_size - 1, locked_page, start + ram_size - 1,
delalloc_end, locked_page,
EXTENT_LOCKED | EXTENT_DELALLOC, EXTENT_LOCKED | EXTENT_DELALLOC,
op); op);
disk_num_bytes -= cur_alloc_size; disk_num_bytes -= cur_alloc_size;
...@@ -1079,7 +1087,8 @@ static noinline int cow_file_range(struct inode *inode, ...@@ -1079,7 +1087,8 @@ static noinline int cow_file_range(struct inode *inode,
btrfs_dec_block_group_reservations(root->fs_info, ins.objectid); btrfs_dec_block_group_reservations(root->fs_info, ins.objectid);
btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1); btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1);
out_unlock: out_unlock:
extent_clear_unlock_delalloc(inode, start, end, locked_page, extent_clear_unlock_delalloc(inode, start, end, delalloc_end,
locked_page,
EXTENT_LOCKED | EXTENT_DO_ACCOUNTING | EXTENT_LOCKED | EXTENT_DO_ACCOUNTING |
EXTENT_DELALLOC | EXTENT_DEFRAG, EXTENT_DELALLOC | EXTENT_DEFRAG,
PAGE_UNLOCK | PAGE_CLEAR_DIRTY | PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
...@@ -1258,7 +1267,8 @@ static noinline int run_delalloc_nocow(struct inode *inode, ...@@ -1258,7 +1267,8 @@ static noinline int run_delalloc_nocow(struct inode *inode,
path = btrfs_alloc_path(); path = btrfs_alloc_path();
if (!path) { if (!path) {
extent_clear_unlock_delalloc(inode, start, end, locked_page, extent_clear_unlock_delalloc(inode, start, end, end,
locked_page,
EXTENT_LOCKED | EXTENT_DELALLOC | EXTENT_LOCKED | EXTENT_DELALLOC |
EXTENT_DO_ACCOUNTING | EXTENT_DO_ACCOUNTING |
EXTENT_DEFRAG, PAGE_UNLOCK | EXTENT_DEFRAG, PAGE_UNLOCK |
...@@ -1276,7 +1286,8 @@ static noinline int run_delalloc_nocow(struct inode *inode, ...@@ -1276,7 +1286,8 @@ static noinline int run_delalloc_nocow(struct inode *inode,
trans = btrfs_join_transaction(root); trans = btrfs_join_transaction(root);
if (IS_ERR(trans)) { if (IS_ERR(trans)) {
extent_clear_unlock_delalloc(inode, start, end, locked_page, extent_clear_unlock_delalloc(inode, start, end, end,
locked_page,
EXTENT_LOCKED | EXTENT_DELALLOC | EXTENT_LOCKED | EXTENT_DELALLOC |
EXTENT_DO_ACCOUNTING | EXTENT_DO_ACCOUNTING |
EXTENT_DEFRAG, PAGE_UNLOCK | EXTENT_DEFRAG, PAGE_UNLOCK |
...@@ -1490,7 +1501,7 @@ static noinline int run_delalloc_nocow(struct inode *inode, ...@@ -1490,7 +1501,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
} }
extent_clear_unlock_delalloc(inode, cur_offset, extent_clear_unlock_delalloc(inode, cur_offset,
cur_offset + num_bytes - 1, cur_offset + num_bytes - 1, end,
locked_page, EXTENT_LOCKED | locked_page, EXTENT_LOCKED |
EXTENT_DELALLOC | EXTENT_DELALLOC |
EXTENT_CLEAR_DATA_RESV, EXTENT_CLEAR_DATA_RESV,
...@@ -1522,7 +1533,7 @@ static noinline int run_delalloc_nocow(struct inode *inode, ...@@ -1522,7 +1533,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
ret = err; ret = err;
if (ret && cur_offset < end) if (ret && cur_offset < end)
extent_clear_unlock_delalloc(inode, cur_offset, end, extent_clear_unlock_delalloc(inode, cur_offset, end, end,
locked_page, EXTENT_LOCKED | locked_page, EXTENT_LOCKED |
EXTENT_DELALLOC | EXTENT_DEFRAG | EXTENT_DELALLOC | EXTENT_DEFRAG |
EXTENT_DO_ACCOUNTING, PAGE_UNLOCK | EXTENT_DO_ACCOUNTING, PAGE_UNLOCK |
...@@ -1988,7 +1999,7 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, ...@@ -1988,7 +1999,7 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans,
} }
int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end,
struct extent_state **cached_state) struct extent_state **cached_state, int dedupe)
{ {
WARN_ON((end & (PAGE_SIZE - 1)) == 0); WARN_ON((end & (PAGE_SIZE - 1)) == 0);
return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end, return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end,
...@@ -2052,7 +2063,8 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work) ...@@ -2052,7 +2063,8 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work)
goto out; goto out;
} }
btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state); btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state,
0);
ClearPageChecked(page); ClearPageChecked(page);
set_page_dirty(page); set_page_dirty(page);
out: out:
...@@ -4757,7 +4769,7 @@ int btrfs_truncate_block(struct inode *inode, loff_t from, loff_t len, ...@@ -4757,7 +4769,7 @@ int btrfs_truncate_block(struct inode *inode, loff_t from, loff_t len,
0, 0, &cached_state, GFP_NOFS); 0, 0, &cached_state, GFP_NOFS);
ret = btrfs_set_extent_delalloc(inode, block_start, block_end, ret = btrfs_set_extent_delalloc(inode, block_start, block_end,
&cached_state); &cached_state, 0);
if (ret) { if (ret) {
unlock_extent_cached(io_tree, block_start, block_end, unlock_extent_cached(io_tree, block_start, block_end,
&cached_state, GFP_NOFS); &cached_state, GFP_NOFS);
...@@ -9054,7 +9066,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) ...@@ -9054,7 +9066,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
0, 0, &cached_state, GFP_NOFS); 0, 0, &cached_state, GFP_NOFS);
ret = btrfs_set_extent_delalloc(inode, page_start, end, ret = btrfs_set_extent_delalloc(inode, page_start, end,
&cached_state); &cached_state, 0);
if (ret) { if (ret) {
unlock_extent_cached(io_tree, page_start, page_end, unlock_extent_cached(io_tree, page_start, page_end,
&cached_state, GFP_NOFS); &cached_state, GFP_NOFS);
......
...@@ -3203,7 +3203,7 @@ static int relocate_file_extent_cluster(struct inode *inode, ...@@ -3203,7 +3203,7 @@ static int relocate_file_extent_cluster(struct inode *inode,
nr++; nr++;
} }
btrfs_set_extent_delalloc(inode, page_start, page_end, NULL); btrfs_set_extent_delalloc(inode, page_start, page_end, NULL, 0);
set_page_dirty(page); set_page_dirty(page);
unlock_extent(&BTRFS_I(inode)->io_tree, unlock_extent(&BTRFS_I(inode)->io_tree,
......
...@@ -968,7 +968,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize) ...@@ -968,7 +968,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
/* [BTRFS_MAX_EXTENT_SIZE] */ /* [BTRFS_MAX_EXTENT_SIZE] */
BTRFS_I(inode)->outstanding_extents++; BTRFS_I(inode)->outstanding_extents++;
ret = btrfs_set_extent_delalloc(inode, 0, BTRFS_MAX_EXTENT_SIZE - 1, ret = btrfs_set_extent_delalloc(inode, 0, BTRFS_MAX_EXTENT_SIZE - 1,
NULL); NULL, 0);
if (ret) { if (ret) {
test_msg("btrfs_set_extent_delalloc returned %d\n", ret); test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
goto out; goto out;
...@@ -984,7 +984,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize) ...@@ -984,7 +984,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
BTRFS_I(inode)->outstanding_extents++; BTRFS_I(inode)->outstanding_extents++;
ret = btrfs_set_extent_delalloc(inode, BTRFS_MAX_EXTENT_SIZE, ret = btrfs_set_extent_delalloc(inode, BTRFS_MAX_EXTENT_SIZE,
BTRFS_MAX_EXTENT_SIZE + sectorsize - 1, BTRFS_MAX_EXTENT_SIZE + sectorsize - 1,
NULL); NULL, 0);
if (ret) { if (ret) {
test_msg("btrfs_set_extent_delalloc returned %d\n", ret); test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
goto out; goto out;
...@@ -1019,7 +1019,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize) ...@@ -1019,7 +1019,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
ret = btrfs_set_extent_delalloc(inode, BTRFS_MAX_EXTENT_SIZE >> 1, ret = btrfs_set_extent_delalloc(inode, BTRFS_MAX_EXTENT_SIZE >> 1,
(BTRFS_MAX_EXTENT_SIZE >> 1) (BTRFS_MAX_EXTENT_SIZE >> 1)
+ sectorsize - 1, + sectorsize - 1,
NULL); NULL, 0);
if (ret) { if (ret) {
test_msg("btrfs_set_extent_delalloc returned %d\n", ret); test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
goto out; goto out;
...@@ -1042,7 +1042,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize) ...@@ -1042,7 +1042,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
ret = btrfs_set_extent_delalloc(inode, ret = btrfs_set_extent_delalloc(inode,
BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize, BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize,
(BTRFS_MAX_EXTENT_SIZE << 1) + 3 * sectorsize - 1, (BTRFS_MAX_EXTENT_SIZE << 1) + 3 * sectorsize - 1,
NULL); NULL, 0);
if (ret) { if (ret) {
test_msg("btrfs_set_extent_delalloc returned %d\n", ret); test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
goto out; goto out;
...@@ -1060,7 +1060,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize) ...@@ -1060,7 +1060,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
BTRFS_I(inode)->outstanding_extents++; BTRFS_I(inode)->outstanding_extents++;
ret = btrfs_set_extent_delalloc(inode, ret = btrfs_set_extent_delalloc(inode,
BTRFS_MAX_EXTENT_SIZE + sectorsize, BTRFS_MAX_EXTENT_SIZE + sectorsize,
BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1, NULL); BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1, NULL, 0);
if (ret) { if (ret) {
test_msg("btrfs_set_extent_delalloc returned %d\n", ret); test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
goto out; goto out;
...@@ -1097,7 +1097,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize) ...@@ -1097,7 +1097,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
BTRFS_I(inode)->outstanding_extents++; BTRFS_I(inode)->outstanding_extents++;
ret = btrfs_set_extent_delalloc(inode, ret = btrfs_set_extent_delalloc(inode,
BTRFS_MAX_EXTENT_SIZE + sectorsize, BTRFS_MAX_EXTENT_SIZE + sectorsize,
BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1, NULL); BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1, NULL, 0);
if (ret) { if (ret) {
test_msg("btrfs_set_extent_delalloc returned %d\n", ret); test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
goto out; goto out;
......
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