diff options
Diffstat (limited to 'fs/iomap.c')
-rw-r--r-- | fs/iomap.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/iomap.c b/fs/iomap.c index 4b10892967a5..fa6cd5b3f578 100644 --- a/fs/iomap.c +++ b/fs/iomap.c | |||
@@ -672,8 +672,8 @@ static void iomap_dio_bio_end_io(struct bio *bio) | |||
672 | struct iomap_dio *dio = bio->bi_private; | 672 | struct iomap_dio *dio = bio->bi_private; |
673 | bool should_dirty = (dio->flags & IOMAP_DIO_DIRTY); | 673 | bool should_dirty = (dio->flags & IOMAP_DIO_DIRTY); |
674 | 674 | ||
675 | if (bio->bi_error) | 675 | if (bio->bi_status) |
676 | iomap_dio_set_error(dio, bio->bi_error); | 676 | iomap_dio_set_error(dio, blk_status_to_errno(bio->bi_status)); |
677 | 677 | ||
678 | if (atomic_dec_and_test(&dio->ref)) { | 678 | if (atomic_dec_and_test(&dio->ref)) { |
679 | if (is_sync_kiocb(dio->iocb)) { | 679 | if (is_sync_kiocb(dio->iocb)) { |
@@ -793,6 +793,7 @@ iomap_dio_actor(struct inode *inode, loff_t pos, loff_t length, | |||
793 | bio->bi_bdev = iomap->bdev; | 793 | bio->bi_bdev = iomap->bdev; |
794 | bio->bi_iter.bi_sector = | 794 | bio->bi_iter.bi_sector = |
795 | iomap->blkno + ((pos - iomap->offset) >> 9); | 795 | iomap->blkno + ((pos - iomap->offset) >> 9); |
796 | bio->bi_write_hint = dio->iocb->ki_hint; | ||
796 | bio->bi_private = dio; | 797 | bio->bi_private = dio; |
797 | bio->bi_end_io = iomap_dio_bio_end_io; | 798 | bio->bi_end_io = iomap_dio_bio_end_io; |
798 | 799 | ||
@@ -881,6 +882,14 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
881 | flags |= IOMAP_WRITE; | 882 | flags |= IOMAP_WRITE; |
882 | } | 883 | } |
883 | 884 | ||
885 | if (iocb->ki_flags & IOCB_NOWAIT) { | ||
886 | if (filemap_range_has_page(mapping, start, end)) { | ||
887 | ret = -EAGAIN; | ||
888 | goto out_free_dio; | ||
889 | } | ||
890 | flags |= IOMAP_NOWAIT; | ||
891 | } | ||
892 | |||
884 | ret = filemap_write_and_wait_range(mapping, start, end); | 893 | ret = filemap_write_and_wait_range(mapping, start, end); |
885 | if (ret) | 894 | if (ret) |
886 | goto out_free_dio; | 895 | goto out_free_dio; |