aboutsummaryrefslogtreecommitdiffstats
path: root/mm/filemap.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-04-13 14:10:15 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-04-21 13:57:36 -0400
commit639a93a521c759ddb32cc875f3ea1965072b2cbc (patch)
treef56a54d0824b1c87e05646b592657a6c30193065 /mm/filemap.c
parentc63ed807d1fca901d6b463deb3ceeced4969384e (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.c7
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));
2761out: 2760out:
2762 return written; 2761 return written;
2763} 2762}