mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 15:41:52 +02:00
iomap: fix inline data on buffered read
Previously, iomap_readpage_iter() returning 0 would break out of the loops of iomap_readahead_iter(), which is what iomap_read_inline_data() relies on. However, commitd9dc477ff6("iomap: advance the iter directly on buffered read") changes this behavior without calling iomap_iter_advance(), which causes EROFS to get stuck in iomap_readpage_iter(). It seems iomap_iter_advance() cannot be called in iomap_read_inline_data() because of the iomap_write_begin() path, so handle this in iomap_readpage_iter() instead. Reported-and-tested-by: Bo Liu <liubo03@inspur.com> Fixes:d9dc477ff6("iomap: advance the iter directly on buffered read") Cc: Brian Foster <bfoster@redhat.com> Cc: Christoph Hellwig <hch@lst.de> Cc: "Darrick J. Wong" <djwong@kernel.org> Cc: Christian Brauner <brauner@kernel.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20250319085125.4039368-1-hsiangkao@linux.alibaba.com Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
c7be0d72d5
commit
b26816b4e3
|
|
@ -372,9 +372,14 @@ static int iomap_readpage_iter(struct iomap_iter *iter,
|
|||
struct iomap_folio_state *ifs;
|
||||
size_t poff, plen;
|
||||
sector_t sector;
|
||||
int ret;
|
||||
|
||||
if (iomap->type == IOMAP_INLINE)
|
||||
return iomap_read_inline_data(iter, folio);
|
||||
if (iomap->type == IOMAP_INLINE) {
|
||||
ret = iomap_read_inline_data(iter, folio);
|
||||
if (ret)
|
||||
return ret;
|
||||
return iomap_iter_advance(iter, &length);
|
||||
}
|
||||
|
||||
/* zero post-eof blocks as the page may be mapped */
|
||||
ifs = ifs_alloc(iter->inode, folio, iter->flags);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user