diff options
| author | Brian Foster <bfoster@redhat.com> | 2025-02-24 17:47:47 +0300 | 
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2025-02-26 11:42:35 +0300 | 
| commit | 8fecec46d10bafbce5d511c764ae2c2061b9adda (patch) | |
| tree | cad6ce59a178f139c3ec098d851881b95662ddd3 | |
| parent | d9dc477ff6a25c3812be2b24d81add8e6561c6ed (diff) | |
| download | linux-8fecec46d10bafbce5d511c764ae2c2061b9adda.tar.xz | |
iomap: advance the iter on direct I/O
Update iomap direct I/O to advance the iter directly rather than via
iter.processed. Update each mapping type helper to advance based on
the amount of data processed and return success or failure.
Signed-off-by: Brian Foster <bfoster@redhat.com>
Link: https://lore.kernel.org/r/20250224144757.237706-3-bfoster@redhat.com
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
| -rw-r--r-- | fs/iomap/direct-io.c | 22 | 
1 files changed, 9 insertions, 13 deletions
diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c index 138d246ec29d..8ebd5b3019a7 100644 --- a/fs/iomap/direct-io.c +++ b/fs/iomap/direct-io.c @@ -335,8 +335,7 @@ static inline blk_opf_t iomap_dio_bio_opflags(struct iomap_dio *dio,  	return opflags;  } -static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter, -		struct iomap_dio *dio) +static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)  {  	const struct iomap *iomap = &iter->iomap;  	struct inode *inode = iter->inode; @@ -349,7 +348,7 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,  	bool need_zeroout = false;  	bool use_fua = false;  	int nr_pages, ret = 0; -	size_t copied = 0; +	u64 copied = 0;  	size_t orig_count;  	if (atomic && length != fs_block_size) @@ -513,30 +512,28 @@ out:  	/* Undo iter limitation to current extent */  	iov_iter_reexpand(dio->submit.iter, orig_count - copied);  	if (copied) -		return copied; +		return iomap_iter_advance(iter, &copied);  	return ret;  } -static loff_t iomap_dio_hole_iter(const struct iomap_iter *iter, -		struct iomap_dio *dio) +static int iomap_dio_hole_iter(struct iomap_iter *iter, struct iomap_dio *dio)  {  	loff_t length = iov_iter_zero(iomap_length(iter), dio->submit.iter);  	dio->size += length;  	if (!length)  		return -EFAULT; -	return length; +	return iomap_iter_advance(iter, &length);  } -static loff_t iomap_dio_inline_iter(const struct iomap_iter *iomi, -		struct iomap_dio *dio) +static int iomap_dio_inline_iter(struct iomap_iter *iomi, struct iomap_dio *dio)  {  	const struct iomap *iomap = &iomi->iomap;  	struct iov_iter *iter = dio->submit.iter;  	void *inline_data = iomap_inline_data(iomap, iomi->pos);  	loff_t length = iomap_length(iomi);  	loff_t pos = iomi->pos; -	size_t copied; +	u64 copied;  	if (WARN_ON_ONCE(!iomap_inline_data_valid(iomap)))  		return -EIO; @@ -558,11 +555,10 @@ static loff_t iomap_dio_inline_iter(const struct iomap_iter *iomi,  	dio->size += copied;  	if (!copied)  		return -EFAULT; -	return copied; +	return iomap_iter_advance(iomi, &copied);  } -static loff_t iomap_dio_iter(const struct iomap_iter *iter, -		struct iomap_dio *dio) +static int iomap_dio_iter(struct iomap_iter *iter, struct iomap_dio *dio)  {  	switch (iter->iomap.type) {  	case IOMAP_HOLE:  | 
