Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iomap: set accurate iter->pos when reading folio ranges

Advance iter to the correct position before calling an IO helper to read
in a folio range. This allows the helper to reliably use iter->pos to
determine the starting offset for reading.

This will simplify the interface for reading in folio ranges when iomap
read/readahead supports caller-provided callbacks.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Suggested-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Joanne Koong and committed by
Christian Brauner
fb7a10ac d43558ae

+13 -8
+13 -8
fs/iomap/buffered-io.c
··· 375 375 } 376 376 377 377 static void iomap_bio_read_folio_range(const struct iomap_iter *iter, 378 - struct iomap_read_folio_ctx *ctx, loff_t pos, size_t plen) 378 + struct iomap_read_folio_ctx *ctx, size_t plen) 379 379 { 380 380 struct folio *folio = ctx->cur_folio; 381 381 const struct iomap *iomap = &iter->iomap; 382 + loff_t pos = iter->pos; 382 383 size_t poff = offset_in_folio(folio, pos); 383 384 loff_t length = iomap_length(iter); 384 385 sector_t sector; ··· 507 506 loff_t length = iomap_length(iter); 508 507 struct folio *folio = ctx->cur_folio; 509 508 size_t poff, plen; 510 - loff_t count; 509 + loff_t pos_diff; 511 510 int ret; 512 511 513 512 if (iomap->type == IOMAP_INLINE) { ··· 525 524 iomap_adjust_read_range(iter->inode, folio, &pos, length, &poff, 526 525 &plen); 527 526 528 - count = pos - iter->pos + plen; 529 - if (WARN_ON_ONCE(count > length)) 527 + pos_diff = pos - iter->pos; 528 + if (WARN_ON_ONCE(pos_diff + plen > length)) 530 529 return -EIO; 531 530 531 + ret = iomap_iter_advance(iter, pos_diff); 532 + if (ret) 533 + return ret; 534 + 532 535 if (plen == 0) 533 - return iomap_iter_advance(iter, count); 536 + return 0; 534 537 535 538 /* zero post-eof blocks as the page may be mapped */ 536 539 if (iomap_block_needs_zeroing(iter, pos)) { ··· 544 539 if (!*bytes_pending) 545 540 iomap_read_init(folio); 546 541 *bytes_pending += plen; 547 - iomap_bio_read_folio_range(iter, ctx, pos, plen); 542 + iomap_bio_read_folio_range(iter, ctx, plen); 548 543 } 549 544 550 - ret = iomap_iter_advance(iter, count); 545 + ret = iomap_iter_advance(iter, plen); 551 546 if (ret) 552 547 return ret; 553 - length -= count; 548 + length -= pos_diff + plen; 554 549 pos = iter->pos; 555 550 } 556 551 return 0;