Skip to content

Commit d9dc477

Browse files
Brian Fosterbrauner
authored andcommitted
iomap: advance the iter directly on buffered read
iomap buffered read advances the iter via iter.processed. To continue separating iter advance from return status, update iomap_readpage_iter() to advance the iter instead of returning the number of bytes processed. In turn, drop the offset parameter and sample the updated iter->pos at the start of the function. Update the callers to loop based on remaining length in the current iteration instead of number of bytes processed. Signed-off-by: Brian Foster <bfoster@redhat.com> Link: https://lore.kernel.org/r/20250224144757.237706-2-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 30f5300 commit d9dc477

File tree

1 file changed

+20
-25
lines changed

1 file changed

+20
-25
lines changed

fs/iomap/buffered-io.c

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -362,15 +362,14 @@ static inline bool iomap_block_needs_zeroing(const struct iomap_iter *iter,
362362
pos >= i_size_read(iter->inode);
363363
}
364364

365-
static loff_t iomap_readpage_iter(const struct iomap_iter *iter,
366-
struct iomap_readpage_ctx *ctx, loff_t offset)
365+
static loff_t iomap_readpage_iter(struct iomap_iter *iter,
366+
struct iomap_readpage_ctx *ctx)
367367
{
368368
const struct iomap *iomap = &iter->iomap;
369-
loff_t pos = iter->pos + offset;
370-
loff_t length = iomap_length(iter) - offset;
369+
loff_t pos = iter->pos;
370+
loff_t length = iomap_length(iter);
371371
struct folio *folio = ctx->cur_folio;
372372
struct iomap_folio_state *ifs;
373-
loff_t orig_pos = pos;
374373
size_t poff, plen;
375374
sector_t sector;
376375

@@ -434,25 +433,22 @@ static loff_t iomap_readpage_iter(const struct iomap_iter *iter,
434433
* we can skip trailing ones as they will be handled in the next
435434
* iteration.
436435
*/
437-
return pos - orig_pos + plen;
436+
length = pos - iter->pos + plen;
437+
return iomap_iter_advance(iter, &length);
438438
}
439439

440-
static loff_t iomap_read_folio_iter(const struct iomap_iter *iter,
440+
static loff_t iomap_read_folio_iter(struct iomap_iter *iter,
441441
struct iomap_readpage_ctx *ctx)
442442
{
443-
struct folio *folio = ctx->cur_folio;
444-
size_t offset = offset_in_folio(folio, iter->pos);
445-
loff_t length = min_t(loff_t, folio_size(folio) - offset,
446-
iomap_length(iter));
447-
loff_t done, ret;
448-
449-
for (done = 0; done < length; done += ret) {
450-
ret = iomap_readpage_iter(iter, ctx, done);
451-
if (ret <= 0)
443+
loff_t ret;
444+
445+
while (iomap_length(iter)) {
446+
ret = iomap_readpage_iter(iter, ctx);
447+
if (ret)
452448
return ret;
453449
}
454450

455-
return done;
451+
return 0;
456452
}
457453

458454
int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops)
@@ -489,15 +485,14 @@ int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops)
489485
}
490486
EXPORT_SYMBOL_GPL(iomap_read_folio);
491487

492-
static loff_t iomap_readahead_iter(const struct iomap_iter *iter,
488+
static loff_t iomap_readahead_iter(struct iomap_iter *iter,
493489
struct iomap_readpage_ctx *ctx)
494490
{
495-
loff_t length = iomap_length(iter);
496-
loff_t done, ret;
491+
loff_t ret;
497492

498-
for (done = 0; done < length; done += ret) {
493+
while (iomap_length(iter)) {
499494
if (ctx->cur_folio &&
500-
offset_in_folio(ctx->cur_folio, iter->pos + done) == 0) {
495+
offset_in_folio(ctx->cur_folio, iter->pos) == 0) {
501496
if (!ctx->cur_folio_in_bio)
502497
folio_unlock(ctx->cur_folio);
503498
ctx->cur_folio = NULL;
@@ -506,12 +501,12 @@ static loff_t iomap_readahead_iter(const struct iomap_iter *iter,
506501
ctx->cur_folio = readahead_folio(ctx->rac);
507502
ctx->cur_folio_in_bio = false;
508503
}
509-
ret = iomap_readpage_iter(iter, ctx, done);
510-
if (ret <= 0)
504+
ret = iomap_readpage_iter(iter, ctx);
505+
if (ret)
511506
return ret;
512507
}
513508

514-
return done;
509+
return 0;
515510
}
516511

517512
/**

0 commit comments

Comments
 (0)