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