mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 08:33:17 +02:00
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>
This commit is contained in:
parent
d9dc477ff6
commit
8fecec46d1
|
|
@ -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 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
|
|||
/* 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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user