LCOV - code coverage report
Current view: top level - include/linux - uio.h (source / functions) Hit Total Coverage
Test: btrfstest.info Lines: 1 2 50.0 %
Date: 2014-11-28 Functions: 0 0 -

          Line data    Source code
       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 bio_vec *bvec;
      35             :         };
      36             :         unsigned long nr_segs;
      37             : };
      38             : 
      39             : /*
      40             :  * Total number of bytes covered by an iovec.
      41             :  *
      42             :  * NOTE that it is not safe to use this function until all the iovec's
      43             :  * segment lengths have been validated.  Because the individual lengths can
      44             :  * overflow a size_t when added together.
      45             :  */
      46             : static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs)
      47             : {
      48             :         unsigned long seg;
      49             :         size_t ret = 0;
      50             : 
      51             :         for (seg = 0; seg < nr_segs; seg++)
      52             :                 ret += iov[seg].iov_len;
      53             :         return ret;
      54             : }
      55             : 
      56             : static inline struct iovec iov_iter_iovec(const struct iov_iter *iter)
      57             : {
      58             :         return (struct iovec) {
      59             :                 .iov_base = iter->iov->iov_base + iter->iov_offset,
      60             :                 .iov_len = min(iter->count,
      61             :                                iter->iov->iov_len - iter->iov_offset),
      62             :         };
      63             : }
      64             : 
      65             : #define iov_for_each(iov, iter, start)                          \
      66             :         if (!((start).type & ITER_BVEC))                    \
      67             :         for (iter = (start);                                    \
      68             :              (iter).count &&                                    \
      69             :              ((iov = iov_iter_iovec(&(iter))), 1);          \
      70             :              iov_iter_advance(&(iter), (iov).iov_len))
      71             : 
      72             : unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to);
      73             : 
      74             : size_t iov_iter_copy_from_user_atomic(struct page *page,
      75             :                 struct iov_iter *i, unsigned long offset, size_t bytes);
      76             : void iov_iter_advance(struct iov_iter *i, size_t bytes);
      77             : int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
      78             : size_t iov_iter_single_seg_count(const struct iov_iter *i);
      79             : size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
      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, unsigned maxpages, 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);
      91             : 
      92             : static inline size_t iov_iter_count(struct iov_iter *i)
      93             : {
      94             :         return i->count;
      95             : }
      96             : 
      97             : /*
      98             :  * Cap the iov_iter by given limit; note that the second argument is
      99             :  * *not* the new size - it's upper limit for such.  Passing it a value
     100             :  * greater than the amount of data in iov_iter is fine - it'll just do
     101             :  * nothing in that case.
     102             :  */
     103             : static inline void iov_iter_truncate(struct iov_iter *i, u64 count)
     104             : {
     105             :         /*
     106             :          * count doesn't have to fit in size_t - comparison extends both
     107             :          * operands to u64 here and any value that would be truncated by
     108             :          * conversion in assignement is by definition greater than all
     109             :          * values of size_t, including old i->count.
     110             :          */
     111      139356 :         if (i->count > count)
     112           0 :                 i->count = count;
     113             : }
     114             : 
     115             : /*
     116             :  * reexpand a previously truncated iterator; count must be no more than how much
     117             :  * we had shrunk it.
     118             :  */
     119             : static inline void iov_iter_reexpand(struct iov_iter *i, size_t count)
     120             : {
     121             :         i->count = count;
     122             : }
     123             : 
     124             : int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len);
     125             : int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len);
     126             : int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov,
     127             :                         int offset, int len);
     128             : int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata,
     129             :                       int offset, int len);
     130             : 
     131             : #endif

Generated by: LCOV version 1.10