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 > >