Re: [PATCH v2 08/12] dax: advance the iomap_iter on dedupe range

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Feb 19, 2025 at 12:50:46PM -0500, Brian Foster wrote:
> Advance the iter on successful dedupe. Dedupe range uses two iters
> and iterates so long as both have outstanding work, so
> correspondingly this needs to advance both on each iteration. Since
> dax_range_compare_iter() now returns status instead of a byte count,
> update the variable name in the caller as well.
> 
> Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx>

Double iterators, hrhghghggh
Reviewed-by: "Darrick J. Wong" <djwong@xxxxxxxxxx>

--D

> ---
>  fs/dax.c | 21 ++++++++++++++-------
>  1 file changed, 14 insertions(+), 7 deletions(-)
> 
> diff --git a/fs/dax.c b/fs/dax.c
> index c0fbab8c66f7..c8c0d81122ab 100644
> --- a/fs/dax.c
> +++ b/fs/dax.c
> @@ -2001,12 +2001,13 @@ vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf, unsigned int order,
>  }
>  EXPORT_SYMBOL_GPL(dax_finish_sync_fault);
>  
> -static loff_t dax_range_compare_iter(struct iomap_iter *it_src,
> +static int dax_range_compare_iter(struct iomap_iter *it_src,
>  		struct iomap_iter *it_dest, u64 len, bool *same)
>  {
>  	const struct iomap *smap = &it_src->iomap;
>  	const struct iomap *dmap = &it_dest->iomap;
>  	loff_t pos1 = it_src->pos, pos2 = it_dest->pos;
> +	u64 dest_len;
>  	void *saddr, *daddr;
>  	int id, ret;
>  
> @@ -2014,7 +2015,7 @@ static loff_t dax_range_compare_iter(struct iomap_iter *it_src,
>  
>  	if (smap->type == IOMAP_HOLE && dmap->type == IOMAP_HOLE) {
>  		*same = true;
> -		return len;
> +		goto advance;
>  	}
>  
>  	if (smap->type == IOMAP_HOLE || dmap->type == IOMAP_HOLE) {
> @@ -2037,7 +2038,13 @@ static loff_t dax_range_compare_iter(struct iomap_iter *it_src,
>  	if (!*same)
>  		len = 0;
>  	dax_read_unlock(id);
> -	return len;
> +
> +advance:
> +	dest_len = len;
> +	ret = iomap_iter_advance(it_src, &len);
> +	if (!ret)
> +		ret = iomap_iter_advance(it_dest, &dest_len);
> +	return ret;
>  
>  out_unlock:
>  	dax_read_unlock(id);
> @@ -2060,15 +2067,15 @@ int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
>  		.len		= len,
>  		.flags		= IOMAP_DAX,
>  	};
> -	int ret, compared = 0;
> +	int ret, status;
>  
>  	while ((ret = iomap_iter(&src_iter, ops)) > 0 &&
>  	       (ret = iomap_iter(&dst_iter, ops)) > 0) {
> -		compared = dax_range_compare_iter(&src_iter, &dst_iter,
> +		status = dax_range_compare_iter(&src_iter, &dst_iter,
>  				min(src_iter.len, dst_iter.len), same);
> -		if (compared < 0)
> +		if (status < 0)
>  			return ret;
> -		src_iter.processed = dst_iter.processed = compared;
> +		src_iter.processed = dst_iter.processed = status;
>  	}
>  	return ret;
>  }
> -- 
> 2.48.1
> 
> 




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux