diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-04-13 14:10:15 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-04-21 13:57:36 -0400 |
commit | 639a93a521c759ddb32cc875f3ea1965072b2cbc (patch) | |
tree | f56a54d0824b1c87e05646b592657a6c30193065 /mm/filemap.c | |
parent | c63ed807d1fca901d6b463deb3ceeced4969384e (diff) |
generic_file_direct_write(): make use of iov_iter_revert()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 1694623a6289..9f788eecd2c5 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -2704,7 +2704,6 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from) | |||
2704 | ssize_t written; | 2704 | ssize_t written; |
2705 | size_t write_len; | 2705 | size_t write_len; |
2706 | pgoff_t end; | 2706 | pgoff_t end; |
2707 | struct iov_iter data; | ||
2708 | 2707 | ||
2709 | write_len = iov_iter_count(from); | 2708 | write_len = iov_iter_count(from); |
2710 | end = (pos + write_len - 1) >> PAGE_SHIFT; | 2709 | end = (pos + write_len - 1) >> PAGE_SHIFT; |
@@ -2733,8 +2732,7 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from) | |||
2733 | } | 2732 | } |
2734 | } | 2733 | } |
2735 | 2734 | ||
2736 | data = *from; | 2735 | written = mapping->a_ops->direct_IO(iocb, from); |
2737 | written = mapping->a_ops->direct_IO(iocb, &data); | ||
2738 | 2736 | ||
2739 | /* | 2737 | /* |
2740 | * Finally, try again to invalidate clean pages which might have been | 2738 | * Finally, try again to invalidate clean pages which might have been |
@@ -2751,13 +2749,14 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from) | |||
2751 | 2749 | ||
2752 | if (written > 0) { | 2750 | if (written > 0) { |
2753 | pos += written; | 2751 | pos += written; |
2754 | iov_iter_advance(from, written); | 2752 | write_len -= written; |
2755 | if (pos > i_size_read(inode) && !S_ISBLK(inode->i_mode)) { | 2753 | if (pos > i_size_read(inode) && !S_ISBLK(inode->i_mode)) { |
2756 | i_size_write(inode, pos); | 2754 | i_size_write(inode, pos); |
2757 | mark_inode_dirty(inode); | 2755 | mark_inode_dirty(inode); |
2758 | } | 2756 | } |
2759 | iocb->ki_pos = pos; | 2757 | iocb->ki_pos = pos; |
2760 | } | 2758 | } |
2759 | iov_iter_revert(from, write_len - iov_iter_count(from)); | ||
2761 | out: | 2760 | out: |
2762 | return written; | 2761 | return written; |
2763 | } | 2762 | } |