summaryrefslogtreecommitdiffstats
path: root/fs/iomap.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/iomap.c')
-rw-r--r--fs/iomap.c13
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;