]> Git Repo - linux.git/blobdiff - include/linux/uio.h
dt-bindings: net: dsa: make phylink bindings required for CPU/DSA ports
[linux.git] / include / linux / uio.h
index 9a2dc496d5353939299fc18c90e7f823641ee4fe..5896af36199cbe3df2185b0072d200db1b5dbc34 100644 (file)
@@ -26,6 +26,7 @@ enum iter_type {
        ITER_PIPE,
        ITER_XARRAY,
        ITER_DISCARD,
+       ITER_UBUF,
 };
 
 struct iov_iter_state {
@@ -38,7 +39,11 @@ struct iov_iter {
        u8 iter_type;
        bool nofault;
        bool data_source;
-       size_t iov_offset;
+       bool user_backed;
+       union {
+               size_t iov_offset;
+               int last_offset;
+       };
        size_t count;
        union {
                const struct iovec *iov;
@@ -46,6 +51,7 @@ struct iov_iter {
                const struct bio_vec *bvec;
                struct xarray *xarray;
                struct pipe_inode_info *pipe;
+               void __user *ubuf;
        };
        union {
                unsigned long nr_segs;
@@ -70,6 +76,11 @@ static inline void iov_iter_save_state(struct iov_iter *iter,
        state->nr_segs = iter->nr_segs;
 }
 
+static inline bool iter_is_ubuf(const struct iov_iter *i)
+{
+       return iov_iter_type(i) == ITER_UBUF;
+}
+
 static inline bool iter_is_iovec(const struct iov_iter *i)
 {
        return iov_iter_type(i) == ITER_IOVEC;
@@ -105,6 +116,11 @@ static inline unsigned char iov_iter_rw(const struct iov_iter *i)
        return i->data_source ? WRITE : READ;
 }
 
+static inline bool user_backed_iter(const struct iov_iter *i)
+{
+       return i->user_backed;
+}
+
 /*
  * Total number of bytes covered by an iovec.
  *
@@ -231,9 +247,9 @@ void iov_iter_pipe(struct iov_iter *i, unsigned int direction, struct pipe_inode
 void iov_iter_discard(struct iov_iter *i, unsigned int direction, size_t count);
 void iov_iter_xarray(struct iov_iter *i, unsigned int direction, struct xarray *xarray,
                     loff_t start, size_t count);
-ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages,
+ssize_t iov_iter_get_pages2(struct iov_iter *i, struct page **pages,
                        size_t maxsize, unsigned maxpages, size_t *start);
-ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages,
+ssize_t iov_iter_get_pages_alloc2(struct iov_iter *i, struct page ***pages,
                        size_t maxsize, size_t *start);
 int iov_iter_npages(const struct iov_iter *i, int maxpages);
 void iov_iter_restore(struct iov_iter *i, struct iov_iter_state *state);
@@ -322,4 +338,17 @@ ssize_t __import_iovec(int type, const struct iovec __user *uvec,
 int import_single_range(int type, void __user *buf, size_t len,
                 struct iovec *iov, struct iov_iter *i);
 
+static inline void iov_iter_ubuf(struct iov_iter *i, unsigned int direction,
+                       void __user *buf, size_t count)
+{
+       WARN_ON(direction & ~(READ | WRITE));
+       *i = (struct iov_iter) {
+               .iter_type = ITER_UBUF,
+               .user_backed = true,
+               .data_source = direction,
+               .ubuf = buf,
+               .count = count
+       };
+}
+
 #endif
This page took 0.039105 seconds and 4 git commands to generate.