diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/blk_types.h | 4 | ||||
-rw-r--r-- | include/linux/ceph/libceph.h | 2 | ||||
-rw-r--r-- | include/linux/fs.h | 41 | ||||
-rw-r--r-- | include/linux/nfs_fs.h | 7 | ||||
-rw-r--r-- | include/linux/splice.h | 10 | ||||
-rw-r--r-- | include/linux/uio.h | 51 |
6 files changed, 65 insertions, 50 deletions
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index d8e4cea23a25..66c2167f04a9 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h | |||
@@ -5,8 +5,6 @@ | |||
5 | #ifndef __LINUX_BLK_TYPES_H | 5 | #ifndef __LINUX_BLK_TYPES_H |
6 | #define __LINUX_BLK_TYPES_H | 6 | #define __LINUX_BLK_TYPES_H |
7 | 7 | ||
8 | #ifdef CONFIG_BLOCK | ||
9 | |||
10 | #include <linux/types.h> | 8 | #include <linux/types.h> |
11 | 9 | ||
12 | struct bio_set; | 10 | struct bio_set; |
@@ -28,6 +26,8 @@ struct bio_vec { | |||
28 | unsigned int bv_offset; | 26 | unsigned int bv_offset; |
29 | }; | 27 | }; |
30 | 28 | ||
29 | #ifdef CONFIG_BLOCK | ||
30 | |||
31 | struct bvec_iter { | 31 | struct bvec_iter { |
32 | sector_t bi_sector; /* device address in 512 byte | 32 | sector_t bi_sector; /* device address in 512 byte |
33 | sectors */ | 33 | sectors */ |
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h index 2f49aa4c4f7f..279b0afac1c1 100644 --- a/include/linux/ceph/libceph.h +++ b/include/linux/ceph/libceph.h | |||
@@ -222,8 +222,6 @@ extern void ceph_copy_to_page_vector(struct page **pages, | |||
222 | extern void ceph_copy_from_page_vector(struct page **pages, | 222 | extern void ceph_copy_from_page_vector(struct page **pages, |
223 | void *data, | 223 | void *data, |
224 | loff_t off, size_t len); | 224 | loff_t off, size_t len); |
225 | extern int ceph_copy_page_vector_to_user(struct page **pages, void __user *data, | ||
226 | loff_t off, size_t len); | ||
227 | extern void ceph_zero_page_vector_range(int off, int len, struct page **pages); | 225 | extern void ceph_zero_page_vector_range(int off, int len, struct page **pages); |
228 | 226 | ||
229 | 227 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index c3f46e499dd0..338e6f758c6d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -128,6 +128,10 @@ typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | |||
128 | #define FMODE_ATOMIC_POS ((__force fmode_t)0x8000) | 128 | #define FMODE_ATOMIC_POS ((__force fmode_t)0x8000) |
129 | /* Write access to underlying fs */ | 129 | /* Write access to underlying fs */ |
130 | #define FMODE_WRITER ((__force fmode_t)0x10000) | 130 | #define FMODE_WRITER ((__force fmode_t)0x10000) |
131 | /* Has read method(s) */ | ||
132 | #define FMODE_CAN_READ ((__force fmode_t)0x20000) | ||
133 | /* Has write method(s) */ | ||
134 | #define FMODE_CAN_WRITE ((__force fmode_t)0x40000) | ||
131 | 135 | ||
132 | /* File was opened by fanotify and shouldn't generate fanotify events */ | 136 | /* File was opened by fanotify and shouldn't generate fanotify events */ |
133 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) | 137 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) |
@@ -343,8 +347,7 @@ struct address_space_operations { | |||
343 | void (*invalidatepage) (struct page *, unsigned int, unsigned int); | 347 | void (*invalidatepage) (struct page *, unsigned int, unsigned int); |
344 | int (*releasepage) (struct page *, gfp_t); | 348 | int (*releasepage) (struct page *, gfp_t); |
345 | void (*freepage)(struct page *); | 349 | void (*freepage)(struct page *); |
346 | ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov, | 350 | ssize_t (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, loff_t offset); |
347 | loff_t offset, unsigned long nr_segs); | ||
348 | int (*get_xip_mem)(struct address_space *, pgoff_t, int, | 351 | int (*get_xip_mem)(struct address_space *, pgoff_t, int, |
349 | void **, unsigned long *); | 352 | void **, unsigned long *); |
350 | /* | 353 | /* |
@@ -1448,6 +1451,8 @@ struct block_device_operations; | |||
1448 | #define HAVE_COMPAT_IOCTL 1 | 1451 | #define HAVE_COMPAT_IOCTL 1 |
1449 | #define HAVE_UNLOCKED_IOCTL 1 | 1452 | #define HAVE_UNLOCKED_IOCTL 1 |
1450 | 1453 | ||
1454 | struct iov_iter; | ||
1455 | |||
1451 | struct file_operations { | 1456 | struct file_operations { |
1452 | struct module *owner; | 1457 | struct module *owner; |
1453 | loff_t (*llseek) (struct file *, loff_t, int); | 1458 | loff_t (*llseek) (struct file *, loff_t, int); |
@@ -1455,6 +1460,8 @@ struct file_operations { | |||
1455 | ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); | 1460 | ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); |
1456 | ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); | 1461 | ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); |
1457 | ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); | 1462 | ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); |
1463 | ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); | ||
1464 | ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); | ||
1458 | int (*iterate) (struct file *, struct dir_context *); | 1465 | int (*iterate) (struct file *, struct dir_context *); |
1459 | unsigned int (*poll) (struct file *, struct poll_table_struct *); | 1466 | unsigned int (*poll) (struct file *, struct poll_table_struct *); |
1460 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 1467 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
@@ -2404,20 +2411,18 @@ extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); | |||
2404 | extern int generic_file_remap_pages(struct vm_area_struct *, unsigned long addr, | 2411 | extern int generic_file_remap_pages(struct vm_area_struct *, unsigned long addr, |
2405 | unsigned long size, pgoff_t pgoff); | 2412 | unsigned long size, pgoff_t pgoff); |
2406 | int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); | 2413 | int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk); |
2407 | extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t); | 2414 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); |
2408 | extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long); | 2415 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); |
2409 | extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, loff_t); | 2416 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); |
2410 | extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *, | 2417 | extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *, loff_t); |
2411 | unsigned long *, loff_t, size_t, size_t); | ||
2412 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); | 2418 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); |
2413 | extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); | 2419 | extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); |
2414 | extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); | 2420 | extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); |
2415 | extern int generic_segment_checks(const struct iovec *iov, | 2421 | extern ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); |
2416 | unsigned long *nr_segs, size_t *count, int access_flags); | 2422 | extern ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); |
2417 | 2423 | ||
2418 | /* fs/block_dev.c */ | 2424 | /* fs/block_dev.c */ |
2419 | extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, | 2425 | extern ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from); |
2420 | unsigned long nr_segs, loff_t pos); | ||
2421 | extern int blkdev_fsync(struct file *filp, loff_t start, loff_t end, | 2426 | extern int blkdev_fsync(struct file *filp, loff_t start, loff_t end, |
2422 | int datasync); | 2427 | int datasync); |
2423 | extern void block_sync_page(struct page *page); | 2428 | extern void block_sync_page(struct page *page); |
@@ -2427,7 +2432,7 @@ extern ssize_t generic_file_splice_read(struct file *, loff_t *, | |||
2427 | struct pipe_inode_info *, size_t, unsigned int); | 2432 | struct pipe_inode_info *, size_t, unsigned int); |
2428 | extern ssize_t default_file_splice_read(struct file *, loff_t *, | 2433 | extern ssize_t default_file_splice_read(struct file *, loff_t *, |
2429 | struct pipe_inode_info *, size_t, unsigned int); | 2434 | struct pipe_inode_info *, size_t, unsigned int); |
2430 | extern ssize_t generic_file_splice_write(struct pipe_inode_info *, | 2435 | extern ssize_t iter_file_splice_write(struct pipe_inode_info *, |
2431 | struct file *, loff_t *, size_t, unsigned int); | 2436 | struct file *, loff_t *, size_t, unsigned int); |
2432 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, | 2437 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, |
2433 | struct file *out, loff_t *, size_t len, unsigned int flags); | 2438 | struct file *out, loff_t *, size_t len, unsigned int flags); |
@@ -2477,16 +2482,16 @@ enum { | |||
2477 | void dio_end_io(struct bio *bio, int error); | 2482 | void dio_end_io(struct bio *bio, int error); |
2478 | 2483 | ||
2479 | ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | 2484 | ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, |
2480 | struct block_device *bdev, const struct iovec *iov, loff_t offset, | 2485 | struct block_device *bdev, struct iov_iter *iter, loff_t offset, |
2481 | unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, | 2486 | get_block_t get_block, dio_iodone_t end_io, |
2482 | dio_submit_t submit_io, int flags); | 2487 | dio_submit_t submit_io, int flags); |
2483 | 2488 | ||
2484 | static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, | 2489 | static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, |
2485 | struct inode *inode, const struct iovec *iov, loff_t offset, | 2490 | struct inode *inode, struct iov_iter *iter, loff_t offset, |
2486 | unsigned long nr_segs, get_block_t get_block) | 2491 | get_block_t get_block) |
2487 | { | 2492 | { |
2488 | return __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, | 2493 | return __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iter, |
2489 | offset, nr_segs, get_block, NULL, NULL, | 2494 | offset, get_block, NULL, NULL, |
2490 | DIO_LOCKING | DIO_SKIP_HOLES); | 2495 | DIO_LOCKING | DIO_SKIP_HOLES); |
2491 | } | 2496 | } |
2492 | #endif | 2497 | #endif |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 919576b8e2cf..e30f6059ecd6 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -459,13 +459,12 @@ extern int nfs3_removexattr (struct dentry *, const char *name); | |||
459 | /* | 459 | /* |
460 | * linux/fs/nfs/direct.c | 460 | * linux/fs/nfs/direct.c |
461 | */ | 461 | */ |
462 | extern ssize_t nfs_direct_IO(int, struct kiocb *, const struct iovec *, loff_t, | 462 | extern ssize_t nfs_direct_IO(int, struct kiocb *, struct iov_iter *, loff_t); |
463 | unsigned long); | ||
464 | extern ssize_t nfs_file_direct_read(struct kiocb *iocb, | 463 | extern ssize_t nfs_file_direct_read(struct kiocb *iocb, |
465 | const struct iovec *iov, unsigned long nr_segs, | 464 | struct iov_iter *iter, |
466 | loff_t pos, bool uio); | 465 | loff_t pos, bool uio); |
467 | extern ssize_t nfs_file_direct_write(struct kiocb *iocb, | 466 | extern ssize_t nfs_file_direct_write(struct kiocb *iocb, |
468 | const struct iovec *iov, unsigned long nr_segs, | 467 | struct iov_iter *iter, |
469 | loff_t pos, bool uio); | 468 | loff_t pos, bool uio); |
470 | 469 | ||
471 | /* | 470 | /* |
diff --git a/include/linux/splice.h b/include/linux/splice.h index 0e43906d2fda..da2751d3b93d 100644 --- a/include/linux/splice.h +++ b/include/linux/splice.h | |||
@@ -70,16 +70,6 @@ extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *, | |||
70 | splice_actor *); | 70 | splice_actor *); |
71 | extern ssize_t __splice_from_pipe(struct pipe_inode_info *, | 71 | extern ssize_t __splice_from_pipe(struct pipe_inode_info *, |
72 | struct splice_desc *, splice_actor *); | 72 | struct splice_desc *, splice_actor *); |
73 | extern int splice_from_pipe_feed(struct pipe_inode_info *, struct splice_desc *, | ||
74 | splice_actor *); | ||
75 | extern int splice_from_pipe_next(struct pipe_inode_info *, | ||
76 | struct splice_desc *); | ||
77 | extern void splice_from_pipe_begin(struct splice_desc *); | ||
78 | extern void splice_from_pipe_end(struct pipe_inode_info *, | ||
79 | struct splice_desc *); | ||
80 | extern int pipe_to_file(struct pipe_inode_info *, struct pipe_buffer *, | ||
81 | struct splice_desc *); | ||
82 | |||
83 | extern ssize_t splice_to_pipe(struct pipe_inode_info *, | 73 | extern ssize_t splice_to_pipe(struct pipe_inode_info *, |
84 | struct splice_pipe_desc *); | 74 | struct splice_pipe_desc *); |
85 | extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *, | 75 | extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *, |
diff --git a/include/linux/uio.h b/include/linux/uio.h index 199bcc34241b..e2231e47cec1 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h | |||
@@ -19,11 +19,21 @@ struct kvec { | |||
19 | size_t iov_len; | 19 | size_t iov_len; |
20 | }; | 20 | }; |
21 | 21 | ||
22 | enum { | ||
23 | ITER_IOVEC = 0, | ||
24 | ITER_KVEC = 2, | ||
25 | ITER_BVEC = 4, | ||
26 | }; | ||
27 | |||
22 | struct iov_iter { | 28 | struct iov_iter { |
23 | const struct iovec *iov; | 29 | int type; |
24 | unsigned long nr_segs; | ||
25 | size_t iov_offset; | 30 | size_t iov_offset; |
26 | size_t count; | 31 | size_t count; |
32 | union { | ||
33 | const struct iovec *iov; | ||
34 | const struct bio_vec *bvec; | ||
35 | }; | ||
36 | unsigned long nr_segs; | ||
27 | }; | 37 | }; |
28 | 38 | ||
29 | /* | 39 | /* |
@@ -53,6 +63,7 @@ static inline struct iovec iov_iter_iovec(const struct iov_iter *iter) | |||
53 | } | 63 | } |
54 | 64 | ||
55 | #define iov_for_each(iov, iter, start) \ | 65 | #define iov_for_each(iov, iter, start) \ |
66 | if (!((start).type & ITER_BVEC)) \ | ||
56 | for (iter = (start); \ | 67 | for (iter = (start); \ |
57 | (iter).count && \ | 68 | (iter).count && \ |
58 | ((iov = iov_iter_iovec(&(iter))), 1); \ | 69 | ((iov = iov_iter_iovec(&(iter))), 1); \ |
@@ -62,32 +73,44 @@ unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); | |||
62 | 73 | ||
63 | size_t iov_iter_copy_from_user_atomic(struct page *page, | 74 | size_t iov_iter_copy_from_user_atomic(struct page *page, |
64 | struct iov_iter *i, unsigned long offset, size_t bytes); | 75 | struct iov_iter *i, unsigned long offset, size_t bytes); |
65 | size_t iov_iter_copy_from_user(struct page *page, | ||
66 | struct iov_iter *i, unsigned long offset, size_t bytes); | ||
67 | void iov_iter_advance(struct iov_iter *i, size_t bytes); | 76 | void iov_iter_advance(struct iov_iter *i, size_t bytes); |
68 | int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); | 77 | int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); |
69 | size_t iov_iter_single_seg_count(const struct iov_iter *i); | 78 | size_t iov_iter_single_seg_count(const struct iov_iter *i); |
70 | size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, | 79 | size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, |
71 | struct iov_iter *i); | 80 | struct iov_iter *i); |
81 | size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes, | ||
82 | struct iov_iter *i); | ||
83 | unsigned long iov_iter_alignment(const struct iov_iter *i); | ||
84 | void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov, | ||
85 | unsigned long nr_segs, size_t count); | ||
86 | ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages, | ||
87 | size_t maxsize, size_t *start); | ||
88 | ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages, | ||
89 | size_t maxsize, size_t *start); | ||
90 | int iov_iter_npages(const struct iov_iter *i, int maxpages); | ||
72 | 91 | ||
73 | static inline void iov_iter_init(struct iov_iter *i, | 92 | static inline size_t iov_iter_count(struct iov_iter *i) |
74 | const struct iovec *iov, unsigned long nr_segs, | ||
75 | size_t count, size_t written) | ||
76 | { | 93 | { |
77 | i->iov = iov; | 94 | return i->count; |
78 | i->nr_segs = nr_segs; | 95 | } |
79 | i->iov_offset = 0; | ||
80 | i->count = count + written; | ||
81 | 96 | ||
82 | iov_iter_advance(i, written); | 97 | static inline void iov_iter_truncate(struct iov_iter *i, size_t count) |
98 | { | ||
99 | if (i->count > count) | ||
100 | i->count = count; | ||
83 | } | 101 | } |
84 | 102 | ||
85 | static inline size_t iov_iter_count(struct iov_iter *i) | 103 | /* |
104 | * reexpand a previously truncated iterator; count must be no more than how much | ||
105 | * we had shrunk it. | ||
106 | */ | ||
107 | static inline void iov_iter_reexpand(struct iov_iter *i, size_t count) | ||
86 | { | 108 | { |
87 | return i->count; | 109 | i->count = count; |
88 | } | 110 | } |
89 | 111 | ||
90 | int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); | 112 | int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); |
91 | int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); | 113 | int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); |
92 | 114 | ||
115 | |||
93 | #endif | 116 | #endif |