Loading include/linux/fs.h +0 −32 Original line number Original line Diff line number Diff line Loading @@ -295,38 +295,6 @@ struct page; struct address_space; struct address_space; struct writeback_control; struct writeback_control; struct iov_iter { const struct iovec *iov; unsigned long nr_segs; size_t iov_offset; size_t count; }; size_t iov_iter_copy_from_user_atomic(struct page *page, struct iov_iter *i, unsigned long offset, size_t bytes); size_t iov_iter_copy_from_user(struct page *page, struct iov_iter *i, unsigned long offset, size_t bytes); void iov_iter_advance(struct iov_iter *i, size_t bytes); int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); size_t iov_iter_single_seg_count(const struct iov_iter *i); static inline void iov_iter_init(struct iov_iter *i, const struct iovec *iov, unsigned long nr_segs, size_t count, size_t written) { i->iov = iov; i->nr_segs = nr_segs; i->iov_offset = 0; i->count = count + written; iov_iter_advance(i, written); } static inline size_t iov_iter_count(struct iov_iter *i) { return i->count; } /* /* * "descriptor" for what we're up to with a read. * "descriptor" for what we're up to with a read. * This allows us to use the same read code yet * This allows us to use the same read code yet Loading include/linux/uio.h +50 −0 Original line number Original line Diff line number Diff line Loading @@ -9,14 +9,23 @@ #ifndef __LINUX_UIO_H #ifndef __LINUX_UIO_H #define __LINUX_UIO_H #define __LINUX_UIO_H #include <linux/kernel.h> #include <uapi/linux/uio.h> #include <uapi/linux/uio.h> struct page; struct kvec { struct kvec { void *iov_base; /* and that should *never* hold a userland pointer */ void *iov_base; /* and that should *never* hold a userland pointer */ size_t iov_len; size_t iov_len; }; }; struct iov_iter { const struct iovec *iov; unsigned long nr_segs; size_t iov_offset; size_t count; }; /* /* * Total number of bytes covered by an iovec. * Total number of bytes covered by an iovec. * * Loading @@ -34,8 +43,49 @@ static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs) return ret; return ret; } } static inline struct iovec iov_iter_iovec(const struct iov_iter *iter) { return (struct iovec) { .iov_base = iter->iov->iov_base + iter->iov_offset, .iov_len = min(iter->count, iter->iov->iov_len - iter->iov_offset), }; } #define iov_for_each(iov, iter, start) \ for (iter = (start); \ (iter).count && \ ((iov = iov_iter_iovec(&(iter))), 1); \ iov_iter_advance(&(iter), (iov).iov_len)) unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); size_t iov_iter_copy_from_user_atomic(struct page *page, struct iov_iter *i, unsigned long offset, size_t bytes); size_t iov_iter_copy_from_user(struct page *page, struct iov_iter *i, unsigned long offset, size_t bytes); void iov_iter_advance(struct iov_iter *i, size_t bytes); int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); size_t iov_iter_single_seg_count(const struct iov_iter *i); static inline void iov_iter_init(struct iov_iter *i, const struct iovec *iov, unsigned long nr_segs, size_t count, size_t written) { i->iov = iov; i->nr_segs = nr_segs; i->iov_offset = 0; i->count = count + written; iov_iter_advance(i, written); } static inline size_t iov_iter_count(struct iov_iter *i) { return i->count; } int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); #endif #endif Loading
include/linux/fs.h +0 −32 Original line number Original line Diff line number Diff line Loading @@ -295,38 +295,6 @@ struct page; struct address_space; struct address_space; struct writeback_control; struct writeback_control; struct iov_iter { const struct iovec *iov; unsigned long nr_segs; size_t iov_offset; size_t count; }; size_t iov_iter_copy_from_user_atomic(struct page *page, struct iov_iter *i, unsigned long offset, size_t bytes); size_t iov_iter_copy_from_user(struct page *page, struct iov_iter *i, unsigned long offset, size_t bytes); void iov_iter_advance(struct iov_iter *i, size_t bytes); int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); size_t iov_iter_single_seg_count(const struct iov_iter *i); static inline void iov_iter_init(struct iov_iter *i, const struct iovec *iov, unsigned long nr_segs, size_t count, size_t written) { i->iov = iov; i->nr_segs = nr_segs; i->iov_offset = 0; i->count = count + written; iov_iter_advance(i, written); } static inline size_t iov_iter_count(struct iov_iter *i) { return i->count; } /* /* * "descriptor" for what we're up to with a read. * "descriptor" for what we're up to with a read. * This allows us to use the same read code yet * This allows us to use the same read code yet Loading
include/linux/uio.h +50 −0 Original line number Original line Diff line number Diff line Loading @@ -9,14 +9,23 @@ #ifndef __LINUX_UIO_H #ifndef __LINUX_UIO_H #define __LINUX_UIO_H #define __LINUX_UIO_H #include <linux/kernel.h> #include <uapi/linux/uio.h> #include <uapi/linux/uio.h> struct page; struct kvec { struct kvec { void *iov_base; /* and that should *never* hold a userland pointer */ void *iov_base; /* and that should *never* hold a userland pointer */ size_t iov_len; size_t iov_len; }; }; struct iov_iter { const struct iovec *iov; unsigned long nr_segs; size_t iov_offset; size_t count; }; /* /* * Total number of bytes covered by an iovec. * Total number of bytes covered by an iovec. * * Loading @@ -34,8 +43,49 @@ static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs) return ret; return ret; } } static inline struct iovec iov_iter_iovec(const struct iov_iter *iter) { return (struct iovec) { .iov_base = iter->iov->iov_base + iter->iov_offset, .iov_len = min(iter->count, iter->iov->iov_len - iter->iov_offset), }; } #define iov_for_each(iov, iter, start) \ for (iter = (start); \ (iter).count && \ ((iov = iov_iter_iovec(&(iter))), 1); \ iov_iter_advance(&(iter), (iov).iov_len)) unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); size_t iov_iter_copy_from_user_atomic(struct page *page, struct iov_iter *i, unsigned long offset, size_t bytes); size_t iov_iter_copy_from_user(struct page *page, struct iov_iter *i, unsigned long offset, size_t bytes); void iov_iter_advance(struct iov_iter *i, size_t bytes); int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); size_t iov_iter_single_seg_count(const struct iov_iter *i); static inline void iov_iter_init(struct iov_iter *i, const struct iovec *iov, unsigned long nr_segs, size_t count, size_t written) { i->iov = iov; i->nr_segs = nr_segs; i->iov_offset = 0; i->count = count + written; iov_iter_advance(i, written); } static inline size_t iov_iter_count(struct iov_iter *i) { return i->count; } int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); #endif #endif