Changeset View
Changeset View
Standalone View
Standalone View
sys/contrib/openzfs/include/os/linux/spl/sys/uio.h
Show All 30 Lines | |||||
#include <linux/blkdev_compat.h> | #include <linux/blkdev_compat.h> | ||||
#include <linux/mm.h> | #include <linux/mm.h> | ||||
#include <linux/bio.h> | #include <linux/bio.h> | ||||
#include <asm/uaccess.h> | #include <asm/uaccess.h> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
typedef struct iovec iovec_t; | typedef struct iovec iovec_t; | ||||
typedef enum uio_rw { | typedef enum zfs_uio_rw { | ||||
UIO_READ = 0, | UIO_READ = 0, | ||||
UIO_WRITE = 1, | UIO_WRITE = 1, | ||||
} uio_rw_t; | } zfs_uio_rw_t; | ||||
typedef enum uio_seg { | typedef enum zfs_uio_seg { | ||||
UIO_USERSPACE = 0, | UIO_USERSPACE = 0, | ||||
UIO_SYSSPACE = 1, | UIO_SYSSPACE = 1, | ||||
UIO_BVEC = 2, | UIO_BVEC = 2, | ||||
#if defined(HAVE_VFS_IOV_ITER) | #if defined(HAVE_VFS_IOV_ITER) | ||||
UIO_ITER = 3, | UIO_ITER = 3, | ||||
#endif | #endif | ||||
} uio_seg_t; | } zfs_uio_seg_t; | ||||
typedef struct uio { | typedef struct zfs_uio { | ||||
union { | union { | ||||
const struct iovec *uio_iov; | const struct iovec *uio_iov; | ||||
const struct bio_vec *uio_bvec; | const struct bio_vec *uio_bvec; | ||||
#if defined(HAVE_VFS_IOV_ITER) | #if defined(HAVE_VFS_IOV_ITER) | ||||
struct iov_iter *uio_iter; | struct iov_iter *uio_iter; | ||||
#endif | #endif | ||||
}; | }; | ||||
int uio_iovcnt; | int uio_iovcnt; | ||||
offset_t uio_loffset; | offset_t uio_loffset; | ||||
uio_seg_t uio_segflg; | zfs_uio_seg_t uio_segflg; | ||||
boolean_t uio_fault_disable; | boolean_t uio_fault_disable; | ||||
uint16_t uio_fmode; | uint16_t uio_fmode; | ||||
uint16_t uio_extflg; | uint16_t uio_extflg; | ||||
ssize_t uio_resid; | ssize_t uio_resid; | ||||
size_t uio_skip; | size_t uio_skip; | ||||
} uio_t; | } zfs_uio_t; | ||||
#define uio_segflg(uio) (uio)->uio_segflg | #define zfs_uio_segflg(u) (u)->uio_segflg | ||||
#define uio_offset(uio) (uio)->uio_loffset | #define zfs_uio_offset(u) (u)->uio_loffset | ||||
#define uio_resid(uio) (uio)->uio_resid | #define zfs_uio_resid(u) (u)->uio_resid | ||||
#define uio_iovcnt(uio) (uio)->uio_iovcnt | #define zfs_uio_iovcnt(u) (u)->uio_iovcnt | ||||
#define uio_iovlen(uio, idx) (uio)->uio_iov[(idx)].iov_len | #define zfs_uio_iovlen(u, idx) (u)->uio_iov[(idx)].iov_len | ||||
#define uio_iovbase(uio, idx) (uio)->uio_iov[(idx)].iov_base | #define zfs_uio_iovbase(u, idx) (u)->uio_iov[(idx)].iov_base | ||||
#define uio_fault_disable(uio, set) (uio)->uio_fault_disable = set | #define zfs_uio_fault_disable(u, set) (u)->uio_fault_disable = set | ||||
#define zfs_uio_rlimit_fsize(z, u) (0) | |||||
#define zfs_uio_fault_move(p, n, rw, u) zfs_uiomove((p), (n), (rw), (u)) | |||||
static inline void | static inline void | ||||
uio_iov_at_index(uio_t *uio, uint_t idx, void **base, uint64_t *len) | zfs_uio_setoffset(zfs_uio_t *uio, offset_t off) | ||||
{ | { | ||||
*base = uio_iovbase(uio, idx); | uio->uio_loffset = off; | ||||
*len = uio_iovlen(uio, idx); | |||||
} | } | ||||
static inline void | static inline void | ||||
uio_advance(uio_t *uio, size_t size) | zfs_uio_iov_at_index(zfs_uio_t *uio, uint_t idx, void **base, uint64_t *len) | ||||
{ | { | ||||
*base = zfs_uio_iovbase(uio, idx); | |||||
*len = zfs_uio_iovlen(uio, idx); | |||||
} | |||||
static inline void | |||||
zfs_uio_advance(zfs_uio_t *uio, size_t size) | |||||
{ | |||||
uio->uio_resid -= size; | uio->uio_resid -= size; | ||||
uio->uio_loffset += size; | uio->uio_loffset += size; | ||||
} | } | ||||
static inline offset_t | static inline offset_t | ||||
uio_index_at_offset(uio_t *uio, offset_t off, uint_t *vec_idx) | zfs_uio_index_at_offset(zfs_uio_t *uio, offset_t off, uint_t *vec_idx) | ||||
{ | { | ||||
*vec_idx = 0; | *vec_idx = 0; | ||||
while (*vec_idx < uio_iovcnt(uio) && off >= uio_iovlen(uio, *vec_idx)) { | while (*vec_idx < zfs_uio_iovcnt(uio) && | ||||
off -= uio_iovlen(uio, *vec_idx); | off >= zfs_uio_iovlen(uio, *vec_idx)) { | ||||
off -= zfs_uio_iovlen(uio, *vec_idx); | |||||
(*vec_idx)++; | (*vec_idx)++; | ||||
} | } | ||||
return (off); | return (off); | ||||
} | } | ||||
static inline void | static inline void | ||||
iov_iter_init_compat(struct iov_iter *iter, unsigned int dir, | zfs_uio_iovec_init(zfs_uio_t *uio, const struct iovec *iov, | ||||
const struct iovec *iov, unsigned long nr_segs, size_t count) | unsigned long nr_segs, offset_t offset, zfs_uio_seg_t seg, ssize_t resid, | ||||
size_t skip) | |||||
{ | { | ||||
#if defined(HAVE_IOV_ITER_INIT) | |||||
iov_iter_init(iter, dir, iov, nr_segs, count); | |||||
#elif defined(HAVE_IOV_ITER_INIT_LEGACY) | |||||
iov_iter_init(iter, iov, nr_segs, count, 0); | |||||
#else | |||||
#error "Unsupported kernel" | |||||
#endif | |||||
} | |||||
static inline void | |||||
uio_iovec_init(uio_t *uio, const struct iovec *iov, unsigned long nr_segs, | |||||
offset_t offset, uio_seg_t seg, ssize_t resid, size_t skip) | |||||
{ | |||||
ASSERT(seg == UIO_USERSPACE || seg == UIO_SYSSPACE); | ASSERT(seg == UIO_USERSPACE || seg == UIO_SYSSPACE); | ||||
uio->uio_iov = iov; | uio->uio_iov = iov; | ||||
uio->uio_iovcnt = nr_segs; | uio->uio_iovcnt = nr_segs; | ||||
uio->uio_loffset = offset; | uio->uio_loffset = offset; | ||||
uio->uio_segflg = seg; | uio->uio_segflg = seg; | ||||
uio->uio_fault_disable = B_FALSE; | uio->uio_fault_disable = B_FALSE; | ||||
uio->uio_fmode = 0; | uio->uio_fmode = 0; | ||||
uio->uio_extflg = 0; | uio->uio_extflg = 0; | ||||
uio->uio_resid = resid; | uio->uio_resid = resid; | ||||
uio->uio_skip = skip; | uio->uio_skip = skip; | ||||
} | } | ||||
static inline void | static inline void | ||||
uio_bvec_init(uio_t *uio, struct bio *bio) | zfs_uio_bvec_init(zfs_uio_t *uio, struct bio *bio) | ||||
{ | { | ||||
uio->uio_bvec = &bio->bi_io_vec[BIO_BI_IDX(bio)]; | uio->uio_bvec = &bio->bi_io_vec[BIO_BI_IDX(bio)]; | ||||
uio->uio_iovcnt = bio->bi_vcnt - BIO_BI_IDX(bio); | uio->uio_iovcnt = bio->bi_vcnt - BIO_BI_IDX(bio); | ||||
uio->uio_loffset = BIO_BI_SECTOR(bio) << 9; | uio->uio_loffset = BIO_BI_SECTOR(bio) << 9; | ||||
uio->uio_segflg = UIO_BVEC; | uio->uio_segflg = UIO_BVEC; | ||||
uio->uio_fault_disable = B_FALSE; | uio->uio_fault_disable = B_FALSE; | ||||
uio->uio_fmode = 0; | uio->uio_fmode = 0; | ||||
uio->uio_extflg = 0; | uio->uio_extflg = 0; | ||||
uio->uio_resid = BIO_BI_SIZE(bio); | uio->uio_resid = BIO_BI_SIZE(bio); | ||||
uio->uio_skip = BIO_BI_SKIP(bio); | uio->uio_skip = BIO_BI_SKIP(bio); | ||||
} | } | ||||
#if defined(HAVE_VFS_IOV_ITER) | #if defined(HAVE_VFS_IOV_ITER) | ||||
static inline void | static inline void | ||||
uio_iov_iter_init(uio_t *uio, struct iov_iter *iter, offset_t offset, | zfs_uio_iov_iter_init(zfs_uio_t *uio, struct iov_iter *iter, offset_t offset, | ||||
ssize_t resid, size_t skip) | ssize_t resid, size_t skip) | ||||
{ | { | ||||
uio->uio_iter = iter; | uio->uio_iter = iter; | ||||
uio->uio_iovcnt = iter->nr_segs; | uio->uio_iovcnt = iter->nr_segs; | ||||
uio->uio_loffset = offset; | uio->uio_loffset = offset; | ||||
uio->uio_segflg = UIO_ITER; | uio->uio_segflg = UIO_ITER; | ||||
uio->uio_fault_disable = B_FALSE; | uio->uio_fault_disable = B_FALSE; | ||||
uio->uio_fmode = 0; | uio->uio_fmode = 0; | ||||
uio->uio_extflg = 0; | uio->uio_extflg = 0; | ||||
uio->uio_resid = resid; | uio->uio_resid = resid; | ||||
uio->uio_skip = skip; | uio->uio_skip = skip; | ||||
} | } | ||||
#endif | #endif | ||||
#endif /* SPL_UIO_H */ | #endif /* SPL_UIO_H */ |