]> git.proxmox.com Git - mirror_spl-debian.git/blob - include/sys/uio.h
87da72701c3cef244fd8d3f550c54ef597af6005
[mirror_spl-debian.git] / include / sys / uio.h
1 /*****************************************************************************\
2 * Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC.
3 * Copyright (C) 2007 The Regents of the University of California.
4 * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
5 * Written by Brian Behlendorf <behlendorf1@llnl.gov>.
6 * UCRL-CODE-235197
7 *
8 * This file is part of the SPL, Solaris Porting Layer.
9 * For details, see <http://github.com/behlendorf/spl/>.
10 *
11 * The SPL is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the
13 * Free Software Foundation; either version 2 of the License, or (at your
14 * option) any later version.
15 *
16 * The SPL is distributed in the hope that it will be useful, but WITHOUT
17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 * for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with the SPL. If not, see <http://www.gnu.org/licenses/>.
23 \*****************************************************************************/
24
25 #ifndef _SPL_UIO_H
26 #define _SPL_UIO_H
27
28 #include <linux/uio.h>
29 #include <asm/uaccess.h>
30 #include <sys/types.h>
31
32 typedef struct iovec iovec_t;
33
34 typedef enum uio_rw {
35 UIO_READ = 0,
36 UIO_WRITE = 1,
37 } uio_rw_t;
38
39 typedef enum uio_seg {
40 UIO_USERSPACE = 0,
41 UIO_SYSSPACE = 1,
42 UIO_USERISPACE= 2,
43 } uio_seg_t;
44
45 typedef struct uio {
46 struct iovec *uio_iov;
47 int uio_iovcnt;
48 offset_t uio_loffset;
49 uio_seg_t uio_segflg;
50 uint16_t uio_fmode;
51 uint16_t uio_extflg;
52 offset_t uio_limit;
53 ssize_t uio_resid;
54 } uio_t;
55
56 typedef struct aio_req {
57 uio_t *aio_uio;
58 void *aio_private;
59 } aio_req_t;
60
61 typedef enum xuio_type {
62 UIOTYPE_ASYNCIO,
63 UIOTYPE_ZEROCOPY,
64 } xuio_type_t;
65
66
67 #define UIOA_IOV_MAX 16
68
69 typedef struct uioa_page_s {
70 int uioa_pfncnt;
71 void **uioa_ppp;
72 caddr_t uioa_base;
73 size_t uioa_len;
74 } uioa_page_t;
75
76 typedef struct xuio {
77 uio_t xu_uio;
78 enum xuio_type xu_type;
79 union {
80 struct {
81 uint32_t xu_a_state;
82 ssize_t xu_a_mbytes;
83 uioa_page_t *xu_a_lcur;
84 void **xu_a_lppp;
85 void *xu_a_hwst[4];
86 uioa_page_t xu_a_locked[UIOA_IOV_MAX];
87 } xu_aio;
88
89 struct {
90 int xu_zc_rw;
91 void *xu_zc_priv;
92 } xu_zc;
93 } xu_ext;
94 } xuio_t;
95
96 #define XUIO_XUZC_PRIV(xuio) xuio->xu_ext.xu_zc.xu_zc_priv
97 #define XUIO_XUZC_RW(xuio) xuio->xu_ext.xu_zc.xu_zc_rw
98
99 #endif /* SPL_UIO_H */