diff options
Diffstat (limited to 'fs/iomap.c')
-rw-r--r-- | fs/iomap.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/fs/iomap.c b/fs/iomap.c index 3ca1a8e44135..141c3cd55a8b 100644 --- a/fs/iomap.c +++ b/fs/iomap.c | |||
@@ -846,7 +846,8 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
846 | struct address_space *mapping = iocb->ki_filp->f_mapping; | 846 | struct address_space *mapping = iocb->ki_filp->f_mapping; |
847 | struct inode *inode = file_inode(iocb->ki_filp); | 847 | struct inode *inode = file_inode(iocb->ki_filp); |
848 | size_t count = iov_iter_count(iter); | 848 | size_t count = iov_iter_count(iter); |
849 | loff_t pos = iocb->ki_pos, end = iocb->ki_pos + count - 1, ret = 0; | 849 | loff_t pos = iocb->ki_pos, start = pos; |
850 | loff_t end = iocb->ki_pos + count - 1, ret = 0; | ||
850 | unsigned int flags = IOMAP_DIRECT; | 851 | unsigned int flags = IOMAP_DIRECT; |
851 | struct blk_plug plug; | 852 | struct blk_plug plug; |
852 | struct iomap_dio *dio; | 853 | struct iomap_dio *dio; |
@@ -887,12 +888,12 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
887 | } | 888 | } |
888 | 889 | ||
889 | if (mapping->nrpages) { | 890 | if (mapping->nrpages) { |
890 | ret = filemap_write_and_wait_range(mapping, iocb->ki_pos, end); | 891 | ret = filemap_write_and_wait_range(mapping, start, end); |
891 | if (ret) | 892 | if (ret) |
892 | goto out_free_dio; | 893 | goto out_free_dio; |
893 | 894 | ||
894 | ret = invalidate_inode_pages2_range(mapping, | 895 | ret = invalidate_inode_pages2_range(mapping, |
895 | iocb->ki_pos >> PAGE_SHIFT, end >> PAGE_SHIFT); | 896 | start >> PAGE_SHIFT, end >> PAGE_SHIFT); |
896 | WARN_ON_ONCE(ret); | 897 | WARN_ON_ONCE(ret); |
897 | ret = 0; | 898 | ret = 0; |
898 | } | 899 | } |
@@ -941,6 +942,8 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
941 | __set_current_state(TASK_RUNNING); | 942 | __set_current_state(TASK_RUNNING); |
942 | } | 943 | } |
943 | 944 | ||
945 | ret = iomap_dio_complete(dio); | ||
946 | |||
944 | /* | 947 | /* |
945 | * Try again to invalidate clean pages which might have been cached by | 948 | * Try again to invalidate clean pages which might have been cached by |
946 | * non-direct readahead, or faulted in by get_user_pages() if the source | 949 | * non-direct readahead, or faulted in by get_user_pages() if the source |
@@ -949,12 +952,12 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
949 | * this invalidation fails, tough, the write still worked... | 952 | * this invalidation fails, tough, the write still worked... |
950 | */ | 953 | */ |
951 | if (iov_iter_rw(iter) == WRITE && mapping->nrpages) { | 954 | if (iov_iter_rw(iter) == WRITE && mapping->nrpages) { |
952 | ret = invalidate_inode_pages2_range(mapping, | 955 | int err = invalidate_inode_pages2_range(mapping, |
953 | iocb->ki_pos >> PAGE_SHIFT, end >> PAGE_SHIFT); | 956 | start >> PAGE_SHIFT, end >> PAGE_SHIFT); |
954 | WARN_ON_ONCE(ret); | 957 | WARN_ON_ONCE(err); |
955 | } | 958 | } |
956 | 959 | ||
957 | return iomap_dio_complete(dio); | 960 | return ret; |
958 | 961 | ||
959 | out_free_dio: | 962 | out_free_dio: |
960 | kfree(dio); | 963 | kfree(dio); |