~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/uio.h

Version: ~ [ linux-5.15-rc1 ] ~ [ linux-5.14.5 ] ~ [ linux-5.13.18 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.66 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.147 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.206 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.246 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.282 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.283 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *      Berkeley style UIO structures   -       Alan Cox 1994.
  3  *
  4  *              This program is free software; you can redistribute it and/or
  5  *              modify it under the terms of the GNU General Public License
  6  *              as published by the Free Software Foundation; either version
  7  *              2 of the License, or (at your option) any later version.
  8  */
  9 #ifndef __LINUX_UIO_H
 10 #define __LINUX_UIO_H
 11 
 12 #include <linux/kernel.h>
 13 #include <uapi/linux/uio.h>
 14 
 15 struct page;
 16 
 17 struct kvec {
 18         void *iov_base; /* and that should *never* hold a userland pointer */
 19         size_t iov_len;
 20 };
 21 
 22 enum {
 23         ITER_IOVEC = 0,
 24         ITER_KVEC = 2,
 25         ITER_BVEC = 4,
 26 };
 27 
 28 struct iov_iter {
 29         int type;
 30         size_t iov_offset;
 31         size_t count;
 32         union {
 33                 const struct iovec *iov;
 34                 const struct kvec *kvec;
 35                 const struct bio_vec *bvec;
 36         };
 37         unsigned long nr_segs;
 38 };
 39 
 40 /*
 41  * Total number of bytes covered by an iovec.
 42  *
 43  * NOTE that it is not safe to use this function until all the iovec's
 44  * segment lengths have been validated.  Because the individual lengths can
 45  * overflow a size_t when added together.
 46  */
 47 static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs)
 48 {
 49         unsigned long seg;
 50         size_t ret = 0;
 51 
 52         for (seg = 0; seg < nr_segs; seg++)
 53                 ret += iov[seg].iov_len;
 54         return ret;
 55 }
 56 
 57 static inline struct iovec iov_iter_iovec(const struct iov_iter *iter)
 58 {
 59         return (struct iovec) {
 60                 .iov_base = iter->iov->iov_base + iter->iov_offset,
 61                 .iov_len = min(iter->count,
 62                                iter->iov->iov_len - iter->iov_offset),
 63         };
 64 }
 65 
 66 #define iov_for_each(iov, iter, start)                          \
 67         if (!((start).type & ITER_BVEC))                        \
 68         for (iter = (start);                                    \
 69              (iter).count &&                                    \
 70              ((iov = iov_iter_iovec(&(iter))), 1);              \
 71              iov_iter_advance(&(iter), (iov).iov_len))
 72 
 73 unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to);
 74 
 75 size_t iov_iter_copy_from_user_atomic(struct page *page,
 76                 struct iov_iter *i, unsigned long offset, size_t bytes);
 77 void iov_iter_advance(struct iov_iter *i, size_t bytes);
 78 int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
 79 int iov_iter_fault_in_multipages_readable(struct iov_iter *i, size_t bytes);
 80 size_t iov_iter_single_seg_count(const struct iov_iter *i);
 81 size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
 82                          struct iov_iter *i);
 83 size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
 84                          struct iov_iter *i);
 85 size_t copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i);
 86 size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i);
 87 size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i);
 88 size_t iov_iter_zero(size_t bytes, struct iov_iter *);
 89 unsigned long iov_iter_alignment(const struct iov_iter *i);
 90 unsigned long iov_iter_gap_alignment(const struct iov_iter *i);
 91 void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov,
 92                         unsigned long nr_segs, size_t count);
 93 void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *kvec,
 94                         unsigned long nr_segs, size_t count);
 95 void iov_iter_bvec(struct iov_iter *i, int direction, const struct bio_vec *bvec,
 96                         unsigned long nr_segs, size_t count);
 97 ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages,
 98                         size_t maxsize, unsigned maxpages, size_t *start);
 99 ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages,
100                         size_t maxsize, size_t *start);
101 int iov_iter_npages(const struct iov_iter *i, int maxpages);
102 
103 const void *dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags);
104 
105 static inline size_t iov_iter_count(struct iov_iter *i)
106 {
107         return i->count;
108 }
109 
110 static inline bool iter_is_iovec(struct iov_iter *i)
111 {
112         return !(i->type & (ITER_BVEC | ITER_KVEC));
113 }
114 
115 /*
116  * Get one of READ or WRITE out of iter->type without any other flags OR'd in
117  * with it.
118  *
119  * The ?: is just for type safety.
120  */
121 #define iov_iter_rw(i) ((0 ? (struct iov_iter *)0 : (i))->type & RW_MASK)
122 
123 /*
124  * Cap the iov_iter by given limit; note that the second argument is
125  * *not* the new size - it's upper limit for such.  Passing it a value
126  * greater than the amount of data in iov_iter is fine - it'll just do
127  * nothing in that case.
128  */
129 static inline void iov_iter_truncate(struct iov_iter *i, u64 count)
130 {
131         /*
132          * count doesn't have to fit in size_t - comparison extends both
133          * operands to u64 here and any value that would be truncated by
134          * conversion in assignement is by definition greater than all
135          * values of size_t, including old i->count.
136          */
137         if (i->count > count)
138                 i->count = count;
139 }
140 
141 /*
142  * reexpand a previously truncated iterator; count must be no more than how much
143  * we had shrunk it.
144  */
145 static inline void iov_iter_reexpand(struct iov_iter *i, size_t count)
146 {
147         i->count = count;
148 }
149 size_t csum_and_copy_to_iter(const void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
150 size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
151 
152 int import_iovec(int type, const struct iovec __user * uvector,
153                  unsigned nr_segs, unsigned fast_segs,
154                  struct iovec **iov, struct iov_iter *i);
155 
156 #ifdef CONFIG_COMPAT
157 struct compat_iovec;
158 int compat_import_iovec(int type, const struct compat_iovec __user * uvector,
159                  unsigned nr_segs, unsigned fast_segs,
160                  struct iovec **iov, struct iov_iter *i);
161 #endif
162 
163 int import_single_range(int type, void __user *buf, size_t len,
164                  struct iovec *iov, struct iov_iter *i);
165 
166 #endif
167 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp