diff options
-rw-r--r-- | fs/btrfs/file.c | 2 | ||||
-rw-r--r-- | fs/ceph/file.c | 8 | ||||
-rw-r--r-- | fs/cifs/file.c | 4 | ||||
-rw-r--r-- | fs/fuse/file.c | 6 | ||||
-rw-r--r-- | fs/nfs/file.c | 4 | ||||
-rw-r--r-- | fs/ocfs2/file.c | 2 | ||||
-rw-r--r-- | fs/pipe.c | 2 | ||||
-rw-r--r-- | fs/splice.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_file.c | 4 | ||||
-rw-r--r-- | include/linux/uio.h | 15 | ||||
-rw-r--r-- | mm/filemap.c | 4 | ||||
-rw-r--r-- | mm/iov_iter.c | 15 | ||||
-rw-r--r-- | mm/page_io.c | 2 | ||||
-rw-r--r-- | mm/process_vm_access.c | 4 | ||||
-rw-r--r-- | mm/shmem.c | 2 |
15 files changed, 41 insertions, 35 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index a0a94a30d85a..f8cee205618a 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1740,7 +1740,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
1740 | goto out; | 1740 | goto out; |
1741 | } | 1741 | } |
1742 | 1742 | ||
1743 | iov_iter_init(&i, iov, nr_segs, count, 0); | 1743 | iov_iter_init(&i, WRITE, iov, nr_segs, count); |
1744 | 1744 | ||
1745 | err = file_remove_suid(file); | 1745 | err = file_remove_suid(file); |
1746 | if (err) { | 1746 | if (err) { |
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 910a3022eb27..5b93cadedfbe 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
@@ -582,7 +582,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov, | |||
582 | CEPH_OSD_FLAG_ONDISK | | 582 | CEPH_OSD_FLAG_ONDISK | |
583 | CEPH_OSD_FLAG_WRITE; | 583 | CEPH_OSD_FLAG_WRITE; |
584 | 584 | ||
585 | iov_iter_init(&i, iov, nr_segs, count, 0); | 585 | iov_iter_init(&i, WRITE, iov, nr_segs, count); |
586 | 586 | ||
587 | while (iov_iter_count(&i) > 0) { | 587 | while (iov_iter_count(&i) > 0) { |
588 | void __user *data = i.iov->iov_base + i.iov_offset; | 588 | void __user *data = i.iov->iov_base + i.iov_offset; |
@@ -703,7 +703,7 @@ static ssize_t ceph_sync_write(struct kiocb *iocb, const struct iovec *iov, | |||
703 | CEPH_OSD_FLAG_WRITE | | 703 | CEPH_OSD_FLAG_WRITE | |
704 | CEPH_OSD_FLAG_ACK; | 704 | CEPH_OSD_FLAG_ACK; |
705 | 705 | ||
706 | iov_iter_init(&i, iov, nr_segs, count, 0); | 706 | iov_iter_init(&i, WRITE, iov, nr_segs, count); |
707 | 707 | ||
708 | while ((len = iov_iter_count(&i)) > 0) { | 708 | while ((len = iov_iter_count(&i)) > 0) { |
709 | size_t left; | 709 | size_t left; |
@@ -808,7 +808,7 @@ static ssize_t ceph_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
808 | int checkeof = 0, read = 0; | 808 | int checkeof = 0, read = 0; |
809 | struct iov_iter i; | 809 | struct iov_iter i; |
810 | 810 | ||
811 | iov_iter_init(&i, iov, nr_segs, len, 0); | 811 | iov_iter_init(&i, READ, iov, nr_segs, len); |
812 | 812 | ||
813 | again: | 813 | again: |
814 | dout("aio_read %p %llx.%llx %llu~%u trying to get caps on %p\n", | 814 | dout("aio_read %p %llx.%llx %llu~%u trying to get caps on %p\n", |
@@ -961,7 +961,7 @@ retry_snap: | |||
961 | * are pending vmtruncate. So write and vmtruncate | 961 | * are pending vmtruncate. So write and vmtruncate |
962 | * can not run at the same time | 962 | * can not run at the same time |
963 | */ | 963 | */ |
964 | iov_iter_init(&from, iov, nr_segs, count, 0); | 964 | iov_iter_init(&from, WRITE, iov, nr_segs, count); |
965 | written = generic_perform_write(file, &from, pos); | 965 | written = generic_perform_write(file, &from, pos); |
966 | if (likely(written >= 0)) | 966 | if (likely(written >= 0)) |
967 | iocb->ki_pos = pos + written; | 967 | iocb->ki_pos = pos + written; |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index a4ccc39e6c11..15201c21ac88 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -2424,7 +2424,7 @@ cifs_iovec_write(struct file *file, const struct iovec *iov, | |||
2424 | else | 2424 | else |
2425 | pid = current->tgid; | 2425 | pid = current->tgid; |
2426 | 2426 | ||
2427 | iov_iter_init(&it, iov, nr_segs, len, 0); | 2427 | iov_iter_init(&it, WRITE, iov, nr_segs, len); |
2428 | do { | 2428 | do { |
2429 | size_t save_len; | 2429 | size_t save_len; |
2430 | 2430 | ||
@@ -2854,7 +2854,7 @@ ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov, | |||
2854 | if (!len) | 2854 | if (!len) |
2855 | return 0; | 2855 | return 0; |
2856 | 2856 | ||
2857 | iov_iter_init(&to, iov, nr_segs, len, 0); | 2857 | iov_iter_init(&to, READ, iov, nr_segs, len); |
2858 | 2858 | ||
2859 | INIT_LIST_HEAD(&rdata_list); | 2859 | INIT_LIST_HEAD(&rdata_list); |
2860 | cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); | 2860 | cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index fc54d04a41e2..4a5519ca253f 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -1217,7 +1217,7 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
1217 | err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); | 1217 | err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); |
1218 | if (err) | 1218 | if (err) |
1219 | goto out; | 1219 | goto out; |
1220 | iov_iter_init(&i, iov, nr_segs, count, 0); | 1220 | iov_iter_init(&i, WRITE, iov, nr_segs, count); |
1221 | 1221 | ||
1222 | if (count == 0) | 1222 | if (count == 0) |
1223 | goto out; | 1223 | goto out; |
@@ -1386,7 +1386,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov, | |||
1386 | struct fuse_req *req; | 1386 | struct fuse_req *req; |
1387 | struct iov_iter ii; | 1387 | struct iov_iter ii; |
1388 | 1388 | ||
1389 | iov_iter_init(&ii, iov, nr_segs, count, 0); | 1389 | iov_iter_init(&ii, write ? WRITE : READ, iov, nr_segs, count); |
1390 | 1390 | ||
1391 | if (io->async) | 1391 | if (io->async) |
1392 | req = fuse_get_req_for_background(fc, fuse_iter_npages(&ii)); | 1392 | req = fuse_get_req_for_background(fc, fuse_iter_npages(&ii)); |
@@ -2367,7 +2367,7 @@ static int fuse_ioctl_copy_user(struct page **pages, struct iovec *iov, | |||
2367 | if (!bytes) | 2367 | if (!bytes) |
2368 | return 0; | 2368 | return 0; |
2369 | 2369 | ||
2370 | iov_iter_init(&ii, iov, nr_segs, bytes, 0); | 2370 | iov_iter_init(&ii, to_user ? READ : WRITE, iov, nr_segs, bytes); |
2371 | 2371 | ||
2372 | while (iov_iter_count(&ii)) { | 2372 | while (iov_iter_count(&ii)) { |
2373 | struct page *page = pages[page_idx++]; | 2373 | struct page *page = pages[page_idx++]; |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index a352bc6d613f..ead8f44f7973 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -173,7 +173,7 @@ nfs_file_read(struct kiocb *iocb, const struct iovec *iov, | |||
173 | ssize_t result; | 173 | ssize_t result; |
174 | struct iov_iter to; | 174 | struct iov_iter to; |
175 | 175 | ||
176 | iov_iter_init(&to, iov, nr_segs, count, 0); | 176 | iov_iter_init(&to, READ, iov, nr_segs, count); |
177 | 177 | ||
178 | if (iocb->ki_filp->f_flags & O_DIRECT) | 178 | if (iocb->ki_filp->f_flags & O_DIRECT) |
179 | return nfs_file_direct_read(iocb, &to, pos, true); | 179 | return nfs_file_direct_read(iocb, &to, pos, true); |
@@ -648,7 +648,7 @@ ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov, | |||
648 | ssize_t result; | 648 | ssize_t result; |
649 | size_t count = iov_length(iov, nr_segs); | 649 | size_t count = iov_length(iov, nr_segs); |
650 | struct iov_iter from; | 650 | struct iov_iter from; |
651 | iov_iter_init(&from, iov, nr_segs, count, 0); | 651 | iov_iter_init(&from, WRITE, iov, nr_segs, count); |
652 | 652 | ||
653 | result = nfs_key_timeout_notify(file, inode); | 653 | result = nfs_key_timeout_notify(file, inode); |
654 | if (result) | 654 | if (result) |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index d33c4ced0baf..9ce9ed7615c1 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -2361,7 +2361,7 @@ relock: | |||
2361 | if (ret) | 2361 | if (ret) |
2362 | goto out_dio; | 2362 | goto out_dio; |
2363 | 2363 | ||
2364 | iov_iter_init(&from, iov, nr_segs, count, 0); | 2364 | iov_iter_init(&from, WRITE, iov, nr_segs, count); |
2365 | if (direct_io) { | 2365 | if (direct_io) { |
2366 | written = generic_file_direct_write(iocb, &from, *ppos, | 2366 | written = generic_file_direct_write(iocb, &from, *ppos, |
2367 | count, ocount); | 2367 | count, ocount); |
@@ -287,7 +287,7 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov, | |||
287 | if (unlikely(total_len == 0)) | 287 | if (unlikely(total_len == 0)) |
288 | return 0; | 288 | return 0; |
289 | 289 | ||
290 | iov_iter_init(&iter, iov, nr_segs, total_len, 0); | 290 | iov_iter_init(&iter, READ, iov, nr_segs, total_len); |
291 | 291 | ||
292 | do_wakeup = 0; | 292 | do_wakeup = 0; |
293 | ret = 0; | 293 | ret = 0; |
diff --git a/fs/splice.c b/fs/splice.c index 9bc07d2b53cf..f99e420744c7 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -1548,7 +1548,7 @@ static long vmsplice_to_user(struct file *file, const struct iovec __user *uiov, | |||
1548 | if (ret <= 0) | 1548 | if (ret <= 0) |
1549 | return ret; | 1549 | return ret; |
1550 | 1550 | ||
1551 | iov_iter_init(&iter, iov, nr_segs, count, 0); | 1551 | iov_iter_init(&iter, READ, iov, nr_segs, count); |
1552 | 1552 | ||
1553 | sd.len = 0; | 1553 | sd.len = 0; |
1554 | sd.total_len = count; | 1554 | sd.total_len = count; |
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index f0f8084a67be..762bb3e148a6 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c | |||
@@ -697,7 +697,7 @@ xfs_file_dio_aio_write( | |||
697 | } | 697 | } |
698 | 698 | ||
699 | trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); | 699 | trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); |
700 | iov_iter_init(&from, iovp, nr_segs, count, 0); | 700 | iov_iter_init(&from, WRITE, iovp, nr_segs, count); |
701 | ret = generic_file_direct_write(iocb, &from, pos, count, ocount); | 701 | ret = generic_file_direct_write(iocb, &from, pos, count, ocount); |
702 | 702 | ||
703 | out: | 703 | out: |
@@ -731,7 +731,7 @@ xfs_file_buffered_aio_write( | |||
731 | if (ret) | 731 | if (ret) |
732 | goto out; | 732 | goto out; |
733 | 733 | ||
734 | iov_iter_init(&from, iovp, nr_segs, count, 0); | 734 | iov_iter_init(&from, WRITE, iovp, nr_segs, count); |
735 | /* We can write back this queue in page reclaim */ | 735 | /* We can write back this queue in page reclaim */ |
736 | current->backing_dev_info = mapping->backing_dev_info; | 736 | current->backing_dev_info = mapping->backing_dev_info; |
737 | 737 | ||
diff --git a/include/linux/uio.h b/include/linux/uio.h index 4ee17413fe1b..b80bbe197d13 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h | |||
@@ -20,6 +20,7 @@ struct kvec { | |||
20 | }; | 20 | }; |
21 | 21 | ||
22 | struct iov_iter { | 22 | struct iov_iter { |
23 | int type; | ||
23 | const struct iovec *iov; | 24 | const struct iovec *iov; |
24 | unsigned long nr_segs; | 25 | unsigned long nr_segs; |
25 | size_t iov_offset; | 26 | size_t iov_offset; |
@@ -68,18 +69,8 @@ size_t iov_iter_single_seg_count(const struct iov_iter *i); | |||
68 | size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, | 69 | size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, |
69 | struct iov_iter *i); | 70 | struct iov_iter *i); |
70 | unsigned long iov_iter_alignment(const struct iov_iter *i); | 71 | unsigned long iov_iter_alignment(const struct iov_iter *i); |
71 | 72 | void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov, | |
72 | static inline void iov_iter_init(struct iov_iter *i, | 73 | unsigned long nr_segs, size_t count); |
73 | const struct iovec *iov, unsigned long nr_segs, | ||
74 | size_t count, size_t written) | ||
75 | { | ||
76 | i->iov = iov; | ||
77 | i->nr_segs = nr_segs; | ||
78 | i->iov_offset = 0; | ||
79 | i->count = count + written; | ||
80 | |||
81 | iov_iter_advance(i, written); | ||
82 | } | ||
83 | 74 | ||
84 | static inline size_t iov_iter_count(struct iov_iter *i) | 75 | static inline size_t iov_iter_count(struct iov_iter *i) |
85 | { | 76 | { |
diff --git a/mm/filemap.c b/mm/filemap.c index a7f79e90209c..3aeaf2df4135 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1730,7 +1730,7 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
1730 | size_t count = iov_length(iov, nr_segs); | 1730 | size_t count = iov_length(iov, nr_segs); |
1731 | struct iov_iter i; | 1731 | struct iov_iter i; |
1732 | 1732 | ||
1733 | iov_iter_init(&i, iov, nr_segs, count, 0); | 1733 | iov_iter_init(&i, READ, iov, nr_segs, count); |
1734 | return generic_file_read_iter(iocb, &i); | 1734 | return generic_file_read_iter(iocb, &i); |
1735 | } | 1735 | } |
1736 | EXPORT_SYMBOL(generic_file_aio_read); | 1736 | EXPORT_SYMBOL(generic_file_aio_read); |
@@ -2596,7 +2596,7 @@ ssize_t __generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
2596 | if (err) | 2596 | if (err) |
2597 | goto out; | 2597 | goto out; |
2598 | 2598 | ||
2599 | iov_iter_init(&from, iov, nr_segs, count, 0); | 2599 | iov_iter_init(&from, WRITE, iov, nr_segs, count); |
2600 | 2600 | ||
2601 | /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */ | 2601 | /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */ |
2602 | if (unlikely(file->f_flags & O_DIRECT)) { | 2602 | if (unlikely(file->f_flags & O_DIRECT)) { |
diff --git a/mm/iov_iter.c b/mm/iov_iter.c index 2f762cc21080..e2c9a2db4350 100644 --- a/mm/iov_iter.c +++ b/mm/iov_iter.c | |||
@@ -220,3 +220,18 @@ unsigned long iov_iter_alignment(const struct iov_iter *i) | |||
220 | return res; | 220 | return res; |
221 | } | 221 | } |
222 | EXPORT_SYMBOL(iov_iter_alignment); | 222 | EXPORT_SYMBOL(iov_iter_alignment); |
223 | |||
224 | void iov_iter_init(struct iov_iter *i, int direction, | ||
225 | const struct iovec *iov, unsigned long nr_segs, | ||
226 | size_t count) | ||
227 | { | ||
228 | /* It will get better. Eventually... */ | ||
229 | if (segment_eq(get_fs(), KERNEL_DS)) | ||
230 | direction |= REQ_KERNEL; | ||
231 | i->type = direction; | ||
232 | i->iov = iov; | ||
233 | i->nr_segs = nr_segs; | ||
234 | i->iov_offset = 0; | ||
235 | i->count = count; | ||
236 | } | ||
237 | EXPORT_SYMBOL(iov_iter_init); | ||
diff --git a/mm/page_io.c b/mm/page_io.c index 0ed0644c73db..313bfedb75d1 100644 --- a/mm/page_io.c +++ b/mm/page_io.c | |||
@@ -268,7 +268,7 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, | |||
268 | init_sync_kiocb(&kiocb, swap_file); | 268 | init_sync_kiocb(&kiocb, swap_file); |
269 | kiocb.ki_pos = page_file_offset(page); | 269 | kiocb.ki_pos = page_file_offset(page); |
270 | kiocb.ki_nbytes = PAGE_SIZE; | 270 | kiocb.ki_nbytes = PAGE_SIZE; |
271 | iov_iter_init(&from, &iov, 1, PAGE_SIZE, 0); | 271 | iov_iter_init(&from, KERNEL_WRITE, &iov, 1, PAGE_SIZE); |
272 | 272 | ||
273 | set_page_writeback(page); | 273 | set_page_writeback(page); |
274 | unlock_page(page); | 274 | unlock_page(page); |
diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c index f32b1fbbfe69..5077afcd9e11 100644 --- a/mm/process_vm_access.c +++ b/mm/process_vm_access.c | |||
@@ -274,7 +274,7 @@ static ssize_t process_vm_rw(pid_t pid, | |||
274 | if (rc <= 0) | 274 | if (rc <= 0) |
275 | goto free_iovecs; | 275 | goto free_iovecs; |
276 | 276 | ||
277 | iov_iter_init(&iter, iov_l, liovcnt, rc, 0); | 277 | iov_iter_init(&iter, vm_write ? WRITE : READ, iov_l, liovcnt, rc); |
278 | 278 | ||
279 | rc = rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, UIO_FASTIOV, | 279 | rc = rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, UIO_FASTIOV, |
280 | iovstack_r, &iov_r); | 280 | iovstack_r, &iov_r); |
@@ -337,7 +337,7 @@ compat_process_vm_rw(compat_pid_t pid, | |||
337 | &iov_l); | 337 | &iov_l); |
338 | if (rc <= 0) | 338 | if (rc <= 0) |
339 | goto free_iovecs; | 339 | goto free_iovecs; |
340 | iov_iter_init(&iter, iov_l, liovcnt, rc, 0); | 340 | iov_iter_init(&iter, vm_write ? WRITE : READ, iov_l, liovcnt, rc); |
341 | rc = compat_rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, | 341 | rc = compat_rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, |
342 | UIO_FASTIOV, iovstack_r, | 342 | UIO_FASTIOV, iovstack_r, |
343 | &iov_r); | 343 | &iov_r); |
diff --git a/mm/shmem.c b/mm/shmem.c index 2a93e625adaf..e0b76696c3f9 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -1417,7 +1417,7 @@ static ssize_t shmem_file_aio_read(struct kiocb *iocb, | |||
1417 | loff_t *ppos = &iocb->ki_pos; | 1417 | loff_t *ppos = &iocb->ki_pos; |
1418 | struct iov_iter iter; | 1418 | struct iov_iter iter; |
1419 | 1419 | ||
1420 | iov_iter_init(&iter, iov, nr_segs, count, 0); | 1420 | iov_iter_init(&iter, READ, iov, nr_segs, count); |
1421 | 1421 | ||
1422 | /* | 1422 | /* |
1423 | * Might this read be for a stacking filesystem? Then when reading | 1423 | * Might this read be for a stacking filesystem? Then when reading |