Commit 6e65ae76 authored by Goldwyn Rodrigues's avatar Goldwyn Rodrigues Committed by David Sterba
Browse files

btrfs: remove force argument from run_delalloc_nocow()



force_cow can be calculated from inode and does not need to be passed as
an argument.

This simplifies run_delalloc_nocow() call from btrfs_run_delalloc_range()
A new function, should_nocow() checks if the range should be NOCOWed or
not. The function returns true iff either BTRFS_INODE_NODATA or
BTRFS_INODE_PREALLOC, but is not a defrag extent.

Tested-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent d6ade689
Loading
Loading
Loading
Loading
+13 −24
Original line number Diff line number Diff line
@@ -1516,7 +1516,7 @@ static int fallback_to_cow(struct btrfs_inode *inode, struct page *locked_page,
static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
				       struct page *locked_page,
				       const u64 start, const u64 end,
				       int *page_started, int force,
				       int *page_started,
				       unsigned long *nr_written)
{
	struct btrfs_fs_info *fs_info = inode->root->fs_info;
@@ -1530,6 +1530,7 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
	u64 ino = btrfs_ino(inode);
	bool nocow = false;
	u64 disk_bytenr = 0;
	const bool force = inode->flags & BTRFS_INODE_NODATACOW;

	path = btrfs_alloc_path();
	if (!path) {
@@ -1863,23 +1864,16 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
	return ret;
}

static inline int need_force_cow(struct btrfs_inode *inode, u64 start, u64 end)
static bool should_nocow(struct btrfs_inode *inode, u64 start, u64 end)
{

	if (!(inode->flags & BTRFS_INODE_NODATACOW) &&
	    !(inode->flags & BTRFS_INODE_PREALLOC))
		return 0;

	/*
	 * @defrag_bytes is a hint value, no spinlock held here,
	 * if is not zero, it means the file is defragging.
	 * Force cow if given extent needs to be defragged.
	 */
	if (inode->flags & (BTRFS_INODE_NODATACOW | BTRFS_INODE_PREALLOC)) {
		if (inode->defrag_bytes &&
	    test_range_bit(&inode->io_tree, start, end, EXTENT_DEFRAG, 0, NULL))
		return 1;

	return 0;
		    test_range_bit(&inode->io_tree, start, end, EXTENT_DEFRAG,
				   0, NULL))
			return false;
		return true;
	}
	return false;
}

/*
@@ -1891,17 +1885,12 @@ int btrfs_run_delalloc_range(struct btrfs_inode *inode, struct page *locked_page
		struct writeback_control *wbc)
{
	int ret;
	int force_cow = need_force_cow(inode, start, end);
	const bool zoned = btrfs_is_zoned(inode->root->fs_info);

	if (inode->flags & BTRFS_INODE_NODATACOW && !force_cow) {
	if (should_nocow(inode, start, end)) {
		ASSERT(!zoned);
		ret = run_delalloc_nocow(inode, locked_page, start, end,
					 page_started, 1, nr_written);
	} else if (inode->flags & BTRFS_INODE_PREALLOC && !force_cow) {
		ASSERT(!zoned);
		ret = run_delalloc_nocow(inode, locked_page, start, end,
					 page_started, 0, nr_written);
					 page_started, nr_written);
	} else if (!inode_can_compress(inode) ||
		   !inode_need_compress(inode, start, end)) {
		if (zoned)