aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-05-17 18:05:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-17 18:05:23 -0400
commitc2e7b207058d4ff6a9010430763fb561f307eb67 (patch)
tree8983947c4d62365de3d98113662ff9e643a42a0f
parentc52b76185b7a1b300e5f15ff871c8f45ced3dee9 (diff)
parent24368aad47dc65b45040d6a31bfd6df1d6f3ec97 (diff)
Merge branch 'work.preadv2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs cleanups from Al Viro: "More cleanups from Christoph" * 'work.preadv2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: nfsd: use RWF_SYNC fs: add RWF_DSYNC aand RWF_SYNC ceph: use generic_write_sync fs: simplify the generic_write_sync prototype fs: add IOCB_SYNC and IOCB_DSYNC direct-io: remove the offset argument to dio_complete direct-io: eliminate the offset argument to ->direct_IO xfs: eliminate the pos variable in xfs_file_dio_aio_write filemap: remove the pos argument to generic_file_direct_write filemap: remove pos variables in generic_file_read_iter
-rw-r--r--Documentation/filesystems/Locking2
-rw-r--r--Documentation/filesystems/vfs.txt2
-rw-r--r--drivers/staging/lustre/lustre/llite/rw26.c4
-rw-r--r--fs/9p/vfs_addr.c3
-rw-r--r--fs/affs/file.c5
-rw-r--r--fs/block_dev.c14
-rw-r--r--fs/btrfs/file.c16
-rw-r--r--fs/btrfs/inode.c6
-rw-r--r--fs/ceph/addr.c3
-rw-r--r--fs/ceph/file.c11
-rw-r--r--fs/cifs/file.c9
-rw-r--r--fs/dax.c4
-rw-r--r--fs/direct-io.c34
-rw-r--r--fs/exofs/inode.c3
-rw-r--r--fs/ext2/inode.c8
-rw-r--r--fs/ext4/ext4.h3
-rw-r--r--fs/ext4/file.c9
-rw-r--r--fs/ext4/indirect.c12
-rw-r--r--fs/ext4/inode.c18
-rw-r--r--fs/f2fs/data.c6
-rw-r--r--fs/f2fs/file.c9
-rw-r--r--fs/fat/inode.c6
-rw-r--r--fs/fuse/file.c5
-rw-r--r--fs/gfs2/aops.c6
-rw-r--r--fs/gfs2/file.c5
-rw-r--r--fs/hfs/inode.c7
-rw-r--r--fs/hfsplus/inode.c7
-rw-r--r--fs/jfs/inode.c7
-rw-r--r--fs/nfs/direct.c21
-rw-r--r--fs/nfs/file.c2
-rw-r--r--fs/nfsd/vfs.c18
-rw-r--r--fs/nilfs2/inode.c4
-rw-r--r--fs/ntfs/file.c7
-rw-r--r--fs/ocfs2/aops.c9
-rw-r--r--fs/read_write.c6
-rw-r--r--fs/reiserfs/inode.c7
-rw-r--r--fs/udf/file.c7
-rw-r--r--fs/udf/inode.c7
-rw-r--r--fs/xfs/xfs_aops.c7
-rw-r--r--fs/xfs/xfs_file.c23
-rw-r--r--include/linux/dax.h2
-rw-r--r--include/linux/fs.h41
-rw-r--r--include/linux/nfs_fs.h5
-rw-r--r--include/uapi/linux/fs.h2
-rw-r--r--mm/filemap.c30
-rw-r--r--mm/page_io.c2
46 files changed, 200 insertions, 224 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
index 619af9bfdcb3..75eea7ce3d7c 100644
--- a/Documentation/filesystems/Locking
+++ b/Documentation/filesystems/Locking
@@ -194,7 +194,7 @@ prototypes:
194 void (*invalidatepage) (struct page *, unsigned int, unsigned int); 194 void (*invalidatepage) (struct page *, unsigned int, unsigned int);
195 int (*releasepage) (struct page *, int); 195 int (*releasepage) (struct page *, int);
196 void (*freepage)(struct page *); 196 void (*freepage)(struct page *);
197 int (*direct_IO)(struct kiocb *, struct iov_iter *iter, loff_t offset); 197 int (*direct_IO)(struct kiocb *, struct iov_iter *iter);
198 int (*migratepage)(struct address_space *, struct page *, struct page *); 198 int (*migratepage)(struct address_space *, struct page *, struct page *);
199 int (*launder_page)(struct page *); 199 int (*launder_page)(struct page *);
200 int (*is_partially_uptodate)(struct page *, unsigned long, unsigned long); 200 int (*is_partially_uptodate)(struct page *, unsigned long, unsigned long);
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt
index 4164bd6397a2..c61a223ef3ff 100644
--- a/Documentation/filesystems/vfs.txt
+++ b/Documentation/filesystems/vfs.txt
@@ -591,7 +591,7 @@ struct address_space_operations {
591 void (*invalidatepage) (struct page *, unsigned int, unsigned int); 591 void (*invalidatepage) (struct page *, unsigned int, unsigned int);
592 int (*releasepage) (struct page *, int); 592 int (*releasepage) (struct page *, int);
593 void (*freepage)(struct page *); 593 void (*freepage)(struct page *);
594 ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter, loff_t offset); 594 ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter);
595 /* migrate the contents of a page to the specified target */ 595 /* migrate the contents of a page to the specified target */
596 int (*migratepage) (struct page *, struct page *); 596 int (*migratepage) (struct page *, struct page *);
597 int (*launder_page) (struct page *); 597 int (*launder_page) (struct page *);
diff --git a/drivers/staging/lustre/lustre/llite/rw26.c b/drivers/staging/lustre/lustre/llite/rw26.c
index 69aa15e8e3ef..0c3459c1a518 100644
--- a/drivers/staging/lustre/lustre/llite/rw26.c
+++ b/drivers/staging/lustre/lustre/llite/rw26.c
@@ -358,14 +358,14 @@ static ssize_t ll_direct_IO_26_seg(const struct lu_env *env, struct cl_io *io,
358 */ 358 */
359#define MAX_DIO_SIZE ((KMALLOC_MAX_SIZE / sizeof(struct brw_page) * \ 359#define MAX_DIO_SIZE ((KMALLOC_MAX_SIZE / sizeof(struct brw_page) * \
360 PAGE_SIZE) & ~(DT_MAX_BRW_SIZE - 1)) 360 PAGE_SIZE) & ~(DT_MAX_BRW_SIZE - 1))
361static ssize_t ll_direct_IO_26(struct kiocb *iocb, struct iov_iter *iter, 361static ssize_t ll_direct_IO_26(struct kiocb *iocb, struct iov_iter *iter)
362 loff_t file_offset)
363{ 362{
364 struct lu_env *env; 363 struct lu_env *env;
365 struct cl_io *io; 364 struct cl_io *io;
366 struct file *file = iocb->ki_filp; 365 struct file *file = iocb->ki_filp;
367 struct inode *inode = file->f_mapping->host; 366 struct inode *inode = file->f_mapping->host;
368 struct ccc_object *obj = cl_inode2ccc(inode); 367 struct ccc_object *obj = cl_inode2ccc(inode);
368 loff_t file_offset = iocb->ki_pos;
369 ssize_t count = iov_iter_count(iter); 369 ssize_t count = iov_iter_count(iter);
370 ssize_t tot_bytes = 0, result = 0; 370 ssize_t tot_bytes = 0, result = 0;
371 struct ll_inode_info *lli = ll_i2info(inode); 371 struct ll_inode_info *lli = ll_i2info(inode);
diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c
index ac9225e86bf3..c37fb9c08970 100644
--- a/fs/9p/vfs_addr.c
+++ b/fs/9p/vfs_addr.c
@@ -245,9 +245,10 @@ static int v9fs_launder_page(struct page *page)
245 * 245 *
246 */ 246 */
247static ssize_t 247static ssize_t
248v9fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) 248v9fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
249{ 249{
250 struct file *file = iocb->ki_filp; 250 struct file *file = iocb->ki_filp;
251 loff_t pos = iocb->ki_pos;
251 ssize_t n; 252 ssize_t n;
252 int err = 0; 253 int err = 0;
253 if (iov_iter_rw(iter) == WRITE) { 254 if (iov_iter_rw(iter) == WRITE) {
diff --git a/fs/affs/file.c b/fs/affs/file.c
index 0cde550050e8..0deec9cc2362 100644
--- a/fs/affs/file.c
+++ b/fs/affs/file.c
@@ -389,12 +389,13 @@ static void affs_write_failed(struct address_space *mapping, loff_t to)
389} 389}
390 390
391static ssize_t 391static ssize_t
392affs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) 392affs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
393{ 393{
394 struct file *file = iocb->ki_filp; 394 struct file *file = iocb->ki_filp;
395 struct address_space *mapping = file->f_mapping; 395 struct address_space *mapping = file->f_mapping;
396 struct inode *inode = mapping->host; 396 struct inode *inode = mapping->host;
397 size_t count = iov_iter_count(iter); 397 size_t count = iov_iter_count(iter);
398 loff_t offset = iocb->ki_pos;
398 ssize_t ret; 399 ssize_t ret;
399 400
400 if (iov_iter_rw(iter) == WRITE) { 401 if (iov_iter_rw(iter) == WRITE) {
@@ -404,7 +405,7 @@ affs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset)
404 return 0; 405 return 0;
405 } 406 }
406 407
407 ret = blockdev_direct_IO(iocb, inode, iter, offset, affs_get_block); 408 ret = blockdev_direct_IO(iocb, inode, iter, affs_get_block);
408 if (ret < 0 && iov_iter_rw(iter) == WRITE) 409 if (ret < 0 && iov_iter_rw(iter) == WRITE)
409 affs_write_failed(mapping, offset + count); 410 affs_write_failed(mapping, offset + count);
410 return ret; 411 return ret;
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 20a2c02b77c4..a063d4d8ac39 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -162,15 +162,15 @@ static struct inode *bdev_file_inode(struct file *file)
162} 162}
163 163
164static ssize_t 164static ssize_t
165blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) 165blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
166{ 166{
167 struct file *file = iocb->ki_filp; 167 struct file *file = iocb->ki_filp;
168 struct inode *inode = bdev_file_inode(file); 168 struct inode *inode = bdev_file_inode(file);
169 169
170 if (IS_DAX(inode)) 170 if (IS_DAX(inode))
171 return dax_do_io(iocb, inode, iter, offset, blkdev_get_block, 171 return dax_do_io(iocb, inode, iter, blkdev_get_block,
172 NULL, DIO_SKIP_DIO_COUNT); 172 NULL, DIO_SKIP_DIO_COUNT);
173 return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset, 173 return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter,
174 blkdev_get_block, NULL, NULL, 174 blkdev_get_block, NULL, NULL,
175 DIO_SKIP_DIO_COUNT); 175 DIO_SKIP_DIO_COUNT);
176} 176}
@@ -1660,12 +1660,8 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
1660 1660
1661 blk_start_plug(&plug); 1661 blk_start_plug(&plug);
1662 ret = __generic_file_write_iter(iocb, from); 1662 ret = __generic_file_write_iter(iocb, from);
1663 if (ret > 0) { 1663 if (ret > 0)
1664 ssize_t err; 1664 ret = generic_write_sync(iocb, ret);
1665 err = generic_write_sync(file, iocb->ki_pos - ret, ret);
1666 if (err < 0)
1667 ret = err;
1668 }
1669 blk_finish_plug(&plug); 1665 blk_finish_plug(&plug);
1670 return ret; 1666 return ret;
1671} 1667}
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 8d7b5a45c005..ea9f10bb089c 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1703,18 +1703,17 @@ again:
1703 return num_written ? num_written : ret; 1703 return num_written ? num_written : ret;
1704} 1704}
1705 1705
1706static ssize_t __btrfs_direct_write(struct kiocb *iocb, 1706static ssize_t __btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from)
1707 struct iov_iter *from,
1708 loff_t pos)
1709{ 1707{
1710 struct file *file = iocb->ki_filp; 1708 struct file *file = iocb->ki_filp;
1711 struct inode *inode = file_inode(file); 1709 struct inode *inode = file_inode(file);
1710 loff_t pos = iocb->ki_pos;
1712 ssize_t written; 1711 ssize_t written;
1713 ssize_t written_buffered; 1712 ssize_t written_buffered;
1714 loff_t endbyte; 1713 loff_t endbyte;
1715 int err; 1714 int err;
1716 1715
1717 written = generic_file_direct_write(iocb, from, pos); 1716 written = generic_file_direct_write(iocb, from);
1718 1717
1719 if (written < 0 || !iov_iter_count(from)) 1718 if (written < 0 || !iov_iter_count(from))
1720 return written; 1719 return written;
@@ -1832,7 +1831,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
1832 atomic_inc(&BTRFS_I(inode)->sync_writers); 1831 atomic_inc(&BTRFS_I(inode)->sync_writers);
1833 1832
1834 if (iocb->ki_flags & IOCB_DIRECT) { 1833 if (iocb->ki_flags & IOCB_DIRECT) {
1835 num_written = __btrfs_direct_write(iocb, from, pos); 1834 num_written = __btrfs_direct_write(iocb, from);
1836 } else { 1835 } else {
1837 num_written = __btrfs_buffered_write(file, from, pos); 1836 num_written = __btrfs_buffered_write(file, from, pos);
1838 if (num_written > 0) 1837 if (num_written > 0)
@@ -1852,11 +1851,8 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
1852 spin_lock(&BTRFS_I(inode)->lock); 1851 spin_lock(&BTRFS_I(inode)->lock);
1853 BTRFS_I(inode)->last_sub_trans = root->log_transid; 1852 BTRFS_I(inode)->last_sub_trans = root->log_transid;
1854 spin_unlock(&BTRFS_I(inode)->lock); 1853 spin_unlock(&BTRFS_I(inode)->lock);
1855 if (num_written > 0) { 1854 if (num_written > 0)
1856 err = generic_write_sync(file, pos, num_written); 1855 num_written = generic_write_sync(iocb, num_written);
1857 if (err < 0)
1858 num_written = err;
1859 }
1860 1856
1861 if (sync) 1857 if (sync)
1862 atomic_dec(&BTRFS_I(inode)->sync_writers); 1858 atomic_dec(&BTRFS_I(inode)->sync_writers);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 3e2ada1267f3..da5799c56160 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8541,13 +8541,13 @@ out:
8541 return retval; 8541 return retval;
8542} 8542}
8543 8543
8544static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 8544static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
8545 loff_t offset)
8546{ 8545{
8547 struct file *file = iocb->ki_filp; 8546 struct file *file = iocb->ki_filp;
8548 struct inode *inode = file->f_mapping->host; 8547 struct inode *inode = file->f_mapping->host;
8549 struct btrfs_root *root = BTRFS_I(inode)->root; 8548 struct btrfs_root *root = BTRFS_I(inode)->root;
8550 struct btrfs_dio_data dio_data = { 0 }; 8549 struct btrfs_dio_data dio_data = { 0 };
8550 loff_t offset = iocb->ki_pos;
8551 size_t count = 0; 8551 size_t count = 0;
8552 int flags = 0; 8552 int flags = 0;
8553 bool wakeup = true; 8553 bool wakeup = true;
@@ -8607,7 +8607,7 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
8607 8607
8608 ret = __blockdev_direct_IO(iocb, inode, 8608 ret = __blockdev_direct_IO(iocb, inode,
8609 BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev, 8609 BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev,
8610 iter, offset, btrfs_get_blocks_direct, NULL, 8610 iter, btrfs_get_blocks_direct, NULL,
8611 btrfs_submit_direct, flags); 8611 btrfs_submit_direct, flags);
8612 if (iov_iter_rw(iter) == WRITE) { 8612 if (iov_iter_rw(iter) == WRITE) {
8613 current->journal_info = NULL; 8613 current->journal_info = NULL;
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 4801571f51cb..43098cd9602b 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1292,8 +1292,7 @@ static int ceph_write_end(struct file *file, struct address_space *mapping,
1292 * intercept O_DIRECT reads and writes early, this function should 1292 * intercept O_DIRECT reads and writes early, this function should
1293 * never get called. 1293 * never get called.
1294 */ 1294 */
1295static ssize_t ceph_direct_io(struct kiocb *iocb, struct iov_iter *iter, 1295static ssize_t ceph_direct_io(struct kiocb *iocb, struct iov_iter *iter)
1296 loff_t pos)
1297{ 1296{
1298 WARN_ON(1); 1297 WARN_ON(1);
1299 return -EINVAL; 1298 return -EINVAL;
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index a79f9269831e..4f1dc7120916 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -1382,12 +1382,11 @@ retry_snap:
1382 ceph_cap_string(got)); 1382 ceph_cap_string(got));
1383 ceph_put_cap_refs(ci, got); 1383 ceph_put_cap_refs(ci, got);
1384 1384
1385 if (written >= 0 && 1385 if (written >= 0) {
1386 ((file->f_flags & O_SYNC) || IS_SYNC(file->f_mapping->host) || 1386 if (ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_NEARFULL))
1387 ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_NEARFULL))) { 1387 iocb->ki_flags |= IOCB_DSYNC;
1388 err = vfs_fsync_range(file, pos, pos + written - 1, 1); 1388
1389 if (err < 0) 1389 written = generic_write_sync(iocb, written);
1390 written = err;
1391 } 1390 }
1392 1391
1393 goto out_unlocked; 1392 goto out_unlocked;
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index c03d0744648b..9b51d4936a29 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2687,11 +2687,8 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
2687out: 2687out:
2688 inode_unlock(inode); 2688 inode_unlock(inode);
2689 2689
2690 if (rc > 0) { 2690 if (rc > 0)
2691 ssize_t err = generic_write_sync(file, iocb->ki_pos - rc, rc); 2691 rc = generic_write_sync(iocb, rc);
2692 if (err < 0)
2693 rc = err;
2694 }
2695 up_read(&cinode->lock_sem); 2692 up_read(&cinode->lock_sem);
2696 return rc; 2693 return rc;
2697} 2694}
@@ -3854,7 +3851,7 @@ void cifs_oplock_break(struct work_struct *work)
3854 * Direct IO is not yet supported in the cached mode. 3851 * Direct IO is not yet supported in the cached mode.
3855 */ 3852 */
3856static ssize_t 3853static ssize_t
3857cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) 3854cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter)
3858{ 3855{
3859 /* 3856 /*
3860 * FIXME 3857 * FIXME
diff --git a/fs/dax.c b/fs/dax.c
index 75ba46d82a76..0dbe4e0f16fe 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -244,7 +244,6 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
244 * @iocb: The control block for this I/O 244 * @iocb: The control block for this I/O
245 * @inode: The file which the I/O is directed at 245 * @inode: The file which the I/O is directed at
246 * @iter: The addresses to do I/O from or to 246 * @iter: The addresses to do I/O from or to
247 * @pos: The file offset where the I/O starts
248 * @get_block: The filesystem method used to translate file offsets to blocks 247 * @get_block: The filesystem method used to translate file offsets to blocks
249 * @end_io: A filesystem callback for I/O completion 248 * @end_io: A filesystem callback for I/O completion
250 * @flags: See below 249 * @flags: See below
@@ -257,11 +256,12 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
257 * is in progress. 256 * is in progress.
258 */ 257 */
259ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode, 258ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode,
260 struct iov_iter *iter, loff_t pos, get_block_t get_block, 259 struct iov_iter *iter, get_block_t get_block,
261 dio_iodone_t end_io, int flags) 260 dio_iodone_t end_io, int flags)
262{ 261{
263 struct buffer_head bh; 262 struct buffer_head bh;
264 ssize_t retval = -EINVAL; 263 ssize_t retval = -EINVAL;
264 loff_t pos = iocb->ki_pos;
265 loff_t end = pos + iov_iter_count(iter); 265 loff_t end = pos + iov_iter_count(iter);
266 266
267 memset(&bh, 0, sizeof(bh)); 267 memset(&bh, 0, sizeof(bh));
diff --git a/fs/direct-io.c b/fs/direct-io.c
index 472037732daf..3bf3f20f8ecc 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -224,9 +224,9 @@ static inline struct page *dio_get_page(struct dio *dio,
224 * filesystems can use it to hold additional state between get_block calls and 224 * filesystems can use it to hold additional state between get_block calls and
225 * dio_complete. 225 * dio_complete.
226 */ 226 */
227static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, 227static ssize_t dio_complete(struct dio *dio, ssize_t ret, bool is_async)
228 bool is_async)
229{ 228{
229 loff_t offset = dio->iocb->ki_pos;
230 ssize_t transferred = 0; 230 ssize_t transferred = 0;
231 231
232 /* 232 /*
@@ -256,6 +256,7 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret,
256 if (dio->end_io) { 256 if (dio->end_io) {
257 int err; 257 int err;
258 258
259 // XXX: ki_pos??
259 err = dio->end_io(dio->iocb, offset, ret, dio->private); 260 err = dio->end_io(dio->iocb, offset, ret, dio->private);
260 if (err) 261 if (err)
261 ret = err; 262 ret = err;
@@ -265,15 +266,15 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret,
265 inode_dio_end(dio->inode); 266 inode_dio_end(dio->inode);
266 267
267 if (is_async) { 268 if (is_async) {
268 if (dio->rw & WRITE) { 269 /*
269 int err; 270 * generic_write_sync expects ki_pos to have been updated
270 271 * already, but the submission path only does this for
271 err = generic_write_sync(dio->iocb->ki_filp, offset, 272 * synchronous I/O.
272 transferred); 273 */
273 if (err < 0 && ret > 0) 274 dio->iocb->ki_pos += transferred;
274 ret = err;
275 }
276 275
276 if (dio->rw & WRITE)
277 ret = generic_write_sync(dio->iocb, transferred);
277 dio->iocb->ki_complete(dio->iocb, ret, 0); 278 dio->iocb->ki_complete(dio->iocb, ret, 0);
278 } 279 }
279 280
@@ -285,7 +286,7 @@ static void dio_aio_complete_work(struct work_struct *work)
285{ 286{
286 struct dio *dio = container_of(work, struct dio, complete_work); 287 struct dio *dio = container_of(work, struct dio, complete_work);
287 288
288 dio_complete(dio, dio->iocb->ki_pos, 0, true); 289 dio_complete(dio, 0, true);
289} 290}
290 291
291static int dio_bio_complete(struct dio *dio, struct bio *bio); 292static int dio_bio_complete(struct dio *dio, struct bio *bio);
@@ -314,7 +315,7 @@ static void dio_bio_end_aio(struct bio *bio)
314 queue_work(dio->inode->i_sb->s_dio_done_wq, 315 queue_work(dio->inode->i_sb->s_dio_done_wq,
315 &dio->complete_work); 316 &dio->complete_work);
316 } else { 317 } else {
317 dio_complete(dio, dio->iocb->ki_pos, 0, true); 318 dio_complete(dio, 0, true);
318 } 319 }
319 } 320 }
320} 321}
@@ -1113,7 +1114,7 @@ static inline int drop_refcount(struct dio *dio)
1113static inline ssize_t 1114static inline ssize_t
1114do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, 1115do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1115 struct block_device *bdev, struct iov_iter *iter, 1116 struct block_device *bdev, struct iov_iter *iter,
1116 loff_t offset, get_block_t get_block, dio_iodone_t end_io, 1117 get_block_t get_block, dio_iodone_t end_io,
1117 dio_submit_t submit_io, int flags) 1118 dio_submit_t submit_io, int flags)
1118{ 1119{
1119 unsigned i_blkbits = ACCESS_ONCE(inode->i_blkbits); 1120 unsigned i_blkbits = ACCESS_ONCE(inode->i_blkbits);
@@ -1121,6 +1122,7 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1121 unsigned blocksize_mask = (1 << blkbits) - 1; 1122 unsigned blocksize_mask = (1 << blkbits) - 1;
1122 ssize_t retval = -EINVAL; 1123 ssize_t retval = -EINVAL;
1123 size_t count = iov_iter_count(iter); 1124 size_t count = iov_iter_count(iter);
1125 loff_t offset = iocb->ki_pos;
1124 loff_t end = offset + count; 1126 loff_t end = offset + count;
1125 struct dio *dio; 1127 struct dio *dio;
1126 struct dio_submit sdio = { 0, }; 1128 struct dio_submit sdio = { 0, };
@@ -1318,7 +1320,7 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1318 dio_await_completion(dio); 1320 dio_await_completion(dio);
1319 1321
1320 if (drop_refcount(dio) == 0) { 1322 if (drop_refcount(dio) == 0) {
1321 retval = dio_complete(dio, offset, retval, false); 1323 retval = dio_complete(dio, retval, false);
1322 } else 1324 } else
1323 BUG_ON(retval != -EIOCBQUEUED); 1325 BUG_ON(retval != -EIOCBQUEUED);
1324 1326
@@ -1328,7 +1330,7 @@ out:
1328 1330
1329ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, 1331ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1330 struct block_device *bdev, struct iov_iter *iter, 1332 struct block_device *bdev, struct iov_iter *iter,
1331 loff_t offset, get_block_t get_block, 1333 get_block_t get_block,
1332 dio_iodone_t end_io, dio_submit_t submit_io, 1334 dio_iodone_t end_io, dio_submit_t submit_io,
1333 int flags) 1335 int flags)
1334{ 1336{
@@ -1344,7 +1346,7 @@ ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1344 prefetch(bdev->bd_queue); 1346 prefetch(bdev->bd_queue);
1345 prefetch((char *)bdev->bd_queue + SMP_CACHE_BYTES); 1347 prefetch((char *)bdev->bd_queue + SMP_CACHE_BYTES);
1346 1348
1347 return do_blockdev_direct_IO(iocb, inode, bdev, iter, offset, get_block, 1349 return do_blockdev_direct_IO(iocb, inode, bdev, iter, get_block,
1348 end_io, submit_io, flags); 1350 end_io, submit_io, flags);
1349} 1351}
1350 1352
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c
index 49e1bd00b4ec..9dc4c6dbf3c9 100644
--- a/fs/exofs/inode.c
+++ b/fs/exofs/inode.c
@@ -960,8 +960,7 @@ static void exofs_invalidatepage(struct page *page, unsigned int offset,
960 960
961 961
962 /* TODO: Should be easy enough to do proprly */ 962 /* TODO: Should be easy enough to do proprly */
963static ssize_t exofs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 963static ssize_t exofs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
964 loff_t offset)
965{ 964{
966 return 0; 965 return 0;
967} 966}
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
index 6bd58e6ff038..b675610391b8 100644
--- a/fs/ext2/inode.c
+++ b/fs/ext2/inode.c
@@ -854,20 +854,20 @@ static sector_t ext2_bmap(struct address_space *mapping, sector_t block)
854} 854}
855 855
856static ssize_t 856static ssize_t
857ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) 857ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
858{ 858{
859 struct file *file = iocb->ki_filp; 859 struct file *file = iocb->ki_filp;
860 struct address_space *mapping = file->f_mapping; 860 struct address_space *mapping = file->f_mapping;
861 struct inode *inode = mapping->host; 861 struct inode *inode = mapping->host;
862 size_t count = iov_iter_count(iter); 862 size_t count = iov_iter_count(iter);
863 loff_t offset = iocb->ki_pos;
863 ssize_t ret; 864 ssize_t ret;
864 865
865 if (IS_DAX(inode)) 866 if (IS_DAX(inode))
866 ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, 867 ret = dax_do_io(iocb, inode, iter, ext2_get_block, NULL,
867 DIO_LOCKING); 868 DIO_LOCKING);
868 else 869 else
869 ret = blockdev_direct_IO(iocb, inode, iter, offset, 870 ret = blockdev_direct_IO(iocb, inode, iter, ext2_get_block);
870 ext2_get_block);
871 if (ret < 0 && iov_iter_rw(iter) == WRITE) 871 if (ret < 0 && iov_iter_rw(iter) == WRITE)
872 ext2_write_failed(mapping, offset + count); 872 ext2_write_failed(mapping, offset + count);
873 return ret; 873 return ret;
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 349afebe21ee..72f4c9e00e97 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2581,8 +2581,7 @@ extern int ext4_get_next_extent(struct inode *inode, ext4_lblk_t lblk,
2581/* indirect.c */ 2581/* indirect.c */
2582extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode, 2582extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
2583 struct ext4_map_blocks *map, int flags); 2583 struct ext4_map_blocks *map, int flags);
2584extern ssize_t ext4_ind_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 2584extern ssize_t ext4_ind_direct_IO(struct kiocb *iocb, struct iov_iter *iter);
2585 loff_t offset);
2586extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock); 2585extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock);
2587extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks); 2586extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks);
2588extern void ext4_ind_truncate(handle_t *, struct inode *inode); 2587extern void ext4_ind_truncate(handle_t *, struct inode *inode);
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index fa2208bae2e1..00ff6912adb3 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -169,13 +169,8 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
169 ret = __generic_file_write_iter(iocb, from); 169 ret = __generic_file_write_iter(iocb, from);
170 inode_unlock(inode); 170 inode_unlock(inode);
171 171
172 if (ret > 0) { 172 if (ret > 0)
173 ssize_t err; 173 ret = generic_write_sync(iocb, ret);
174
175 err = generic_write_sync(file, iocb->ki_pos - ret, ret);
176 if (err < 0)
177 ret = err;
178 }
179 if (o_direct) 174 if (o_direct)
180 blk_finish_plug(&plug); 175 blk_finish_plug(&plug);
181 176
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c
index 3027fa681de5..627b7e8f9ef3 100644
--- a/fs/ext4/indirect.c
+++ b/fs/ext4/indirect.c
@@ -659,12 +659,12 @@ out:
659 * crashes then stale disk data _may_ be exposed inside the file. But current 659 * crashes then stale disk data _may_ be exposed inside the file. But current
660 * VFS code falls back into buffered path in that case so we are safe. 660 * VFS code falls back into buffered path in that case so we are safe.
661 */ 661 */
662ssize_t ext4_ind_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 662ssize_t ext4_ind_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
663 loff_t offset)
664{ 663{
665 struct file *file = iocb->ki_filp; 664 struct file *file = iocb->ki_filp;
666 struct inode *inode = file->f_mapping->host; 665 struct inode *inode = file->f_mapping->host;
667 struct ext4_inode_info *ei = EXT4_I(inode); 666 struct ext4_inode_info *ei = EXT4_I(inode);
667 loff_t offset = iocb->ki_pos;
668 handle_t *handle; 668 handle_t *handle;
669 ssize_t ret; 669 ssize_t ret;
670 int orphan = 0; 670 int orphan = 0;
@@ -707,21 +707,21 @@ retry:
707 goto locked; 707 goto locked;
708 } 708 }
709 if (IS_DAX(inode)) 709 if (IS_DAX(inode))
710 ret = dax_do_io(iocb, inode, iter, offset, 710 ret = dax_do_io(iocb, inode, iter,
711 ext4_dio_get_block, NULL, 0); 711 ext4_dio_get_block, NULL, 0);
712 else 712 else
713 ret = __blockdev_direct_IO(iocb, inode, 713 ret = __blockdev_direct_IO(iocb, inode,
714 inode->i_sb->s_bdev, iter, 714 inode->i_sb->s_bdev, iter,
715 offset, ext4_dio_get_block, 715 ext4_dio_get_block,
716 NULL, NULL, 0); 716 NULL, NULL, 0);
717 inode_dio_end(inode); 717 inode_dio_end(inode);
718 } else { 718 } else {
719locked: 719locked:
720 if (IS_DAX(inode)) 720 if (IS_DAX(inode))
721 ret = dax_do_io(iocb, inode, iter, offset, 721 ret = dax_do_io(iocb, inode, iter,
722 ext4_dio_get_block, NULL, DIO_LOCKING); 722 ext4_dio_get_block, NULL, DIO_LOCKING);
723 else 723 else
724 ret = blockdev_direct_IO(iocb, inode, iter, offset, 724 ret = blockdev_direct_IO(iocb, inode, iter,
725 ext4_dio_get_block); 725 ext4_dio_get_block);
726 726
727 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { 727 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) {
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 981a1fc30eaa..79b298d397b4 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -3334,12 +3334,12 @@ static int ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
3334 * if the machine crashes during the write. 3334 * if the machine crashes during the write.
3335 * 3335 *
3336 */ 3336 */
3337static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 3337static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
3338 loff_t offset)
3339{ 3338{
3340 struct file *file = iocb->ki_filp; 3339 struct file *file = iocb->ki_filp;
3341 struct inode *inode = file->f_mapping->host; 3340 struct inode *inode = file->f_mapping->host;
3342 ssize_t ret; 3341 ssize_t ret;
3342 loff_t offset = iocb->ki_pos;
3343 size_t count = iov_iter_count(iter); 3343 size_t count = iov_iter_count(iter);
3344 int overwrite = 0; 3344 int overwrite = 0;
3345 get_block_t *get_block_func = NULL; 3345 get_block_t *get_block_func = NULL;
@@ -3348,7 +3348,7 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
3348 3348
3349 /* Use the old path for reads and writes beyond i_size. */ 3349 /* Use the old path for reads and writes beyond i_size. */
3350 if (iov_iter_rw(iter) != WRITE || final_size > inode->i_size) 3350 if (iov_iter_rw(iter) != WRITE || final_size > inode->i_size)
3351 return ext4_ind_direct_IO(iocb, iter, offset); 3351 return ext4_ind_direct_IO(iocb, iter);
3352 3352
3353 BUG_ON(iocb->private == NULL); 3353 BUG_ON(iocb->private == NULL);
3354 3354
@@ -3400,11 +3400,11 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
3400 BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)); 3400 BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode));
3401#endif 3401#endif
3402 if (IS_DAX(inode)) 3402 if (IS_DAX(inode))
3403 ret = dax_do_io(iocb, inode, iter, offset, get_block_func, 3403 ret = dax_do_io(iocb, inode, iter, get_block_func,
3404 ext4_end_io_dio, dio_flags); 3404 ext4_end_io_dio, dio_flags);
3405 else 3405 else
3406 ret = __blockdev_direct_IO(iocb, inode, 3406 ret = __blockdev_direct_IO(iocb, inode,
3407 inode->i_sb->s_bdev, iter, offset, 3407 inode->i_sb->s_bdev, iter,
3408 get_block_func, 3408 get_block_func,
3409 ext4_end_io_dio, NULL, dio_flags); 3409 ext4_end_io_dio, NULL, dio_flags);
3410 3410
@@ -3431,12 +3431,12 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
3431 return ret; 3431 return ret;
3432} 3432}
3433 3433
3434static ssize_t ext4_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 3434static ssize_t ext4_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
3435 loff_t offset)
3436{ 3435{
3437 struct file *file = iocb->ki_filp; 3436 struct file *file = iocb->ki_filp;
3438 struct inode *inode = file->f_mapping->host; 3437 struct inode *inode = file->f_mapping->host;
3439 size_t count = iov_iter_count(iter); 3438 size_t count = iov_iter_count(iter);
3439 loff_t offset = iocb->ki_pos;
3440 ssize_t ret; 3440 ssize_t ret;
3441 3441
3442#ifdef CONFIG_EXT4_FS_ENCRYPTION 3442#ifdef CONFIG_EXT4_FS_ENCRYPTION
@@ -3456,9 +3456,9 @@ static ssize_t ext4_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
3456 3456
3457 trace_ext4_direct_IO_enter(inode, offset, count, iov_iter_rw(iter)); 3457 trace_ext4_direct_IO_enter(inode, offset, count, iov_iter_rw(iter));
3458 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) 3458 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
3459 ret = ext4_ext_direct_IO(iocb, iter, offset); 3459 ret = ext4_ext_direct_IO(iocb, iter);
3460 else 3460 else
3461 ret = ext4_ind_direct_IO(iocb, iter, offset); 3461 ret = ext4_ind_direct_IO(iocb, iter);
3462 trace_ext4_direct_IO_exit(inode, offset, count, iov_iter_rw(iter), ret); 3462 trace_ext4_direct_IO_exit(inode, offset, count, iov_iter_rw(iter), ret);
3463 return ret; 3463 return ret;
3464} 3464}
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 5dafb9cef12e..bb376c3bca62 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1665,12 +1665,12 @@ static int check_direct_IO(struct inode *inode, struct iov_iter *iter,
1665 return 0; 1665 return 0;
1666} 1666}
1667 1667
1668static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 1668static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
1669 loff_t offset)
1670{ 1669{
1671 struct address_space *mapping = iocb->ki_filp->f_mapping; 1670 struct address_space *mapping = iocb->ki_filp->f_mapping;
1672 struct inode *inode = mapping->host; 1671 struct inode *inode = mapping->host;
1673 size_t count = iov_iter_count(iter); 1672 size_t count = iov_iter_count(iter);
1673 loff_t offset = iocb->ki_pos;
1674 int err; 1674 int err;
1675 1675
1676 err = check_direct_IO(inode, iter, offset); 1676 err = check_direct_IO(inode, iter, offset);
@@ -1682,7 +1682,7 @@ static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
1682 1682
1683 trace_f2fs_direct_IO_enter(inode, offset, count, iov_iter_rw(iter)); 1683 trace_f2fs_direct_IO_enter(inode, offset, count, iov_iter_rw(iter));
1684 1684
1685 err = blockdev_direct_IO(iocb, inode, iter, offset, get_data_block_dio); 1685 err = blockdev_direct_IO(iocb, inode, iter, get_data_block_dio);
1686 if (err < 0 && iov_iter_rw(iter) == WRITE) 1686 if (err < 0 && iov_iter_rw(iter) == WRITE)
1687 f2fs_write_failed(mapping, offset + count); 1687 f2fs_write_failed(mapping, offset + count);
1688 1688
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 90d1157a09f9..eb9d027e5981 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1886,13 +1886,8 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
1886 } 1886 }
1887 inode_unlock(inode); 1887 inode_unlock(inode);
1888 1888
1889 if (ret > 0) { 1889 if (ret > 0)
1890 ssize_t err; 1890 ret = generic_write_sync(iocb, ret);
1891
1892 err = generic_write_sync(file, iocb->ki_pos - ret, ret);
1893 if (err < 0)
1894 ret = err;
1895 }
1896 return ret; 1891 return ret;
1897} 1892}
1898 1893
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index 226281068a46..3bcf57925dca 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -244,13 +244,13 @@ static int fat_write_end(struct file *file, struct address_space *mapping,
244 return err; 244 return err;
245} 245}
246 246
247static ssize_t fat_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 247static ssize_t fat_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
248 loff_t offset)
249{ 248{
250 struct file *file = iocb->ki_filp; 249 struct file *file = iocb->ki_filp;
251 struct address_space *mapping = file->f_mapping; 250 struct address_space *mapping = file->f_mapping;
252 struct inode *inode = mapping->host; 251 struct inode *inode = mapping->host;
253 size_t count = iov_iter_count(iter); 252 size_t count = iov_iter_count(iter);
253 loff_t offset = iocb->ki_pos;
254 ssize_t ret; 254 ssize_t ret;
255 255
256 if (iov_iter_rw(iter) == WRITE) { 256 if (iov_iter_rw(iter) == WRITE) {
@@ -272,7 +272,7 @@ static ssize_t fat_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
272 * FAT need to use the DIO_LOCKING for avoiding the race 272 * FAT need to use the DIO_LOCKING for avoiding the race
273 * condition of fat_get_block() and ->truncate(). 273 * condition of fat_get_block() and ->truncate().
274 */ 274 */
275 ret = blockdev_direct_IO(iocb, inode, iter, offset, fat_get_block); 275 ret = blockdev_direct_IO(iocb, inode, iter, fat_get_block);
276 if (ret < 0 && iov_iter_rw(iter) == WRITE) 276 if (ret < 0 && iov_iter_rw(iter) == WRITE)
277 fat_write_failed(mapping, offset + count); 277 fat_write_failed(mapping, offset + count);
278 278
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index dcad5e210525..9154f8679024 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1186,7 +1186,7 @@ static ssize_t fuse_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
1186 1186
1187 if (iocb->ki_flags & IOCB_DIRECT) { 1187 if (iocb->ki_flags & IOCB_DIRECT) {
1188 loff_t pos = iocb->ki_pos; 1188 loff_t pos = iocb->ki_pos;
1189 written = generic_file_direct_write(iocb, from, pos); 1189 written = generic_file_direct_write(iocb, from);
1190 if (written < 0 || !iov_iter_count(from)) 1190 if (written < 0 || !iov_iter_count(from))
1191 goto out; 1191 goto out;
1192 1192
@@ -2837,7 +2837,7 @@ static inline loff_t fuse_round_up(loff_t off)
2837} 2837}
2838 2838
2839static ssize_t 2839static ssize_t
2840fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) 2840fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
2841{ 2841{
2842 DECLARE_COMPLETION_ONSTACK(wait); 2842 DECLARE_COMPLETION_ONSTACK(wait);
2843 ssize_t ret = 0; 2843 ssize_t ret = 0;
@@ -2848,6 +2848,7 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset)
2848 struct inode *inode; 2848 struct inode *inode;
2849 loff_t i_size; 2849 loff_t i_size;
2850 size_t count = iov_iter_count(iter); 2850 size_t count = iov_iter_count(iter);
2851 loff_t offset = iocb->ki_pos;
2851 struct fuse_io_priv *io; 2852 struct fuse_io_priv *io;
2852 bool is_sync = is_sync_kiocb(iocb); 2853 bool is_sync = is_sync_kiocb(iocb);
2853 2854
diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c
index 1bbbee945f46..8524c0e322fc 100644
--- a/fs/gfs2/aops.c
+++ b/fs/gfs2/aops.c
@@ -1042,13 +1042,13 @@ static int gfs2_ok_for_dio(struct gfs2_inode *ip, loff_t offset)
1042 1042
1043 1043
1044 1044
1045static ssize_t gfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 1045static ssize_t gfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
1046 loff_t offset)
1047{ 1046{
1048 struct file *file = iocb->ki_filp; 1047 struct file *file = iocb->ki_filp;
1049 struct inode *inode = file->f_mapping->host; 1048 struct inode *inode = file->f_mapping->host;
1050 struct address_space *mapping = inode->i_mapping; 1049 struct address_space *mapping = inode->i_mapping;
1051 struct gfs2_inode *ip = GFS2_I(inode); 1050 struct gfs2_inode *ip = GFS2_I(inode);
1051 loff_t offset = iocb->ki_pos;
1052 struct gfs2_holder gh; 1052 struct gfs2_holder gh;
1053 int rv; 1053 int rv;
1054 1054
@@ -1099,7 +1099,7 @@ static ssize_t gfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
1099 } 1099 }
1100 1100
1101 rv = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, 1101 rv = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter,
1102 offset, gfs2_get_block_direct, NULL, NULL, 0); 1102 gfs2_get_block_direct, NULL, NULL, 0);
1103out: 1103out:
1104 gfs2_glock_dq(&gh); 1104 gfs2_glock_dq(&gh);
1105 gfs2_holder_uninit(&gh); 1105 gfs2_holder_uninit(&gh);
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index a3e7358e3cd1..e53b723abd3b 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -895,7 +895,10 @@ static long __gfs2_fallocate(struct file *file, int mode, loff_t offset, loff_t
895 mark_inode_dirty(inode); 895 mark_inode_dirty(inode);
896 } 896 }
897 897
898 return generic_write_sync(file, pos, count); 898 if ((file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host))
899 return vfs_fsync_range(file, pos, pos + count - 1,
900 (file->f_flags & __O_SYNC) ? 0 : 1);
901 return 0;
899 902
900out_trans_fail: 903out_trans_fail:
901 gfs2_inplace_release(ip); 904 gfs2_inplace_release(ip);
diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c
index ba533c79a806..8eed66af5b82 100644
--- a/fs/hfs/inode.c
+++ b/fs/hfs/inode.c
@@ -124,8 +124,7 @@ static int hfs_releasepage(struct page *page, gfp_t mask)
124 return res ? try_to_free_buffers(page) : 0; 124 return res ? try_to_free_buffers(page) : 0;
125} 125}
126 126
127static ssize_t hfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 127static ssize_t hfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
128 loff_t offset)
129{ 128{
130 struct file *file = iocb->ki_filp; 129 struct file *file = iocb->ki_filp;
131 struct address_space *mapping = file->f_mapping; 130 struct address_space *mapping = file->f_mapping;
@@ -133,7 +132,7 @@ static ssize_t hfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
133 size_t count = iov_iter_count(iter); 132 size_t count = iov_iter_count(iter);
134 ssize_t ret; 133 ssize_t ret;
135 134
136 ret = blockdev_direct_IO(iocb, inode, iter, offset, hfs_get_block); 135 ret = blockdev_direct_IO(iocb, inode, iter, hfs_get_block);
137 136
138 /* 137 /*
139 * In case of error extending write may have instantiated a few 138 * In case of error extending write may have instantiated a few
@@ -141,7 +140,7 @@ static ssize_t hfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
141 */ 140 */
142 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { 141 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) {
143 loff_t isize = i_size_read(inode); 142 loff_t isize = i_size_read(inode);
144 loff_t end = offset + count; 143 loff_t end = iocb->ki_pos + count;
145 144
146 if (end > isize) 145 if (end > isize)
147 hfs_write_failed(mapping, end); 146 hfs_write_failed(mapping, end);
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c
index 037f738c5871..ef9fefe364a6 100644
--- a/fs/hfsplus/inode.c
+++ b/fs/hfsplus/inode.c
@@ -122,8 +122,7 @@ static int hfsplus_releasepage(struct page *page, gfp_t mask)
122 return res ? try_to_free_buffers(page) : 0; 122 return res ? try_to_free_buffers(page) : 0;
123} 123}
124 124
125static ssize_t hfsplus_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 125static ssize_t hfsplus_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
126 loff_t offset)
127{ 126{
128 struct file *file = iocb->ki_filp; 127 struct file *file = iocb->ki_filp;
129 struct address_space *mapping = file->f_mapping; 128 struct address_space *mapping = file->f_mapping;
@@ -131,7 +130,7 @@ static ssize_t hfsplus_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
131 size_t count = iov_iter_count(iter); 130 size_t count = iov_iter_count(iter);
132 ssize_t ret; 131 ssize_t ret;
133 132
134 ret = blockdev_direct_IO(iocb, inode, iter, offset, hfsplus_get_block); 133 ret = blockdev_direct_IO(iocb, inode, iter, hfsplus_get_block);
135 134
136 /* 135 /*
137 * In case of error extending write may have instantiated a few 136 * In case of error extending write may have instantiated a few
@@ -139,7 +138,7 @@ static ssize_t hfsplus_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
139 */ 138 */
140 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { 139 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) {
141 loff_t isize = i_size_read(inode); 140 loff_t isize = i_size_read(inode);
142 loff_t end = offset + count; 141 loff_t end = iocb->ki_pos + count;
143 142
144 if (end > isize) 143 if (end > isize)
145 hfsplus_write_failed(mapping, end); 144 hfsplus_write_failed(mapping, end);
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c
index da1d02116a19..ad3e7b1effc4 100644
--- a/fs/jfs/inode.c
+++ b/fs/jfs/inode.c
@@ -332,8 +332,7 @@ static sector_t jfs_bmap(struct address_space *mapping, sector_t block)
332 return generic_block_bmap(mapping, block, jfs_get_block); 332 return generic_block_bmap(mapping, block, jfs_get_block);
333} 333}
334 334
335static ssize_t jfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 335static ssize_t jfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
336 loff_t offset)
337{ 336{
338 struct file *file = iocb->ki_filp; 337 struct file *file = iocb->ki_filp;
339 struct address_space *mapping = file->f_mapping; 338 struct address_space *mapping = file->f_mapping;
@@ -341,7 +340,7 @@ static ssize_t jfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
341 size_t count = iov_iter_count(iter); 340 size_t count = iov_iter_count(iter);
342 ssize_t ret; 341 ssize_t ret;
343 342
344 ret = blockdev_direct_IO(iocb, inode, iter, offset, jfs_get_block); 343 ret = blockdev_direct_IO(iocb, inode, iter, jfs_get_block);
345 344
346 /* 345 /*
347 * In case of error extending write may have instantiated a few 346 * In case of error extending write may have instantiated a few
@@ -349,7 +348,7 @@ static ssize_t jfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
349 */ 348 */
350 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { 349 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) {
351 loff_t isize = i_size_read(inode); 350 loff_t isize = i_size_read(inode);
352 loff_t end = offset + count; 351 loff_t end = iocb->ki_pos + count;
353 352
354 if (end > isize) 353 if (end > isize)
355 jfs_write_failed(mapping, end); 354 jfs_write_failed(mapping, end);
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 438d4e70742f..741a92c470bb 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -250,7 +250,7 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq,
250 * shunt off direct read and write requests before the VFS gets them, 250 * shunt off direct read and write requests before the VFS gets them,
251 * so this method is only ever called for swap. 251 * so this method is only ever called for swap.
252 */ 252 */
253ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) 253ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
254{ 254{
255 struct inode *inode = iocb->ki_filp->f_mapping->host; 255 struct inode *inode = iocb->ki_filp->f_mapping->host;
256 256
@@ -261,7 +261,7 @@ ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
261 VM_BUG_ON(iov_iter_count(iter) != PAGE_SIZE); 261 VM_BUG_ON(iov_iter_count(iter) != PAGE_SIZE);
262 262
263 if (iov_iter_rw(iter) == READ) 263 if (iov_iter_rw(iter) == READ)
264 return nfs_file_direct_read(iocb, iter, pos); 264 return nfs_file_direct_read(iocb, iter);
265 return nfs_file_direct_write(iocb, iter); 265 return nfs_file_direct_write(iocb, iter);
266} 266}
267 267
@@ -545,7 +545,6 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
545 * nfs_file_direct_read - file direct read operation for NFS files 545 * nfs_file_direct_read - file direct read operation for NFS files
546 * @iocb: target I/O control block 546 * @iocb: target I/O control block
547 * @iter: vector of user buffers into which to read data 547 * @iter: vector of user buffers into which to read data
548 * @pos: byte offset in file where reading starts
549 * 548 *
550 * We use this function for direct reads instead of calling 549 * We use this function for direct reads instead of calling
551 * generic_file_aio_read() in order to avoid gfar's check to see if 550 * generic_file_aio_read() in order to avoid gfar's check to see if
@@ -561,8 +560,7 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
561 * client must read the updated atime from the server back into its 560 * client must read the updated atime from the server back into its
562 * cache. 561 * cache.
563 */ 562 */
564ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter, 563ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter)
565 loff_t pos)
566{ 564{
567 struct file *file = iocb->ki_filp; 565 struct file *file = iocb->ki_filp;
568 struct address_space *mapping = file->f_mapping; 566 struct address_space *mapping = file->f_mapping;
@@ -574,7 +572,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,
574 nfs_add_stats(mapping->host, NFSIOS_DIRECTREADBYTES, count); 572 nfs_add_stats(mapping->host, NFSIOS_DIRECTREADBYTES, count);
575 573
576 dfprintk(FILE, "NFS: direct read(%pD2, %zd@%Ld)\n", 574 dfprintk(FILE, "NFS: direct read(%pD2, %zd@%Ld)\n",
577 file, count, (long long) pos); 575 file, count, (long long) iocb->ki_pos);
578 576
579 result = 0; 577 result = 0;
580 if (!count) 578 if (!count)
@@ -594,7 +592,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,
594 592
595 dreq->inode = inode; 593 dreq->inode = inode;
596 dreq->bytes_left = count; 594 dreq->bytes_left = count;
597 dreq->io_start = pos; 595 dreq->io_start = iocb->ki_pos;
598 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp)); 596 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
599 l_ctx = nfs_get_lock_context(dreq->ctx); 597 l_ctx = nfs_get_lock_context(dreq->ctx);
600 if (IS_ERR(l_ctx)) { 598 if (IS_ERR(l_ctx)) {
@@ -606,14 +604,14 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,
606 dreq->iocb = iocb; 604 dreq->iocb = iocb;
607 605
608 NFS_I(inode)->read_io += count; 606 NFS_I(inode)->read_io += count;
609 result = nfs_direct_read_schedule_iovec(dreq, iter, pos); 607 result = nfs_direct_read_schedule_iovec(dreq, iter, iocb->ki_pos);
610 608
611 inode_unlock(inode); 609 inode_unlock(inode);
612 610
613 if (!result) { 611 if (!result) {
614 result = nfs_direct_wait(dreq); 612 result = nfs_direct_wait(dreq);
615 if (result > 0) 613 if (result > 0)
616 iocb->ki_pos = pos + result; 614 iocb->ki_pos += result;
617 } 615 }
618 616
619 nfs_direct_req_release(dreq); 617 nfs_direct_req_release(dreq);
@@ -969,7 +967,6 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
969 * nfs_file_direct_write - file direct write operation for NFS files 967 * nfs_file_direct_write - file direct write operation for NFS files
970 * @iocb: target I/O control block 968 * @iocb: target I/O control block
971 * @iter: vector of user buffers from which to write data 969 * @iter: vector of user buffers from which to write data
972 * @pos: byte offset in file where writing starts
973 * 970 *
974 * We use this function for direct writes instead of calling 971 * We use this function for direct writes instead of calling
975 * generic_file_aio_write() in order to avoid taking the inode 972 * generic_file_aio_write() in order to avoid taking the inode
@@ -1057,7 +1054,9 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
1057 if (i_size_read(inode) < iocb->ki_pos) 1054 if (i_size_read(inode) < iocb->ki_pos)
1058 i_size_write(inode, iocb->ki_pos); 1055 i_size_write(inode, iocb->ki_pos);
1059 spin_unlock(&inode->i_lock); 1056 spin_unlock(&inode->i_lock);
1060 generic_write_sync(file, pos, result); 1057
1058 /* XXX: should check the generic_write_sync retval */
1059 generic_write_sync(iocb, result);
1061 } 1060 }
1062 } 1061 }
1063 nfs_direct_req_release(dreq); 1062 nfs_direct_req_release(dreq);
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index be01095b97ae..717a8d6af52d 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -164,7 +164,7 @@ nfs_file_read(struct kiocb *iocb, struct iov_iter *to)
164 ssize_t result; 164 ssize_t result;
165 165
166 if (iocb->ki_flags & IOCB_DIRECT) 166 if (iocb->ki_flags & IOCB_DIRECT)
167 return nfs_file_direct_read(iocb, to, iocb->ki_pos); 167 return nfs_file_direct_read(iocb, to);
168 168
169 dprintk("NFS: read(%pD2, %zu@%lu)\n", 169 dprintk("NFS: read(%pD2, %zu@%lu)\n",
170 iocb->ki_filp, 170 iocb->ki_filp,
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index d40010e4f1a9..6fbd81ecb410 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -935,8 +935,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
935 int stable = *stablep; 935 int stable = *stablep;
936 int use_wgather; 936 int use_wgather;
937 loff_t pos = offset; 937 loff_t pos = offset;
938 loff_t end = LLONG_MAX;
939 unsigned int pflags = current->flags; 938 unsigned int pflags = current->flags;
939 int flags = 0;
940 940
941 if (test_bit(RQ_LOCAL, &rqstp->rq_flags)) 941 if (test_bit(RQ_LOCAL, &rqstp->rq_flags))
942 /* 942 /*
@@ -955,9 +955,12 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
955 if (!EX_ISSYNC(exp)) 955 if (!EX_ISSYNC(exp))
956 stable = 0; 956 stable = 0;
957 957
958 if (stable && !use_wgather)
959 flags |= RWF_SYNC;
960
958 /* Write the data. */ 961 /* Write the data. */
959 oldfs = get_fs(); set_fs(KERNEL_DS); 962 oldfs = get_fs(); set_fs(KERNEL_DS);
960 host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &pos, 0); 963 host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &pos, flags);
961 set_fs(oldfs); 964 set_fs(oldfs);
962 if (host_err < 0) 965 if (host_err < 0)
963 goto out_nfserr; 966 goto out_nfserr;
@@ -965,15 +968,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
965 nfsdstats.io_write += host_err; 968 nfsdstats.io_write += host_err;
966 fsnotify_modify(file); 969 fsnotify_modify(file);
967 970
968 if (stable) { 971 if (stable && use_wgather)
969 if (use_wgather) { 972 host_err = wait_for_concurrent_writes(file);
970 host_err = wait_for_concurrent_writes(file);
971 } else {
972 if (*cnt)
973 end = offset + *cnt - 1;
974 host_err = vfs_fsync_range(file, offset, end, 0);
975 }
976 }
977 973
978out_nfserr: 974out_nfserr:
979 dprintk("nfsd: write complete host_err=%d\n", host_err); 975 dprintk("nfsd: write complete host_err=%d\n", host_err);
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
index 534631358b13..cfebcd2fc7f3 100644
--- a/fs/nilfs2/inode.c
+++ b/fs/nilfs2/inode.c
@@ -305,7 +305,7 @@ static int nilfs_write_end(struct file *file, struct address_space *mapping,
305} 305}
306 306
307static ssize_t 307static ssize_t
308nilfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) 308nilfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
309{ 309{
310 struct inode *inode = file_inode(iocb->ki_filp); 310 struct inode *inode = file_inode(iocb->ki_filp);
311 311
@@ -313,7 +313,7 @@ nilfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset)
313 return 0; 313 return 0;
314 314
315 /* Needs synchronization with the cleaner */ 315 /* Needs synchronization with the cleaner */
316 return blockdev_direct_IO(iocb, inode, iter, offset, nilfs_get_block); 316 return blockdev_direct_IO(iocb, inode, iter, nilfs_get_block);
317} 317}
318 318
319const struct address_space_operations nilfs_aops = { 319const struct address_space_operations nilfs_aops = {
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c
index 91117ada8528..5622ed5a201e 100644
--- a/fs/ntfs/file.c
+++ b/fs/ntfs/file.c
@@ -1952,12 +1952,9 @@ static ssize_t ntfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
1952 written = ntfs_perform_write(file, from, iocb->ki_pos); 1952 written = ntfs_perform_write(file, from, iocb->ki_pos);
1953 current->backing_dev_info = NULL; 1953 current->backing_dev_info = NULL;
1954 inode_unlock(vi); 1954 inode_unlock(vi);
1955 if (likely(written > 0)) {
1956 err = generic_write_sync(file, iocb->ki_pos, written);
1957 if (err < 0)
1958 written = 0;
1959 }
1960 iocb->ki_pos += written; 1955 iocb->ki_pos += written;
1956 if (likely(written > 0))
1957 written = generic_write_sync(iocb, written);
1961 return written ? written : err; 1958 return written ? written : err;
1962} 1959}
1963 1960
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
index abb0b0bf7c7f..c034edf3ef38 100644
--- a/fs/ocfs2/aops.c
+++ b/fs/ocfs2/aops.c
@@ -2423,13 +2423,11 @@ static int ocfs2_dio_end_io(struct kiocb *iocb,
2423 return 0; 2423 return 0;
2424} 2424}
2425 2425
2426static ssize_t ocfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 2426static ssize_t ocfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
2427 loff_t offset)
2428{ 2427{
2429 struct file *file = iocb->ki_filp; 2428 struct file *file = iocb->ki_filp;
2430 struct inode *inode = file_inode(file)->i_mapping->host; 2429 struct inode *inode = file_inode(file)->i_mapping->host;
2431 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); 2430 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2432 loff_t end = offset + iter->count;
2433 get_block_t *get_block; 2431 get_block_t *get_block;
2434 2432
2435 /* 2433 /*
@@ -2440,7 +2438,8 @@ static ssize_t ocfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
2440 return 0; 2438 return 0;
2441 2439
2442 /* Fallback to buffered I/O if we do not support append dio. */ 2440 /* Fallback to buffered I/O if we do not support append dio. */
2443 if (end > i_size_read(inode) && !ocfs2_supports_append_dio(osb)) 2441 if (iocb->ki_pos + iter->count > i_size_read(inode) &&
2442 !ocfs2_supports_append_dio(osb))
2444 return 0; 2443 return 0;
2445 2444
2446 if (iov_iter_rw(iter) == READ) 2445 if (iov_iter_rw(iter) == READ)
@@ -2449,7 +2448,7 @@ static ssize_t ocfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
2449 get_block = ocfs2_dio_get_block; 2448 get_block = ocfs2_dio_get_block;
2450 2449
2451 return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, 2450 return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev,
2452 iter, offset, get_block, 2451 iter, get_block,
2453 ocfs2_dio_end_io, NULL, 0); 2452 ocfs2_dio_end_io, NULL, 0);
2454} 2453}
2455 2454
diff --git a/fs/read_write.c b/fs/read_write.c
index 69c7c3c2955c..56425cd5c9e7 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -686,12 +686,16 @@ static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter,
686 struct kiocb kiocb; 686 struct kiocb kiocb;
687 ssize_t ret; 687 ssize_t ret;
688 688
689 if (flags & ~RWF_HIPRI) 689 if (flags & ~(RWF_HIPRI | RWF_DSYNC | RWF_SYNC))
690 return -EOPNOTSUPP; 690 return -EOPNOTSUPP;
691 691
692 init_sync_kiocb(&kiocb, filp); 692 init_sync_kiocb(&kiocb, filp);
693 if (flags & RWF_HIPRI) 693 if (flags & RWF_HIPRI)
694 kiocb.ki_flags |= IOCB_HIPRI; 694 kiocb.ki_flags |= IOCB_HIPRI;
695 if (flags & RWF_DSYNC)
696 kiocb.ki_flags |= IOCB_DSYNC;
697 if (flags & RWF_SYNC)
698 kiocb.ki_flags |= (IOCB_DSYNC | IOCB_SYNC);
695 kiocb.ki_pos = *ppos; 699 kiocb.ki_pos = *ppos;
696 700
697 ret = fn(&kiocb, iter); 701 ret = fn(&kiocb, iter);
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
index d5c2e9c865de..825455d3e4ba 100644
--- a/fs/reiserfs/inode.c
+++ b/fs/reiserfs/inode.c
@@ -3279,15 +3279,14 @@ static int reiserfs_releasepage(struct page *page, gfp_t unused_gfp_flags)
3279 * We thank Mingming Cao for helping us understand in great detail what 3279 * We thank Mingming Cao for helping us understand in great detail what
3280 * to do in this section of the code. 3280 * to do in this section of the code.
3281 */ 3281 */
3282static ssize_t reiserfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 3282static ssize_t reiserfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
3283 loff_t offset)
3284{ 3283{
3285 struct file *file = iocb->ki_filp; 3284 struct file *file = iocb->ki_filp;
3286 struct inode *inode = file->f_mapping->host; 3285 struct inode *inode = file->f_mapping->host;
3287 size_t count = iov_iter_count(iter); 3286 size_t count = iov_iter_count(iter);
3288 ssize_t ret; 3287 ssize_t ret;
3289 3288
3290 ret = blockdev_direct_IO(iocb, inode, iter, offset, 3289 ret = blockdev_direct_IO(iocb, inode, iter,
3291 reiserfs_get_blocks_direct_io); 3290 reiserfs_get_blocks_direct_io);
3292 3291
3293 /* 3292 /*
@@ -3296,7 +3295,7 @@ static ssize_t reiserfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
3296 */ 3295 */
3297 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { 3296 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) {
3298 loff_t isize = i_size_read(inode); 3297 loff_t isize = i_size_read(inode);
3299 loff_t end = offset + count; 3298 loff_t end = iocb->ki_pos + count;
3300 3299
3301 if ((end > isize) && inode_newsize_ok(inode, isize) == 0) { 3300 if ((end > isize) && inode_newsize_ok(inode, isize) == 0) {
3302 truncate_setsize(inode, isize); 3301 truncate_setsize(inode, isize);
diff --git a/fs/udf/file.c b/fs/udf/file.c
index 877ba1c9b461..632570617327 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -99,8 +99,7 @@ static int udf_adinicb_write_begin(struct file *file,
99 return 0; 99 return 0;
100} 100}
101 101
102static ssize_t udf_adinicb_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 102static ssize_t udf_adinicb_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
103 loff_t offset)
104{ 103{
105 /* Fallback to buffered I/O. */ 104 /* Fallback to buffered I/O. */
106 return 0; 105 return 0;
@@ -153,9 +152,7 @@ out:
153 152
154 if (retval > 0) { 153 if (retval > 0) {
155 mark_inode_dirty(inode); 154 mark_inode_dirty(inode);
156 err = generic_write_sync(file, iocb->ki_pos - retval, retval); 155 retval = generic_write_sync(iocb, retval);
157 if (err < 0)
158 retval = err;
159 } 156 }
160 157
161 return retval; 158 return retval;
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index 2dc461eeb415..f323aff740ef 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -214,8 +214,7 @@ static int udf_write_begin(struct file *file, struct address_space *mapping,
214 return ret; 214 return ret;
215} 215}
216 216
217static ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter, 217static ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
218 loff_t offset)
219{ 218{
220 struct file *file = iocb->ki_filp; 219 struct file *file = iocb->ki_filp;
221 struct address_space *mapping = file->f_mapping; 220 struct address_space *mapping = file->f_mapping;
@@ -223,9 +222,9 @@ static ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
223 size_t count = iov_iter_count(iter); 222 size_t count = iov_iter_count(iter);
224 ssize_t ret; 223 ssize_t ret;
225 224
226 ret = blockdev_direct_IO(iocb, inode, iter, offset, udf_get_block); 225 ret = blockdev_direct_IO(iocb, inode, iter, udf_get_block);
227 if (unlikely(ret < 0 && iov_iter_rw(iter) == WRITE)) 226 if (unlikely(ret < 0 && iov_iter_rw(iter) == WRITE))
228 udf_write_failed(mapping, offset + count); 227 udf_write_failed(mapping, iocb->ki_pos + count);
229 return ret; 228 return ret;
230} 229}
231 230
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index e49b2406d15d..c535887c60a8 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -1406,8 +1406,7 @@ xfs_end_io_direct_write(
1406STATIC ssize_t 1406STATIC ssize_t
1407xfs_vm_direct_IO( 1407xfs_vm_direct_IO(
1408 struct kiocb *iocb, 1408 struct kiocb *iocb,
1409 struct iov_iter *iter, 1409 struct iov_iter *iter)
1410 loff_t offset)
1411{ 1410{
1412 struct inode *inode = iocb->ki_filp->f_mapping->host; 1411 struct inode *inode = iocb->ki_filp->f_mapping->host;
1413 dio_iodone_t *endio = NULL; 1412 dio_iodone_t *endio = NULL;
@@ -1420,12 +1419,12 @@ xfs_vm_direct_IO(
1420 } 1419 }
1421 1420
1422 if (IS_DAX(inode)) { 1421 if (IS_DAX(inode)) {
1423 return dax_do_io(iocb, inode, iter, offset, 1422 return dax_do_io(iocb, inode, iter,
1424 xfs_get_blocks_direct, endio, 0); 1423 xfs_get_blocks_direct, endio, 0);
1425 } 1424 }
1426 1425
1427 bdev = xfs_find_bdev_for_inode(inode); 1426 bdev = xfs_find_bdev_for_inode(inode);
1428 return __blockdev_direct_IO(iocb, inode, bdev, iter, offset, 1427 return __blockdev_direct_IO(iocb, inode, bdev, iter,
1429 xfs_get_blocks_direct, endio, NULL, flags); 1428 xfs_get_blocks_direct, endio, NULL, flags);
1430} 1429}
1431 1430
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 345fd85a1997..85ce3032f815 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -718,18 +718,19 @@ xfs_file_dio_aio_write(
718 int unaligned_io = 0; 718 int unaligned_io = 0;
719 int iolock; 719 int iolock;
720 size_t count = iov_iter_count(from); 720 size_t count = iov_iter_count(from);
721 loff_t pos = iocb->ki_pos;
722 loff_t end; 721 loff_t end;
723 struct iov_iter data; 722 struct iov_iter data;
724 struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? 723 struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ?
725 mp->m_rtdev_targp : mp->m_ddev_targp; 724 mp->m_rtdev_targp : mp->m_ddev_targp;
726 725
727 /* DIO must be aligned to device logical sector size */ 726 /* DIO must be aligned to device logical sector size */
728 if (!IS_DAX(inode) && ((pos | count) & target->bt_logical_sectormask)) 727 if (!IS_DAX(inode) &&
728 ((iocb->ki_pos | count) & target->bt_logical_sectormask))
729 return -EINVAL; 729 return -EINVAL;
730 730
731 /* "unaligned" here means not aligned to a filesystem block */ 731 /* "unaligned" here means not aligned to a filesystem block */
732 if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask)) 732 if ((iocb->ki_pos & mp->m_blockmask) ||
733 ((iocb->ki_pos + count) & mp->m_blockmask))
733 unaligned_io = 1; 734 unaligned_io = 1;
734 735
735 /* 736 /*
@@ -760,8 +761,7 @@ xfs_file_dio_aio_write(
760 if (ret) 761 if (ret)
761 goto out; 762 goto out;
762 count = iov_iter_count(from); 763 count = iov_iter_count(from);
763 pos = iocb->ki_pos; 764 end = iocb->ki_pos + count - 1;
764 end = pos + count - 1;
765 765
766 /* 766 /*
767 * See xfs_file_read_iter() for why we do a full-file flush here. 767 * See xfs_file_read_iter() for why we do a full-file flush here.
@@ -794,19 +794,18 @@ xfs_file_dio_aio_write(
794 trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); 794 trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0);
795 795
796 data = *from; 796 data = *from;
797 ret = mapping->a_ops->direct_IO(iocb, &data, pos); 797 ret = mapping->a_ops->direct_IO(iocb, &data);
798 798
799 /* see generic_file_direct_write() for why this is necessary */ 799 /* see generic_file_direct_write() for why this is necessary */
800 if (mapping->nrpages) { 800 if (mapping->nrpages) {
801 invalidate_inode_pages2_range(mapping, 801 invalidate_inode_pages2_range(mapping,
802 pos >> PAGE_SHIFT, 802 iocb->ki_pos >> PAGE_SHIFT,
803 end >> PAGE_SHIFT); 803 end >> PAGE_SHIFT);
804 } 804 }
805 805
806 if (ret > 0) { 806 if (ret > 0) {
807 pos += ret; 807 iocb->ki_pos += ret;
808 iov_iter_advance(from, ret); 808 iov_iter_advance(from, ret);
809 iocb->ki_pos = pos;
810 } 809 }
811out: 810out:
812 xfs_rw_iunlock(ip, iolock); 811 xfs_rw_iunlock(ip, iolock);
@@ -904,14 +903,10 @@ xfs_file_write_iter(
904 ret = xfs_file_buffered_aio_write(iocb, from); 903 ret = xfs_file_buffered_aio_write(iocb, from);
905 904
906 if (ret > 0) { 905 if (ret > 0) {
907 ssize_t err;
908
909 XFS_STATS_ADD(ip->i_mount, xs_write_bytes, ret); 906 XFS_STATS_ADD(ip->i_mount, xs_write_bytes, ret);
910 907
911 /* Handle various SYNC-type writes */ 908 /* Handle various SYNC-type writes */
912 err = generic_write_sync(file, iocb->ki_pos - ret, ret); 909 ret = generic_write_sync(iocb, ret);
913 if (err < 0)
914 ret = err;
915 } 910 }
916 return ret; 911 return ret;
917} 912}
diff --git a/include/linux/dax.h b/include/linux/dax.h
index 636dd59ab505..982a6c4a62f3 100644
--- a/include/linux/dax.h
+++ b/include/linux/dax.h
@@ -5,7 +5,7 @@
5#include <linux/mm.h> 5#include <linux/mm.h>
6#include <asm/pgtable.h> 6#include <asm/pgtable.h>
7 7
8ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, 8ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *,
9 get_block_t, dio_iodone_t, int flags); 9 get_block_t, dio_iodone_t, int flags);
10int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); 10int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size);
11int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); 11int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 98a18ccf3fc0..851390c8d75b 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -323,6 +323,8 @@ struct writeback_control;
323#define IOCB_APPEND (1 << 1) 323#define IOCB_APPEND (1 << 1)
324#define IOCB_DIRECT (1 << 2) 324#define IOCB_DIRECT (1 << 2)
325#define IOCB_HIPRI (1 << 3) 325#define IOCB_HIPRI (1 << 3)
326#define IOCB_DSYNC (1 << 4)
327#define IOCB_SYNC (1 << 5)
326 328
327struct kiocb { 329struct kiocb {
328 struct file *ki_filp; 330 struct file *ki_filp;
@@ -394,7 +396,7 @@ struct address_space_operations {
394 void (*invalidatepage) (struct page *, unsigned int, unsigned int); 396 void (*invalidatepage) (struct page *, unsigned int, unsigned int);
395 int (*releasepage) (struct page *, gfp_t); 397 int (*releasepage) (struct page *, gfp_t);
396 void (*freepage)(struct page *); 398 void (*freepage)(struct page *);
397 ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter, loff_t offset); 399 ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter);
398 /* 400 /*
399 * migrate the contents of a page to the specified target. If 401 * migrate the contents of a page to the specified target. If
400 * migrate_mode is MIGRATE_ASYNC, it must not block. 402 * migrate_mode is MIGRATE_ASYNC, it must not block.
@@ -2515,13 +2517,25 @@ extern int filemap_fdatawrite_range(struct address_space *mapping,
2515extern int vfs_fsync_range(struct file *file, loff_t start, loff_t end, 2517extern int vfs_fsync_range(struct file *file, loff_t start, loff_t end,
2516 int datasync); 2518 int datasync);
2517extern int vfs_fsync(struct file *file, int datasync); 2519extern int vfs_fsync(struct file *file, int datasync);
2518static inline int generic_write_sync(struct file *file, loff_t pos, loff_t count) 2520
2519{ 2521/*
2520 if (!(file->f_flags & O_DSYNC) && !IS_SYNC(file->f_mapping->host)) 2522 * Sync the bytes written if this was a synchronous write. Expect ki_pos
2521 return 0; 2523 * to already be updated for the write, and will return either the amount
2522 return vfs_fsync_range(file, pos, pos + count - 1, 2524 * of bytes passed in, or an error if syncing the file failed.
2523 (file->f_flags & __O_SYNC) ? 0 : 1); 2525 */
2526static inline ssize_t generic_write_sync(struct kiocb *iocb, ssize_t count)
2527{
2528 if (iocb->ki_flags & IOCB_DSYNC) {
2529 int ret = vfs_fsync_range(iocb->ki_filp,
2530 iocb->ki_pos - count, iocb->ki_pos - 1,
2531 (iocb->ki_flags & IOCB_SYNC) ? 0 : 1);
2532 if (ret)
2533 return ret;
2534 }
2535
2536 return count;
2524} 2537}
2538
2525extern void emergency_sync(void); 2539extern void emergency_sync(void);
2526extern void emergency_remount(void); 2540extern void emergency_remount(void);
2527#ifdef CONFIG_BLOCK 2541#ifdef CONFIG_BLOCK
@@ -2733,7 +2747,7 @@ extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *);
2733extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); 2747extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *);
2734extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); 2748extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *);
2735extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); 2749extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *);
2736extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *, loff_t); 2750extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *);
2737extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); 2751extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t);
2738 2752
2739ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); 2753ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos);
@@ -2796,18 +2810,17 @@ void dio_end_io(struct bio *bio, int error);
2796 2810
2797ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, 2811ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
2798 struct block_device *bdev, struct iov_iter *iter, 2812 struct block_device *bdev, struct iov_iter *iter,
2799 loff_t offset, get_block_t get_block, 2813 get_block_t get_block,
2800 dio_iodone_t end_io, dio_submit_t submit_io, 2814 dio_iodone_t end_io, dio_submit_t submit_io,
2801 int flags); 2815 int flags);
2802 2816
2803static inline ssize_t blockdev_direct_IO(struct kiocb *iocb, 2817static inline ssize_t blockdev_direct_IO(struct kiocb *iocb,
2804 struct inode *inode, 2818 struct inode *inode,
2805 struct iov_iter *iter, loff_t offset, 2819 struct iov_iter *iter,
2806 get_block_t get_block) 2820 get_block_t get_block)
2807{ 2821{
2808 return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, 2822 return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter,
2809 offset, get_block, NULL, NULL, 2823 get_block, NULL, NULL, DIO_LOCKING | DIO_SKIP_HOLES);
2810 DIO_LOCKING | DIO_SKIP_HOLES);
2811} 2824}
2812#endif 2825#endif
2813 2826
@@ -2973,6 +2986,10 @@ static inline int iocb_flags(struct file *file)
2973 res |= IOCB_APPEND; 2986 res |= IOCB_APPEND;
2974 if (io_is_direct(file)) 2987 if (io_is_direct(file))
2975 res |= IOCB_DIRECT; 2988 res |= IOCB_DIRECT;
2989 if ((file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host))
2990 res |= IOCB_DSYNC;
2991 if (file->f_flags & __O_SYNC)
2992 res |= IOCB_SYNC;
2976 return res; 2993 return res;
2977} 2994}
2978 2995
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index fa167f25465d..d71278c3c5bd 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -443,10 +443,9 @@ static inline struct rpc_cred *nfs_file_cred(struct file *file)
443/* 443/*
444 * linux/fs/nfs/direct.c 444 * linux/fs/nfs/direct.c
445 */ 445 */
446extern ssize_t nfs_direct_IO(struct kiocb *, struct iov_iter *, loff_t); 446extern ssize_t nfs_direct_IO(struct kiocb *, struct iov_iter *);
447extern ssize_t nfs_file_direct_read(struct kiocb *iocb, 447extern ssize_t nfs_file_direct_read(struct kiocb *iocb,
448 struct iov_iter *iter, 448 struct iov_iter *iter);
449 loff_t pos);
450extern ssize_t nfs_file_direct_write(struct kiocb *iocb, 449extern ssize_t nfs_file_direct_write(struct kiocb *iocb,
451 struct iov_iter *iter); 450 struct iov_iter *iter);
452 451
diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
index a079d50376e1..e21fe04acc12 100644
--- a/include/uapi/linux/fs.h
+++ b/include/uapi/linux/fs.h
@@ -324,5 +324,7 @@ struct fscrypt_policy {
324 324
325/* flags for preadv2/pwritev2: */ 325/* flags for preadv2/pwritev2: */
326#define RWF_HIPRI 0x00000001 /* high priority request, poll if possible */ 326#define RWF_HIPRI 0x00000001 /* high priority request, poll if possible */
327#define RWF_DSYNC 0x00000002 /* per-IO O_DSYNC */
328#define RWF_SYNC 0x00000004 /* per-IO O_SYNC */
327 329
328#endif /* _UAPI_LINUX_FS_H */ 330#endif /* _UAPI_LINUX_FS_H */
diff --git a/mm/filemap.c b/mm/filemap.c
index f2479af09da9..182b21825255 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1838,8 +1838,6 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
1838{ 1838{
1839 struct file *file = iocb->ki_filp; 1839 struct file *file = iocb->ki_filp;
1840 ssize_t retval = 0; 1840 ssize_t retval = 0;
1841 loff_t *ppos = &iocb->ki_pos;
1842 loff_t pos = *ppos;
1843 size_t count = iov_iter_count(iter); 1841 size_t count = iov_iter_count(iter);
1844 1842
1845 if (!count) 1843 if (!count)
@@ -1851,15 +1849,15 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
1851 loff_t size; 1849 loff_t size;
1852 1850
1853 size = i_size_read(inode); 1851 size = i_size_read(inode);
1854 retval = filemap_write_and_wait_range(mapping, pos, 1852 retval = filemap_write_and_wait_range(mapping, iocb->ki_pos,
1855 pos + count - 1); 1853 iocb->ki_pos + count - 1);
1856 if (!retval) { 1854 if (!retval) {
1857 struct iov_iter data = *iter; 1855 struct iov_iter data = *iter;
1858 retval = mapping->a_ops->direct_IO(iocb, &data, pos); 1856 retval = mapping->a_ops->direct_IO(iocb, &data);
1859 } 1857 }
1860 1858
1861 if (retval > 0) { 1859 if (retval > 0) {
1862 *ppos = pos + retval; 1860 iocb->ki_pos += retval;
1863 iov_iter_advance(iter, retval); 1861 iov_iter_advance(iter, retval);
1864 } 1862 }
1865 1863
@@ -1872,14 +1870,14 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
1872 * the rest of the read. Buffered reads will not work for 1870 * the rest of the read. Buffered reads will not work for
1873 * DAX files, so don't bother trying. 1871 * DAX files, so don't bother trying.
1874 */ 1872 */
1875 if (retval < 0 || !iov_iter_count(iter) || *ppos >= size || 1873 if (retval < 0 || !iov_iter_count(iter) || iocb->ki_pos >= size ||
1876 IS_DAX(inode)) { 1874 IS_DAX(inode)) {
1877 file_accessed(file); 1875 file_accessed(file);
1878 goto out; 1876 goto out;
1879 } 1877 }
1880 } 1878 }
1881 1879
1882 retval = do_generic_file_read(file, ppos, iter, retval); 1880 retval = do_generic_file_read(file, &iocb->ki_pos, iter, retval);
1883out: 1881out:
1884 return retval; 1882 return retval;
1885} 1883}
@@ -2500,11 +2498,12 @@ int pagecache_write_end(struct file *file, struct address_space *mapping,
2500EXPORT_SYMBOL(pagecache_write_end); 2498EXPORT_SYMBOL(pagecache_write_end);
2501 2499
2502ssize_t 2500ssize_t
2503generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos) 2501generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
2504{ 2502{
2505 struct file *file = iocb->ki_filp; 2503 struct file *file = iocb->ki_filp;
2506 struct address_space *mapping = file->f_mapping; 2504 struct address_space *mapping = file->f_mapping;
2507 struct inode *inode = mapping->host; 2505 struct inode *inode = mapping->host;
2506 loff_t pos = iocb->ki_pos;
2508 ssize_t written; 2507 ssize_t written;
2509 size_t write_len; 2508 size_t write_len;
2510 pgoff_t end; 2509 pgoff_t end;
@@ -2538,7 +2537,7 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos)
2538 } 2537 }
2539 2538
2540 data = *from; 2539 data = *from;
2541 written = mapping->a_ops->direct_IO(iocb, &data, pos); 2540 written = mapping->a_ops->direct_IO(iocb, &data);
2542 2541
2543 /* 2542 /*
2544 * Finally, try again to invalidate clean pages which might have been 2543 * Finally, try again to invalidate clean pages which might have been
@@ -2718,7 +2717,7 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
2718 if (iocb->ki_flags & IOCB_DIRECT) { 2717 if (iocb->ki_flags & IOCB_DIRECT) {
2719 loff_t pos, endbyte; 2718 loff_t pos, endbyte;
2720 2719
2721 written = generic_file_direct_write(iocb, from, iocb->ki_pos); 2720 written = generic_file_direct_write(iocb, from);
2722 /* 2721 /*
2723 * If the write stopped short of completing, fall back to 2722 * If the write stopped short of completing, fall back to
2724 * buffered writes. Some filesystems do this for writes to 2723 * buffered writes. Some filesystems do this for writes to
@@ -2792,13 +2791,8 @@ ssize_t generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
2792 ret = __generic_file_write_iter(iocb, from); 2791 ret = __generic_file_write_iter(iocb, from);
2793 inode_unlock(inode); 2792 inode_unlock(inode);
2794 2793
2795 if (ret > 0) { 2794 if (ret > 0)
2796 ssize_t err; 2795 ret = generic_write_sync(iocb, ret);
2797
2798 err = generic_write_sync(file, iocb->ki_pos - ret, ret);
2799 if (err < 0)
2800 ret = err;
2801 }
2802 return ret; 2796 return ret;
2803} 2797}
2804EXPORT_SYMBOL(generic_file_write_iter); 2798EXPORT_SYMBOL(generic_file_write_iter);
diff --git a/mm/page_io.c b/mm/page_io.c
index 985f23cfa79b..242dba07545b 100644
--- a/mm/page_io.c
+++ b/mm/page_io.c
@@ -279,7 +279,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc,
279 279
280 set_page_writeback(page); 280 set_page_writeback(page);
281 unlock_page(page); 281 unlock_page(page);
282 ret = mapping->a_ops->direct_IO(&kiocb, &from, kiocb.ki_pos); 282 ret = mapping->a_ops->direct_IO(&kiocb, &from);
283 if (ret == PAGE_SIZE) { 283 if (ret == PAGE_SIZE) {
284 count_vm_event(PSWPOUT); 284 count_vm_event(PSWPOUT);
285 ret = 0; 285 ret = 0;