aboutsummaryrefslogtreecommitdiffstats
path: root/mm/filemap.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-05-02 14:18:50 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-05-02 14:18:50 -0400
commit5b13475a5e12c49c24422ba1bd9998521dec1d4e (patch)
tree41051b43641e7649f0074c9565bf4a0a512bab6d /mm/filemap.c
parent6fd4e7f7744bd7859ca3cae19c4613252ebb6bff (diff)
parenta6a5993243550b09f620941dea741b7421fdf79c (diff)
Merge branch 'work.iov_iter' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull iov_iter updates from Al Viro: "Cleanups that sat in -next + -stable fodder that has just missed 4.11. There's more iov_iter work in my local tree, but I'd prefer to push the stuff that had been in -next first" * 'work.iov_iter' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: iov_iter: don't revert iov buffer if csum error generic_file_read_iter(): make use of iov_iter_revert() generic_file_direct_write(): make use of iov_iter_revert() orangefs: use iov_iter_revert() sctp: switch to copy_from_iter_full() net/9p: switch to copy_from_iter_full() switch memcpy_from_msg() to copy_from_iter_full() rds: make use of iov_iter_revert()
Diffstat (limited to 'mm/filemap.c')
-rw-r--r--mm/filemap.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index c5808b7a5fb1..dc59c5f35b37 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2035,7 +2035,6 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
2035 if (iocb->ki_flags & IOCB_DIRECT) { 2035 if (iocb->ki_flags & IOCB_DIRECT) {
2036 struct address_space *mapping = file->f_mapping; 2036 struct address_space *mapping = file->f_mapping;
2037 struct inode *inode = mapping->host; 2037 struct inode *inode = mapping->host;
2038 struct iov_iter data = *iter;
2039 loff_t size; 2038 loff_t size;
2040 2039
2041 size = i_size_read(inode); 2040 size = i_size_read(inode);
@@ -2046,11 +2045,12 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
2046 2045
2047 file_accessed(file); 2046 file_accessed(file);
2048 2047
2049 retval = mapping->a_ops->direct_IO(iocb, &data); 2048 retval = mapping->a_ops->direct_IO(iocb, iter);
2050 if (retval >= 0) { 2049 if (retval >= 0) {
2051 iocb->ki_pos += retval; 2050 iocb->ki_pos += retval;
2052 iov_iter_advance(iter, retval); 2051 count -= retval;
2053 } 2052 }
2053 iov_iter_revert(iter, iov_iter_count(iter) - count);
2054 2054
2055 /* 2055 /*
2056 * Btrfs can have a short DIO read if we encounter 2056 * Btrfs can have a short DIO read if we encounter
@@ -2061,7 +2061,7 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
2061 * the rest of the read. Buffered reads will not work for 2061 * the rest of the read. Buffered reads will not work for
2062 * DAX files, so don't bother trying. 2062 * DAX files, so don't bother trying.
2063 */ 2063 */
2064 if (retval < 0 || !iov_iter_count(iter) || iocb->ki_pos >= size || 2064 if (retval < 0 || !count || iocb->ki_pos >= size ||
2065 IS_DAX(inode)) 2065 IS_DAX(inode))
2066 goto out; 2066 goto out;
2067 } 2067 }
@@ -2706,7 +2706,6 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
2706 ssize_t written; 2706 ssize_t written;
2707 size_t write_len; 2707 size_t write_len;
2708 pgoff_t end; 2708 pgoff_t end;
2709 struct iov_iter data;
2710 2709
2711 write_len = iov_iter_count(from); 2710 write_len = iov_iter_count(from);
2712 end = (pos + write_len - 1) >> PAGE_SHIFT; 2711 end = (pos + write_len - 1) >> PAGE_SHIFT;
@@ -2735,8 +2734,7 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
2735 } 2734 }
2736 } 2735 }
2737 2736
2738 data = *from; 2737 written = mapping->a_ops->direct_IO(iocb, from);
2739 written = mapping->a_ops->direct_IO(iocb, &data);
2740 2738
2741 /* 2739 /*
2742 * Finally, try again to invalidate clean pages which might have been 2740 * Finally, try again to invalidate clean pages which might have been
@@ -2753,13 +2751,14 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
2753 2751
2754 if (written > 0) { 2752 if (written > 0) {
2755 pos += written; 2753 pos += written;
2756 iov_iter_advance(from, written); 2754 write_len -= written;
2757 if (pos > i_size_read(inode) && !S_ISBLK(inode->i_mode)) { 2755 if (pos > i_size_read(inode) && !S_ISBLK(inode->i_mode)) {
2758 i_size_write(inode, pos); 2756 i_size_write(inode, pos);
2759 mark_inode_dirty(inode); 2757 mark_inode_dirty(inode);
2760 } 2758 }
2761 iocb->ki_pos = pos; 2759 iocb->ki_pos = pos;
2762 } 2760 }
2761 iov_iter_revert(from, write_len - iov_iter_count(from));
2763out: 2762out:
2764 return written; 2763 return written;
2765} 2764}