iomap: fix the iomap_readpage_actor return value for inline data

The actor should never return a larger value than the length that was
passed in.  The current code handles this gracefully, but the opcoming
iter model will be more picky.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
Christoph Hellwig 2021-08-10 18:33:07 -07:00 committed by Darrick J. Wong
parent 1acd9e9c01
commit 740499c784
1 changed files with 2 additions and 2 deletions

View File

@ -205,7 +205,7 @@ struct iomap_readpage_ctx {
struct readahead_control *rac; struct readahead_control *rac;
}; };
static int iomap_read_inline_data(struct inode *inode, struct page *page, static loff_t iomap_read_inline_data(struct inode *inode, struct page *page,
const struct iomap *iomap) const struct iomap *iomap)
{ {
size_t size = i_size_read(inode) - iomap->offset; size_t size = i_size_read(inode) - iomap->offset;
@ -253,7 +253,7 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
sector_t sector; sector_t sector;
if (iomap->type == IOMAP_INLINE) if (iomap->type == IOMAP_INLINE)
return iomap_read_inline_data(inode, page, iomap); return min(iomap_read_inline_data(inode, page, iomap), length);
/* zero post-eof blocks as the page may be mapped */ /* zero post-eof blocks as the page may be mapped */
iop = iomap_page_create(inode, page); iop = iomap_page_create(inode, page);