diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-05-02 14:18:50 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-05-02 14:18:50 -0400 |
commit | 5b13475a5e12c49c24422ba1bd9998521dec1d4e (patch) | |
tree | 41051b43641e7649f0074c9565bf4a0a512bab6d /mm/filemap.c | |
parent | 6fd4e7f7744bd7859ca3cae19c4613252ebb6bff (diff) | |
parent | a6a5993243550b09f620941dea741b7421fdf79c (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.c | 15 |
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)); | ||
2763 | out: | 2762 | out: |
2764 | return written; | 2763 | return written; |
2765 | } | 2764 | } |