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:
		
							parent
							
								
									897a41b116
								
							
						
					
					
						commit
						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 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 @@ out_failed: | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 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, | |||||||
| 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, | |||||||
| 
 | 
 | ||||||
| 	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 @@ cont: | |||||||
| 			 * 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 @@ retry: | |||||||
| 		 * 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 @@ retry: | |||||||
| 			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 @@ out_free_reserve: | |||||||
| 	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, | |||||||
| 		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, | |||||||
| 		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 @@ out_reserve: | |||||||
| 	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, | |||||||
| 
 | 
 | ||||||
| 	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, | |||||||
| 		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 @@ out_check: | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		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 @@ error: | |||||||
| 		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, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 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 @@ again: | |||||||
| 		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 @@ again: | |||||||
| 			  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 @@ again: | |||||||
| 			  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, | |||||||
| 			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) | |||||||
| 	/* [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) | |||||||
| 	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) | |||||||
| 	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) | |||||||
| 	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) | |||||||
| 	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) | |||||||
| 	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; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user