diff options
author | Christoph Hellwig <hch@lst.de> | 2016-04-07 11:51:58 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-05-01 19:58:39 -0400 |
commit | c8b8e32d700fe943a935e435ae251364d016c497 (patch) | |
tree | 956e582a123c6b2761e80901bdaaedc5ba4137e3 | |
parent | 13712713caba0c1b8c2c0070a4c1f4487def8dee (diff) |
direct-io: eliminate the offset argument to ->direct_IO
Including blkdev_direct_IO and dax_do_io. It has to be ki_pos to actually
work, so eliminate the superflous argument.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
37 files changed, 99 insertions, 112 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..9e1f3fe25753 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 | } |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 2aaba58b4856..352d4e1dc985 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/cifs/file.c b/fs/cifs/file.c index c03d0744648b..cb070aa88e57 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -3854,7 +3854,7 @@ void cifs_oplock_break(struct work_struct *work) | |||
3854 | * Direct IO is not yet supported in the cached mode. | 3854 | * Direct IO is not yet supported in the cached mode. |
3855 | */ | 3855 | */ |
3856 | static ssize_t | 3856 | static ssize_t |
3857 | cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) | 3857 | cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter) |
3858 | { | 3858 | { |
3859 | /* | 3859 | /* |
3860 | * FIXME | 3860 | * 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..8949d3e35756 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
@@ -1113,7 +1113,7 @@ static inline int drop_refcount(struct dio *dio) | |||
1113 | static inline ssize_t | 1113 | static inline ssize_t |
1114 | do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, | 1114 | do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, |
1115 | struct block_device *bdev, struct iov_iter *iter, | 1115 | struct block_device *bdev, struct iov_iter *iter, |
1116 | loff_t offset, get_block_t get_block, dio_iodone_t end_io, | 1116 | get_block_t get_block, dio_iodone_t end_io, |
1117 | dio_submit_t submit_io, int flags) | 1117 | dio_submit_t submit_io, int flags) |
1118 | { | 1118 | { |
1119 | unsigned i_blkbits = ACCESS_ONCE(inode->i_blkbits); | 1119 | unsigned i_blkbits = ACCESS_ONCE(inode->i_blkbits); |
@@ -1121,6 +1121,7 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, | |||
1121 | unsigned blocksize_mask = (1 << blkbits) - 1; | 1121 | unsigned blocksize_mask = (1 << blkbits) - 1; |
1122 | ssize_t retval = -EINVAL; | 1122 | ssize_t retval = -EINVAL; |
1123 | size_t count = iov_iter_count(iter); | 1123 | size_t count = iov_iter_count(iter); |
1124 | loff_t offset = iocb->ki_pos; | ||
1124 | loff_t end = offset + count; | 1125 | loff_t end = offset + count; |
1125 | struct dio *dio; | 1126 | struct dio *dio; |
1126 | struct dio_submit sdio = { 0, }; | 1127 | struct dio_submit sdio = { 0, }; |
@@ -1328,7 +1329,7 @@ out: | |||
1328 | 1329 | ||
1329 | ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, | 1330 | ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, |
1330 | struct block_device *bdev, struct iov_iter *iter, | 1331 | struct block_device *bdev, struct iov_iter *iter, |
1331 | loff_t offset, get_block_t get_block, | 1332 | get_block_t get_block, |
1332 | dio_iodone_t end_io, dio_submit_t submit_io, | 1333 | dio_iodone_t end_io, dio_submit_t submit_io, |
1333 | int flags) | 1334 | int flags) |
1334 | { | 1335 | { |
@@ -1344,7 +1345,7 @@ ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, | |||
1344 | prefetch(bdev->bd_queue); | 1345 | prefetch(bdev->bd_queue); |
1345 | prefetch((char *)bdev->bd_queue + SMP_CACHE_BYTES); | 1346 | prefetch((char *)bdev->bd_queue + SMP_CACHE_BYTES); |
1346 | 1347 | ||
1347 | return do_blockdev_direct_IO(iocb, inode, bdev, iter, offset, get_block, | 1348 | return do_blockdev_direct_IO(iocb, inode, bdev, iter, get_block, |
1348 | end_io, submit_io, flags); | 1349 | end_io, submit_io, flags); |
1349 | } | 1350 | } |
1350 | 1351 | ||
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/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 53fec0872e60..a4c5da5bfe1e 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -1655,12 +1655,12 @@ static int check_direct_IO(struct inode *inode, struct iov_iter *iter, | |||
1655 | return 0; | 1655 | return 0; |
1656 | } | 1656 | } |
1657 | 1657 | ||
1658 | static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | 1658 | static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) |
1659 | loff_t offset) | ||
1660 | { | 1659 | { |
1661 | struct address_space *mapping = iocb->ki_filp->f_mapping; | 1660 | struct address_space *mapping = iocb->ki_filp->f_mapping; |
1662 | struct inode *inode = mapping->host; | 1661 | struct inode *inode = mapping->host; |
1663 | size_t count = iov_iter_count(iter); | 1662 | size_t count = iov_iter_count(iter); |
1663 | loff_t offset = iocb->ki_pos; | ||
1664 | int err; | 1664 | int err; |
1665 | 1665 | ||
1666 | err = check_direct_IO(inode, iter, offset); | 1666 | err = check_direct_IO(inode, iter, offset); |
@@ -1672,7 +1672,7 @@ static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | |||
1672 | 1672 | ||
1673 | trace_f2fs_direct_IO_enter(inode, offset, count, iov_iter_rw(iter)); | 1673 | trace_f2fs_direct_IO_enter(inode, offset, count, iov_iter_rw(iter)); |
1674 | 1674 | ||
1675 | err = blockdev_direct_IO(iocb, inode, iter, offset, get_data_block_dio); | 1675 | err = blockdev_direct_IO(iocb, inode, iter, get_data_block_dio); |
1676 | if (err < 0 && iov_iter_rw(iter) == WRITE) | 1676 | if (err < 0 && iov_iter_rw(iter) == WRITE) |
1677 | f2fs_write_failed(mapping, offset + count); | 1677 | f2fs_write_failed(mapping, offset + count); |
1678 | 1678 | ||
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 7e8c4603d43a..02279073bf64 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -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/hfs/inode.c b/fs/hfs/inode.c index cb1e5faa2fb7..c82331a9cf9b 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 b28f39865c3a..2ad34a5eb5ad 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 9d9bae63ae2a..f6a2a78121b0 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 c93826e4a8c6..346b5d85ce92 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 |
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/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/ocfs2/aops.c b/fs/ocfs2/aops.c index ad1577348a92..6c66c62d4a7e 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/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..7ab8d8196e90 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; |
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 92f72fb05497..5de047ab2411 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c | |||
@@ -794,7 +794,7 @@ 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, iocb->ki_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) { |
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 e9eaa2074061..e6b2de159736 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -394,7 +394,7 @@ struct address_space_operations { | |||
394 | void (*invalidatepage) (struct page *, unsigned int, unsigned int); | 394 | void (*invalidatepage) (struct page *, unsigned int, unsigned int); |
395 | int (*releasepage) (struct page *, gfp_t); | 395 | int (*releasepage) (struct page *, gfp_t); |
396 | void (*freepage)(struct page *); | 396 | void (*freepage)(struct page *); |
397 | ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter, loff_t offset); | 397 | ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter); |
398 | /* | 398 | /* |
399 | * migrate the contents of a page to the specified target. If | 399 | * migrate the contents of a page to the specified target. If |
400 | * migrate_mode is MIGRATE_ASYNC, it must not block. | 400 | * migrate_mode is MIGRATE_ASYNC, it must not block. |
@@ -2766,18 +2766,17 @@ void dio_end_io(struct bio *bio, int error); | |||
2766 | 2766 | ||
2767 | ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, | 2767 | ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, |
2768 | struct block_device *bdev, struct iov_iter *iter, | 2768 | struct block_device *bdev, struct iov_iter *iter, |
2769 | loff_t offset, get_block_t get_block, | 2769 | get_block_t get_block, |
2770 | dio_iodone_t end_io, dio_submit_t submit_io, | 2770 | dio_iodone_t end_io, dio_submit_t submit_io, |
2771 | int flags); | 2771 | int flags); |
2772 | 2772 | ||
2773 | static inline ssize_t blockdev_direct_IO(struct kiocb *iocb, | 2773 | static inline ssize_t blockdev_direct_IO(struct kiocb *iocb, |
2774 | struct inode *inode, | 2774 | struct inode *inode, |
2775 | struct iov_iter *iter, loff_t offset, | 2775 | struct iov_iter *iter, |
2776 | get_block_t get_block) | 2776 | get_block_t get_block) |
2777 | { | 2777 | { |
2778 | return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, | 2778 | return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, |
2779 | offset, get_block, NULL, NULL, | 2779 | get_block, NULL, NULL, DIO_LOCKING | DIO_SKIP_HOLES); |
2780 | DIO_LOCKING | DIO_SKIP_HOLES); | ||
2781 | } | 2780 | } |
2782 | #endif | 2781 | #endif |
2783 | 2782 | ||
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 67300f8e5f2f..cede8f6a7e2d 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -445,10 +445,9 @@ static inline struct rpc_cred *nfs_file_cred(struct file *file) | |||
445 | /* | 445 | /* |
446 | * linux/fs/nfs/direct.c | 446 | * linux/fs/nfs/direct.c |
447 | */ | 447 | */ |
448 | extern ssize_t nfs_direct_IO(struct kiocb *, struct iov_iter *, loff_t); | 448 | extern ssize_t nfs_direct_IO(struct kiocb *, struct iov_iter *); |
449 | extern ssize_t nfs_file_direct_read(struct kiocb *iocb, | 449 | extern ssize_t nfs_file_direct_read(struct kiocb *iocb, |
450 | struct iov_iter *iter, | 450 | struct iov_iter *iter); |
451 | loff_t pos); | ||
452 | extern ssize_t nfs_file_direct_write(struct kiocb *iocb, | 451 | extern ssize_t nfs_file_direct_write(struct kiocb *iocb, |
453 | struct iov_iter *iter); | 452 | struct iov_iter *iter); |
454 | 453 | ||
diff --git a/mm/filemap.c b/mm/filemap.c index e7108c31346d..cb36db9f4107 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1853,8 +1853,7 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) | |||
1853 | iocb->ki_pos + count - 1); | 1853 | iocb->ki_pos + count - 1); |
1854 | if (!retval) { | 1854 | if (!retval) { |
1855 | struct iov_iter data = *iter; | 1855 | struct iov_iter data = *iter; |
1856 | retval = mapping->a_ops->direct_IO(iocb, &data, | 1856 | retval = mapping->a_ops->direct_IO(iocb, &data); |
1857 | iocb->ki_pos); | ||
1858 | } | 1857 | } |
1859 | 1858 | ||
1860 | if (retval > 0) { | 1859 | if (retval > 0) { |
@@ -2538,7 +2537,7 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from) | |||
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 |
diff --git a/mm/page_io.c b/mm/page_io.c index cd92e3d67a32..89275601d399 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; |