Skip to content

Commit b51d30f

Browse files
Brian Fosterbrauner
authored andcommitted
iomap: export iomap_iter_advance() and return remaining length
As a final step for generic iter advance, export the helper and update it to return the remaining length of the current iteration after the advance. This will usually be 0 in the iomap_iter() case, but will be useful for the various operations that iterate on their own and will be updated to advance as they progress. Signed-off-by: Brian Foster <bfoster@redhat.com> Link: https://lore.kernel.org/r/20250207143253.314068-7-bfoster@redhat.com Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent b26f2ea commit b51d30f

File tree

2 files changed

+9
-14
lines changed

2 files changed

+9
-14
lines changed

fs/iomap/iter.c

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,16 @@ static inline void iomap_iter_reset_iomap(struct iomap_iter *iter)
1515
}
1616

1717
/*
18-
* Advance to the next range we need to map.
19-
*
20-
* If the iomap is marked IOMAP_F_STALE, it means the existing map was not fully
21-
* processed - it was aborted because the extent the iomap spanned may have been
22-
* changed during the operation. In this case, the iteration behaviour is to
23-
* remap the unprocessed range of the iter, and that means we may need to remap
24-
* even when we've made no progress (i.e. count = 0). Hence the "finished
25-
* iterating" case needs to distinguish between (count = 0) meaning we are done
26-
* and (count = 0 && stale) meaning we need to remap the entire remaining range.
18+
* Advance the current iterator position and output the length remaining for the
19+
* current mapping.
2720
*/
28-
static inline int iomap_iter_advance(struct iomap_iter *iter, s64 count)
21+
int iomap_iter_advance(struct iomap_iter *iter, u64 *count)
2922
{
30-
if (WARN_ON_ONCE(count > iomap_length(iter)))
23+
if (WARN_ON_ONCE(*count > iomap_length(iter)))
3124
return -EIO;
32-
iter->pos += count;
33-
iter->len -= count;
25+
iter->pos += *count;
26+
iter->len -= *count;
27+
*count = iomap_length(iter);
3428
return 0;
3529
}
3630

@@ -93,7 +87,7 @@ int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops)
9387
* advanced at all (i.e. no work was done for some reason) unless the
9488
* mapping has been marked stale and needs to be reprocessed.
9589
*/
96-
ret = iomap_iter_advance(iter, processed);
90+
ret = iomap_iter_advance(iter, &processed);
9791
if (!ret && iter->len > 0)
9892
ret = 1;
9993
if (ret > 0 && !iter->processed && !stale)

include/linux/iomap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ struct iomap_iter {
236236
};
237237

238238
int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops);
239+
int iomap_iter_advance(struct iomap_iter *iter, u64 *count);
239240

240241
/**
241242
* iomap_length_trim - trimmed length of the current iomap iteration

0 commit comments

Comments
 (0)