diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-17 18:05:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-17 18:05:23 -0400 |
commit | c2e7b207058d4ff6a9010430763fb561f307eb67 (patch) | |
tree | 8983947c4d62365de3d98113662ff9e643a42a0f | |
parent | c52b76185b7a1b300e5f15ff871c8f45ced3dee9 (diff) | |
parent | 24368aad47dc65b45040d6a31bfd6df1d6f3ec97 (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
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)) |
361 | static ssize_t ll_direct_IO_26(struct kiocb *iocb, struct iov_iter *iter, | 361 | static 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 | */ |
247 | static ssize_t | 247 | static ssize_t |
248 | v9fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) | 248 | v9fs_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 | ||
391 | static ssize_t | 391 | static ssize_t |
392 | affs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | 392 | affs_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 | ||
164 | static ssize_t | 164 | static ssize_t |
165 | blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | 165 | blkdev_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 | ||
1706 | static ssize_t __btrfs_direct_write(struct kiocb *iocb, | 1706 | static 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 | ||
8544 | static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 8544 | static 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 | */ |
1295 | static ssize_t ceph_direct_io(struct kiocb *iocb, struct iov_iter *iter, | 1295 | static 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) | |||
2687 | out: | 2687 | out: |
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 | */ |
3856 | static ssize_t | 3853 | static ssize_t |
3857 | cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) | 3854 | cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter) |
3858 | { | 3855 | { |
3859 | /* | 3856 | /* |
3860 | * FIXME | 3857 | * FIXME |
@@ -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 | */ |
259 | ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode, | 258 | ssize_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 | */ |
227 | static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, | 227 | static 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 | ||
291 | static int dio_bio_complete(struct dio *dio, struct bio *bio); | 292 | static 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) | |||
1113 | static inline ssize_t | 1114 | static inline ssize_t |
1114 | do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, | 1115 | do_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 | ||
1329 | ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, | 1331 | ssize_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 */ |
963 | static ssize_t exofs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 963 | static 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 | ||
856 | static ssize_t | 856 | static ssize_t |
857 | ext2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | 857 | ext2_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 */ |
2582 | extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode, | 2582 | extern 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); |
2584 | extern ssize_t ext4_ind_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 2584 | extern ssize_t ext4_ind_direct_IO(struct kiocb *iocb, struct iov_iter *iter); |
2585 | loff_t offset); | ||
2586 | extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock); | 2585 | extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock); |
2587 | extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks); | 2586 | extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks); |
2588 | extern void ext4_ind_truncate(handle_t *, struct inode *inode); | 2587 | extern 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 | */ |
662 | ssize_t ext4_ind_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 662 | ssize_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 { |
719 | locked: | 719 | locked: |
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 | */ |
3337 | static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 3337 | static 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 | ||
3434 | static ssize_t ext4_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 3434 | static 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 | ||
1668 | static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 1668 | static 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 | ||
247 | static ssize_t fat_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 247 | static 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 | ||
2839 | static ssize_t | 2839 | static ssize_t |
2840 | fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | 2840 | fuse_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 | ||
1045 | static ssize_t gfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 1045 | static 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); |
1103 | out: | 1103 | out: |
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 | ||
900 | out_trans_fail: | 903 | out_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 | ||
127 | static ssize_t hfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 127 | static 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 | ||
125 | static ssize_t hfsplus_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 125 | static 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 | ||
335 | static ssize_t jfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 335 | static 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 | */ |
253 | ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) | 253 | ssize_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 | */ |
564 | ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter, | 563 | ssize_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 | ||
978 | out_nfserr: | 974 | out_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 | ||
307 | static ssize_t | 307 | static ssize_t |
308 | nilfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | 308 | nilfs_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 | ||
319 | const struct address_space_operations nilfs_aops = { | 319 | const 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 | ||
2426 | static ssize_t ocfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 2426 | static 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 | */ |
3282 | static ssize_t reiserfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 3282 | static 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 | ||
102 | static ssize_t udf_adinicb_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 102 | static 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 | ||
217 | static ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 217 | static 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( | |||
1406 | STATIC ssize_t | 1406 | STATIC ssize_t |
1407 | xfs_vm_direct_IO( | 1407 | xfs_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 | } |
811 | out: | 810 | out: |
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 | ||
8 | ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, | 8 | ssize_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); |
10 | int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); | 10 | int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size); |
11 | int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); | 11 | int 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 | ||
327 | struct kiocb { | 329 | struct 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, | |||
2515 | extern int vfs_fsync_range(struct file *file, loff_t start, loff_t end, | 2517 | extern int vfs_fsync_range(struct file *file, loff_t start, loff_t end, |
2516 | int datasync); | 2518 | int datasync); |
2517 | extern int vfs_fsync(struct file *file, int datasync); | 2519 | extern int vfs_fsync(struct file *file, int datasync); |
2518 | static 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 | */ |
2526 | static 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 | |||
2525 | extern void emergency_sync(void); | 2539 | extern void emergency_sync(void); |
2526 | extern void emergency_remount(void); | 2540 | extern 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 *); | |||
2733 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); | 2747 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); |
2734 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); | 2748 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); |
2735 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); | 2749 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); |
2736 | extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *, loff_t); | 2750 | extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *); |
2737 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); | 2751 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); |
2738 | 2752 | ||
2739 | ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); | 2753 | ssize_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 | ||
2797 | ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, | 2811 | ssize_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 | ||
2803 | static inline ssize_t blockdev_direct_IO(struct kiocb *iocb, | 2817 | static 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 | */ |
446 | extern ssize_t nfs_direct_IO(struct kiocb *, struct iov_iter *, loff_t); | 446 | extern ssize_t nfs_direct_IO(struct kiocb *, struct iov_iter *); |
447 | extern ssize_t nfs_file_direct_read(struct kiocb *iocb, | 447 | extern ssize_t nfs_file_direct_read(struct kiocb *iocb, |
448 | struct iov_iter *iter, | 448 | struct iov_iter *iter); |
449 | loff_t pos); | ||
450 | extern ssize_t nfs_file_direct_write(struct kiocb *iocb, | 449 | extern 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); |
1883 | out: | 1881 | out: |
1884 | return retval; | 1882 | return retval; |
1885 | } | 1883 | } |
@@ -2500,11 +2498,12 @@ int pagecache_write_end(struct file *file, struct address_space *mapping, | |||
2500 | EXPORT_SYMBOL(pagecache_write_end); | 2498 | EXPORT_SYMBOL(pagecache_write_end); |
2501 | 2499 | ||
2502 | ssize_t | 2500 | ssize_t |
2503 | generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos) | 2501 | generic_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 | } |
2804 | EXPORT_SYMBOL(generic_file_write_iter); | 2798 | EXPORT_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; |