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: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Родитель
897a41b116
Коммит
ba8b04c1d4
|
@ -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 nr);
|
||||
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,
|
||||
struct btrfs_root *new_root,
|
||||
struct btrfs_root *parent_root,
|
||||
|
|
|
@ -1730,7 +1730,7 @@ out_failed:
|
|||
}
|
||||
|
||||
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 long page_ops)
|
||||
{
|
||||
|
|
|
@ -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_redirty_for_io(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 long page_ops);
|
||||
struct bio *
|
||||
|
|
|
@ -503,7 +503,7 @@ int btrfs_dirty_pages(struct btrfs_root *root, struct inode *inode,
|
|||
|
||||
end_of_last_block = start_pos + num_bytes - 1;
|
||||
err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block,
|
||||
cached);
|
||||
cached, 0);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
|
|
@ -560,8 +560,9 @@ cont:
|
|||
* we don't need to create any more async work items.
|
||||
* Unlock and free up our temp pages.
|
||||
*/
|
||||
extent_clear_unlock_delalloc(inode, start, end, NULL,
|
||||
clear_flags, PAGE_UNLOCK |
|
||||
extent_clear_unlock_delalloc(inode, start, end, end,
|
||||
NULL, clear_flags,
|
||||
PAGE_UNLOCK |
|
||||
PAGE_CLEAR_DIRTY |
|
||||
PAGE_SET_WRITEBACK |
|
||||
page_error_op |
|
||||
|
@ -835,6 +836,8 @@ retry:
|
|||
* clear dirty, set writeback and unlock the pages.
|
||||
*/
|
||||
extent_clear_unlock_delalloc(inode, async_extent->start,
|
||||
async_extent->start +
|
||||
async_extent->ram_size - 1,
|
||||
async_extent->start +
|
||||
async_extent->ram_size - 1,
|
||||
NULL, EXTENT_LOCKED | EXTENT_DELALLOC,
|
||||
|
@ -856,7 +859,8 @@ retry:
|
|||
tree->ops->writepage_end_io_hook(p, start, end,
|
||||
NULL, 0);
|
||||
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_SET_ERROR);
|
||||
free_async_extent_pages(async_extent);
|
||||
|
@ -871,6 +875,8 @@ out_free_reserve:
|
|||
btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1);
|
||||
out_free:
|
||||
extent_clear_unlock_delalloc(inode, async_extent->start,
|
||||
async_extent->start +
|
||||
async_extent->ram_size - 1,
|
||||
async_extent->start +
|
||||
async_extent->ram_size - 1,
|
||||
NULL, EXTENT_LOCKED | EXTENT_DELALLOC |
|
||||
|
@ -966,7 +972,8 @@ static noinline int cow_file_range(struct inode *inode,
|
|||
ret = cow_file_range_inline(root, inode, start, end, 0, 0,
|
||||
NULL);
|
||||
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_DEFRAG, PAGE_UNLOCK |
|
||||
PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
|
||||
|
@ -1062,7 +1069,8 @@ static noinline int cow_file_range(struct inode *inode,
|
|||
op |= PAGE_SET_PRIVATE2;
|
||||
|
||||
extent_clear_unlock_delalloc(inode, start,
|
||||
start + ram_size - 1, locked_page,
|
||||
start + ram_size - 1,
|
||||
delalloc_end, locked_page,
|
||||
EXTENT_LOCKED | EXTENT_DELALLOC,
|
||||
op);
|
||||
disk_num_bytes -= cur_alloc_size;
|
||||
|
@ -1079,7 +1087,8 @@ out_reserve:
|
|||
btrfs_dec_block_group_reservations(root->fs_info, ins.objectid);
|
||||
btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1);
|
||||
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_DELALLOC | EXTENT_DEFRAG,
|
||||
PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
|
||||
|
@ -1258,7 +1267,8 @@ static noinline int run_delalloc_nocow(struct inode *inode,
|
|||
|
||||
path = btrfs_alloc_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_DO_ACCOUNTING |
|
||||
EXTENT_DEFRAG, PAGE_UNLOCK |
|
||||
|
@ -1276,7 +1286,8 @@ static noinline int run_delalloc_nocow(struct inode *inode,
|
|||
trans = btrfs_join_transaction(root);
|
||||
|
||||
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_DO_ACCOUNTING |
|
||||
EXTENT_DEFRAG, PAGE_UNLOCK |
|
||||
|
@ -1490,7 +1501,7 @@ out_check:
|
|||
}
|
||||
|
||||
extent_clear_unlock_delalloc(inode, cur_offset,
|
||||
cur_offset + num_bytes - 1,
|
||||
cur_offset + num_bytes - 1, end,
|
||||
locked_page, EXTENT_LOCKED |
|
||||
EXTENT_DELALLOC |
|
||||
EXTENT_CLEAR_DATA_RESV,
|
||||
|
@ -1522,7 +1533,7 @@ error:
|
|||
ret = err;
|
||||
|
||||
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 |
|
||||
EXTENT_DELALLOC | EXTENT_DEFRAG |
|
||||
EXTENT_DO_ACCOUNTING, PAGE_UNLOCK |
|
||||
|
@ -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,
|
||||
struct extent_state **cached_state)
|
||||
struct extent_state **cached_state, int dedupe)
|
||||
{
|
||||
WARN_ON((end & (PAGE_SIZE - 1)) == 0);
|
||||
return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end,
|
||||
|
@ -2052,7 +2063,8 @@ again:
|
|||
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);
|
||||
set_page_dirty(page);
|
||||
out:
|
||||
|
@ -4757,7 +4769,7 @@ again:
|
|||
0, 0, &cached_state, GFP_NOFS);
|
||||
|
||||
ret = btrfs_set_extent_delalloc(inode, block_start, block_end,
|
||||
&cached_state);
|
||||
&cached_state, 0);
|
||||
if (ret) {
|
||||
unlock_extent_cached(io_tree, block_start, block_end,
|
||||
&cached_state, GFP_NOFS);
|
||||
|
@ -9054,7 +9066,7 @@ again:
|
|||
0, 0, &cached_state, GFP_NOFS);
|
||||
|
||||
ret = btrfs_set_extent_delalloc(inode, page_start, end,
|
||||
&cached_state);
|
||||
&cached_state, 0);
|
||||
if (ret) {
|
||||
unlock_extent_cached(io_tree, page_start, page_end,
|
||||
&cached_state, GFP_NOFS);
|
||||
|
|
|
@ -3203,7 +3203,7 @@ static int relocate_file_extent_cluster(struct inode *inode,
|
|||
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);
|
||||
|
||||
unlock_extent(&BTRFS_I(inode)->io_tree,
|
||||
|
|
|
@ -968,7 +968,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
|
|||
/* [BTRFS_MAX_EXTENT_SIZE] */
|
||||
BTRFS_I(inode)->outstanding_extents++;
|
||||
ret = btrfs_set_extent_delalloc(inode, 0, BTRFS_MAX_EXTENT_SIZE - 1,
|
||||
NULL);
|
||||
NULL, 0);
|
||||
if (ret) {
|
||||
test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
|
||||
goto out;
|
||||
|
@ -984,7 +984,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
|
|||
BTRFS_I(inode)->outstanding_extents++;
|
||||
ret = btrfs_set_extent_delalloc(inode, BTRFS_MAX_EXTENT_SIZE,
|
||||
BTRFS_MAX_EXTENT_SIZE + sectorsize - 1,
|
||||
NULL);
|
||||
NULL, 0);
|
||||
if (ret) {
|
||||
test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
|
||||
goto out;
|
||||
|
@ -1019,7 +1019,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
|
|||
ret = btrfs_set_extent_delalloc(inode, BTRFS_MAX_EXTENT_SIZE >> 1,
|
||||
(BTRFS_MAX_EXTENT_SIZE >> 1)
|
||||
+ sectorsize - 1,
|
||||
NULL);
|
||||
NULL, 0);
|
||||
if (ret) {
|
||||
test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
|
||||
goto out;
|
||||
|
@ -1042,7 +1042,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
|
|||
ret = btrfs_set_extent_delalloc(inode,
|
||||
BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize,
|
||||
(BTRFS_MAX_EXTENT_SIZE << 1) + 3 * sectorsize - 1,
|
||||
NULL);
|
||||
NULL, 0);
|
||||
if (ret) {
|
||||
test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
|
||||
goto out;
|
||||
|
@ -1060,7 +1060,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
|
|||
BTRFS_I(inode)->outstanding_extents++;
|
||||
ret = btrfs_set_extent_delalloc(inode,
|
||||
BTRFS_MAX_EXTENT_SIZE + sectorsize,
|
||||
BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1, NULL);
|
||||
BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1, NULL, 0);
|
||||
if (ret) {
|
||||
test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
|
||||
goto out;
|
||||
|
@ -1097,7 +1097,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
|
|||
BTRFS_I(inode)->outstanding_extents++;
|
||||
ret = btrfs_set_extent_delalloc(inode,
|
||||
BTRFS_MAX_EXTENT_SIZE + sectorsize,
|
||||
BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1, NULL);
|
||||
BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1, NULL, 0);
|
||||
if (ret) {
|
||||
test_msg("btrfs_set_extent_delalloc returned %d\n", ret);
|
||||
goto out;
|
||||
|
|
Загрузка…
Ссылка в новой задаче