Skip to content

Commit 39eb051

Browse files
Brian Fosterbrauner
authored andcommitted
dax: advance the iomap_iter on dedupe range
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@redhat.com> Link: https://lore.kernel.org/r/20250224144757.237706-9-bfoster@redhat.com Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 9ba439c commit 39eb051

1 file changed

Lines changed: 14 additions & 7 deletions

File tree

fs/dax.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2001,20 +2001,21 @@ vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf, unsigned int order,
20012001
}
20022002
EXPORT_SYMBOL_GPL(dax_finish_sync_fault);
20032003

2004-
static loff_t dax_range_compare_iter(struct iomap_iter *it_src,
2004+
static int dax_range_compare_iter(struct iomap_iter *it_src,
20052005
struct iomap_iter *it_dest, u64 len, bool *same)
20062006
{
20072007
const struct iomap *smap = &it_src->iomap;
20082008
const struct iomap *dmap = &it_dest->iomap;
20092009
loff_t pos1 = it_src->pos, pos2 = it_dest->pos;
2010+
u64 dest_len;
20102011
void *saddr, *daddr;
20112012
int id, ret;
20122013

20132014
len = min(len, min(smap->length, dmap->length));
20142015

20152016
if (smap->type == IOMAP_HOLE && dmap->type == IOMAP_HOLE) {
20162017
*same = true;
2017-
return len;
2018+
goto advance;
20182019
}
20192020

20202021
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,
20372038
if (!*same)
20382039
len = 0;
20392040
dax_read_unlock(id);
2040-
return len;
2041+
2042+
advance:
2043+
dest_len = len;
2044+
ret = iomap_iter_advance(it_src, &len);
2045+
if (!ret)
2046+
ret = iomap_iter_advance(it_dest, &dest_len);
2047+
return ret;
20412048

20422049
out_unlock:
20432050
dax_read_unlock(id);
@@ -2060,15 +2067,15 @@ int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
20602067
.len = len,
20612068
.flags = IOMAP_DAX,
20622069
};
2063-
int ret, compared = 0;
2070+
int ret, status;
20642071

20652072
while ((ret = iomap_iter(&src_iter, ops)) > 0 &&
20662073
(ret = iomap_iter(&dst_iter, ops)) > 0) {
2067-
compared = dax_range_compare_iter(&src_iter, &dst_iter,
2074+
status = dax_range_compare_iter(&src_iter, &dst_iter,
20682075
min(src_iter.len, dst_iter.len), same);
2069-
if (compared < 0)
2076+
if (status < 0)
20702077
return ret;
2071-
src_iter.processed = dst_iter.processed = compared;
2078+
src_iter.processed = dst_iter.processed = status;
20722079
}
20732080
return ret;
20742081
}

0 commit comments

Comments
 (0)