| @@ -1,604 +1,604 @@ | | | @@ -1,604 +1,604 @@ |
1 | /* $NetBSD: puffs_msgif.h,v 1.65.20.1 2009/10/18 12:46:07 sborrill Exp $ */ | | 1 | /* $NetBSD: puffs_msgif.h,v 1.65.20.2 2009/12/14 19:36:57 sborrill Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. | | 4 | * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. |
5 | * | | 5 | * |
6 | * Development of this software was supported by the | | 6 | * Development of this software was supported by the |
7 | * Google Summer of Code program and the Ulla Tuominen Foundation. | | 7 | * Google Summer of Code program and the Ulla Tuominen Foundation. |
8 | * The Google SoC project was mentored by Bill Studenmund. | | 8 | * The Google SoC project was mentored by Bill Studenmund. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
15 | * 2. Redistributions in binary form must reproduce the above copyright | | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in the | | 16 | * notice, this list of conditions and the following disclaimer in the |
17 | * documentation and/or other materials provided with the distribution. | | 17 | * documentation and/or other materials provided with the distribution. |
18 | * | | 18 | * |
19 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS | | 19 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS |
20 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | | 20 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
21 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | | 21 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
22 | * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | | 22 | * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | 23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | 24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
25 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 25 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
29 | * SUCH DAMAGE. | | 29 | * SUCH DAMAGE. |
30 | */ | | 30 | */ |
31 | | | 31 | |
32 | #ifndef _FS_PUFFS_PUFFS_MSGIF_H_ | | 32 | #ifndef _FS_PUFFS_PUFFS_MSGIF_H_ |
33 | #define _FS_PUFFS_PUFFS_MSGIF_H_ | | 33 | #define _FS_PUFFS_PUFFS_MSGIF_H_ |
34 | | | 34 | |
35 | #include <sys/param.h> | | 35 | #include <sys/param.h> |
36 | #include <sys/time.h> | | 36 | #include <sys/time.h> |
37 | #include <sys/ioccom.h> | | 37 | #include <sys/ioccom.h> |
38 | #include <sys/uio.h> | | 38 | #include <sys/uio.h> |
39 | #include <sys/vnode.h> | | 39 | #include <sys/vnode.h> |
40 | #include <sys/ucred.h> | | 40 | #include <sys/ucred.h> |
41 | #include <sys/statvfs.h> | | 41 | #include <sys/statvfs.h> |
42 | #include <sys/dirent.h> | | 42 | #include <sys/dirent.h> |
43 | #include <sys/fcntl.h> | | 43 | #include <sys/fcntl.h> |
44 | | | 44 | |
45 | #include <dev/putter/putter.h> | | 45 | #include <dev/putter/putter.h> |
46 | | | 46 | |
47 | #include <uvm/uvm_prot.h> | | 47 | #include <uvm/uvm_prot.h> |
48 | | | 48 | |
49 | #define PUFFSOP_VFS 0x01 /* kernel-> */ | | 49 | #define PUFFSOP_VFS 0x01 /* kernel-> */ |
50 | #define PUFFSOP_VN 0x02 /* kernel-> */ | | 50 | #define PUFFSOP_VN 0x02 /* kernel-> */ |
51 | #define PUFFSOP_CACHE 0x03 /* only kernel-> */ | | 51 | #define PUFFSOP_CACHE 0x03 /* only kernel-> */ |
52 | #define PUFFSOP_ERROR 0x04 /* only kernel-> */ | | 52 | #define PUFFSOP_ERROR 0x04 /* only kernel-> */ |
53 | #define PUFFSOP_FLUSH 0x05 /* ->kernel */ | | 53 | #define PUFFSOP_FLUSH 0x05 /* ->kernel */ |
54 | #define PUFFSOP_SUSPEND 0x06 /* ->kernel */ | | 54 | #define PUFFSOP_SUSPEND 0x06 /* ->kernel */ |
55 | | | 55 | |
56 | #define PUFFSOPFLAG_FAF 0x10 /* fire-and-forget */ | | 56 | #define PUFFSOPFLAG_FAF 0x10 /* fire-and-forget */ |
57 | #define PUFFSOPFLAG_ISRESPONSE 0x20 /* req is actually a resp */ | | 57 | #define PUFFSOPFLAG_ISRESPONSE 0x20 /* req is actually a resp */ |
58 | | | 58 | |
59 | #define PUFFSOP_OPCMASK 0x07 | | 59 | #define PUFFSOP_OPCMASK 0x07 |
60 | #define PUFFSOP_OPCLASS(a) ((a) & PUFFSOP_OPCMASK) | | 60 | #define PUFFSOP_OPCLASS(a) ((a) & PUFFSOP_OPCMASK) |
61 | #define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0) | | 61 | #define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0) |
62 | | | 62 | |
63 | /* XXX: we don't need everything */ | | 63 | /* XXX: we don't need everything */ |
64 | enum { | | 64 | enum { |
65 | PUFFS_VFS_MOUNT, PUFFS_VFS_START, PUFFS_VFS_UNMOUNT, | | 65 | PUFFS_VFS_MOUNT, PUFFS_VFS_START, PUFFS_VFS_UNMOUNT, |
66 | PUFFS_VFS_ROOT, PUFFS_VFS_STATVFS, PUFFS_VFS_SYNC, | | 66 | PUFFS_VFS_ROOT, PUFFS_VFS_STATVFS, PUFFS_VFS_SYNC, |
67 | PUFFS_VFS_VGET, PUFFS_VFS_FHTOVP, PUFFS_VFS_VPTOFH, | | 67 | PUFFS_VFS_VGET, PUFFS_VFS_FHTOVP, PUFFS_VFS_VPTOFH, |
68 | PUFFS_VFS_INIT, PUFFS_VFS_DONE, PUFFS_VFS_SNAPSHOT, | | 68 | PUFFS_VFS_INIT, PUFFS_VFS_DONE, PUFFS_VFS_SNAPSHOT, |
69 | PUFFS_VFS_EXTATTCTL, PUFFS_VFS_SUSPEND | | 69 | PUFFS_VFS_EXTATTCTL, PUFFS_VFS_SUSPEND |
70 | }; | | 70 | }; |
71 | #define PUFFS_VFS_MAX PUFFS_VFS_EXTATTCTL | | 71 | #define PUFFS_VFS_MAX PUFFS_VFS_EXTATTCTL |
72 | | | 72 | |
73 | /* moreXXX: we don't need everything here either */ | | 73 | /* moreXXX: we don't need everything here either */ |
74 | enum { | | 74 | enum { |
75 | PUFFS_VN_LOOKUP, PUFFS_VN_CREATE, PUFFS_VN_MKNOD, | | 75 | PUFFS_VN_LOOKUP, PUFFS_VN_CREATE, PUFFS_VN_MKNOD, |
76 | PUFFS_VN_OPEN, PUFFS_VN_CLOSE, PUFFS_VN_ACCESS, | | 76 | PUFFS_VN_OPEN, PUFFS_VN_CLOSE, PUFFS_VN_ACCESS, |
77 | PUFFS_VN_GETATTR, PUFFS_VN_SETATTR, PUFFS_VN_READ, | | 77 | PUFFS_VN_GETATTR, PUFFS_VN_SETATTR, PUFFS_VN_READ, |
78 | PUFFS_VN_WRITE, PUFFS_VN_IOCTL, PUFFS_VN_FCNTL, | | 78 | PUFFS_VN_WRITE, PUFFS_VN_IOCTL, PUFFS_VN_FCNTL, |
79 | PUFFS_VN_POLL, PUFFS_VN_KQFILTER, PUFFS_VN_REVOKE, | | 79 | PUFFS_VN_POLL, PUFFS_VN_KQFILTER, PUFFS_VN_REVOKE, |
80 | PUFFS_VN_MMAP, PUFFS_VN_FSYNC, PUFFS_VN_SEEK, | | 80 | PUFFS_VN_MMAP, PUFFS_VN_FSYNC, PUFFS_VN_SEEK, |
81 | PUFFS_VN_REMOVE, PUFFS_VN_LINK, PUFFS_VN_RENAME, | | 81 | PUFFS_VN_REMOVE, PUFFS_VN_LINK, PUFFS_VN_RENAME, |
82 | PUFFS_VN_MKDIR, PUFFS_VN_RMDIR, PUFFS_VN_SYMLINK, | | 82 | PUFFS_VN_MKDIR, PUFFS_VN_RMDIR, PUFFS_VN_SYMLINK, |
83 | PUFFS_VN_READDIR, PUFFS_VN_READLINK, PUFFS_VN_ABORTOP, | | 83 | PUFFS_VN_READDIR, PUFFS_VN_READLINK, PUFFS_VN_ABORTOP, |
84 | PUFFS_VN_INACTIVE, PUFFS_VN_RECLAIM, PUFFS_VN_LOCK, | | 84 | PUFFS_VN_INACTIVE, PUFFS_VN_RECLAIM, PUFFS_VN_LOCK, |
85 | PUFFS_VN_UNLOCK, PUFFS_VN_BMAP, PUFFS_VN_STRATEGY, | | 85 | PUFFS_VN_UNLOCK, PUFFS_VN_BMAP, PUFFS_VN_STRATEGY, |
86 | PUFFS_VN_PRINT, PUFFS_VN_ISLOCKED, PUFFS_VN_PATHCONF, | | 86 | PUFFS_VN_PRINT, PUFFS_VN_ISLOCKED, PUFFS_VN_PATHCONF, |
87 | PUFFS_VN_ADVLOCK, PUFFS_VN_LEASE, PUFFS_VN_WHITEOUT, | | 87 | PUFFS_VN_ADVLOCK, PUFFS_VN_LEASE, PUFFS_VN_WHITEOUT, |
88 | PUFFS_VN_GETPAGES, PUFFS_VN_PUTPAGES, PUFFS_VN_GETEXTATTR, | | 88 | PUFFS_VN_GETPAGES, PUFFS_VN_PUTPAGES, PUFFS_VN_GETEXTATTR, |
89 | PUFFS_VN_LISTEXTATTR, PUFFS_VN_OPENEXTATTR, PUFFS_VN_DELETEEXTATTR, | | 89 | PUFFS_VN_LISTEXTATTR, PUFFS_VN_OPENEXTATTR, PUFFS_VN_DELETEEXTATTR, |
90 | PUFFS_VN_SETEXTATTR | | 90 | PUFFS_VN_SETEXTATTR |
91 | }; | | 91 | }; |
92 | #define PUFFS_VN_MAX PUFFS_VN_SETEXTATTR | | 92 | #define PUFFS_VN_MAX PUFFS_VN_SETEXTATTR |
93 | | | 93 | |
94 | /* | | 94 | /* |
95 | * These signal invalid parameters the file system returned. | | 95 | * These signal invalid parameters the file system returned. |
96 | */ | | 96 | */ |
97 | enum { | | 97 | enum { |
98 | PUFFS_ERR_MAKENODE, PUFFS_ERR_LOOKUP, PUFFS_ERR_READDIR, | | 98 | PUFFS_ERR_MAKENODE, PUFFS_ERR_LOOKUP, PUFFS_ERR_READDIR, |
99 | PUFFS_ERR_READLINK, PUFFS_ERR_READ, PUFFS_ERR_WRITE, | | 99 | PUFFS_ERR_READLINK, PUFFS_ERR_READ, PUFFS_ERR_WRITE, |
100 | PUFFS_ERR_VPTOFH, PUFFS_ERR_ERROR | | 100 | PUFFS_ERR_VPTOFH, PUFFS_ERR_ERROR |
101 | }; | | 101 | }; |
102 | #define PUFFS_ERR_MAX PUFFS_ERR_VPTOFH | | 102 | #define PUFFS_ERR_MAX PUFFS_ERR_VPTOFH |
103 | | | 103 | |
104 | #define PUFFSDEVELVERS 0x80000000 | | 104 | #define PUFFSDEVELVERS 0x80000000 |
105 | #define PUFFSVERSION 28 | | 105 | #define PUFFSVERSION 26 |
106 | #define PUFFSNAMESIZE 32 | | 106 | #define PUFFSNAMESIZE 32 |
107 | | | 107 | |
108 | #define PUFFS_TYPEPREFIX "puffs|" | | 108 | #define PUFFS_TYPEPREFIX "puffs|" |
109 | | | 109 | |
110 | #define PUFFS_TYPELEN (_VFS_NAMELEN - (sizeof(PUFFS_TYPEPREFIX)+1)) | | 110 | #define PUFFS_TYPELEN (_VFS_NAMELEN - (sizeof(PUFFS_TYPEPREFIX)+1)) |
111 | #define PUFFS_NAMELEN (_VFS_MNAMELEN-1) | | 111 | #define PUFFS_NAMELEN (_VFS_MNAMELEN-1) |
112 | | | 112 | |
113 | /* | | 113 | /* |
114 | * Just a weak typedef for code clarity. Additionally, we have a | | 114 | * Just a weak typedef for code clarity. Additionally, we have a |
115 | * more appropriate vanity type for puffs: | | 115 | * more appropriate vanity type for puffs: |
116 | * <uep> it should be croissant, not cookie. | | 116 | * <uep> it should be croissant, not cookie. |
117 | */ | | 117 | */ |
118 | typedef void *puffs_cookie_t; | | 118 | typedef void *puffs_cookie_t; |
119 | typedef puffs_cookie_t puffs_croissant_t; | | 119 | typedef puffs_cookie_t puffs_croissant_t; |
120 | | | 120 | |
121 | struct puffs_kargs { | | 121 | struct puffs_kargs { |
122 | unsigned int pa_vers; | | 122 | unsigned int pa_vers; |
123 | int pa_fd; | | 123 | int pa_fd; |
124 | | | 124 | |
125 | uint32_t pa_flags; | | 125 | uint32_t pa_flags; |
126 | | | 126 | |
127 | size_t pa_maxmsglen; | | 127 | size_t pa_maxmsglen; |
128 | int pa_nhashbuckets; | | 128 | int pa_nhashbuckets; |
129 | | | 129 | |
130 | size_t pa_fhsize; | | 130 | size_t pa_fhsize; |
131 | int pa_fhflags; | | 131 | int pa_fhflags; |
132 | | | 132 | |
133 | puffs_cookie_t pa_root_cookie; | | 133 | puffs_cookie_t pa_root_cookie; |
134 | enum vtype pa_root_vtype; | | 134 | enum vtype pa_root_vtype; |
135 | voff_t pa_root_vsize; | | 135 | voff_t pa_root_vsize; |
136 | dev_t pa_root_rdev; | | 136 | dev_t pa_root_rdev; |
137 | | | 137 | |
138 | struct statvfs pa_svfsb; | | 138 | struct statvfs pa_svfsb; |
139 | | | 139 | |
140 | char pa_typename[_VFS_NAMELEN]; | | 140 | char pa_typename[_VFS_NAMELEN]; |
141 | char pa_mntfromname[_VFS_MNAMELEN]; | | 141 | char pa_mntfromname[_VFS_MNAMELEN]; |
142 | | | 142 | |
143 | uint8_t pa_vnopmask[PUFFS_VN_MAX]; | | 143 | uint8_t pa_vnopmask[PUFFS_VN_MAX]; |
144 | }; | | 144 | }; |
145 | #define PUFFS_KFLAG_NOCACHE_NAME 0x01 /* don't use name cache */ | | 145 | #define PUFFS_KFLAG_NOCACHE_NAME 0x01 /* don't use name cache */ |
146 | #define PUFFS_KFLAG_NOCACHE_PAGE 0x02 /* don't use page cache */ | | 146 | #define PUFFS_KFLAG_NOCACHE_PAGE 0x02 /* don't use page cache */ |
147 | #define PUFFS_KFLAG_NOCACHE 0x03 /* no cache whatsoever */ | | 147 | #define PUFFS_KFLAG_NOCACHE 0x03 /* no cache whatsoever */ |
148 | #define PUFFS_KFLAG_ALLOPS 0x04 /* ignore pa_vnopmask */ | | 148 | #define PUFFS_KFLAG_ALLOPS 0x04 /* ignore pa_vnopmask */ |
149 | #define PUFFS_KFLAG_WTCACHE 0x08 /* write-through page cache */ | | 149 | #define PUFFS_KFLAG_WTCACHE 0x08 /* write-through page cache */ |
150 | #define PUFFS_KFLAG_IAONDEMAND 0x10 /* inactive only on demand */ | | 150 | #define PUFFS_KFLAG_IAONDEMAND 0x10 /* inactive only on demand */ |
151 | #define PUFFS_KFLAG_LOOKUP_FULLPNBUF 0x20 /* full pnbuf in lookup */ | | 151 | #define PUFFS_KFLAG_LOOKUP_FULLPNBUF 0x20 /* full pnbuf in lookup */ |
152 | #define PUFFS_KFLAG_MASK 0x3f | | 152 | #define PUFFS_KFLAG_MASK 0x3f |
153 | | | 153 | |
154 | #define PUFFS_FHFLAG_DYNAMIC 0x01 | | 154 | #define PUFFS_FHFLAG_DYNAMIC 0x01 |
155 | #define PUFFS_FHFLAG_NFSV2 0x02 | | 155 | #define PUFFS_FHFLAG_NFSV2 0x02 |
156 | #define PUFFS_FHFLAG_NFSV3 0x04 | | 156 | #define PUFFS_FHFLAG_NFSV3 0x04 |
157 | #define PUFFS_FHFLAG_PROTOMASK 0x06 | | 157 | #define PUFFS_FHFLAG_PROTOMASK 0x06 |
158 | #define PUFFS_FHFLAG_PASSTHROUGH 0x08 | | 158 | #define PUFFS_FHFLAG_PASSTHROUGH 0x08 |
159 | #define PUFFS_FHFLAG_MASK 0x0f | | 159 | #define PUFFS_FHFLAG_MASK 0x0f |
160 | | | 160 | |
161 | #define PUFFS_FHSIZE_MAX 1020 /* XXX: FHANDLE_SIZE_MAX - 4 */ | | 161 | #define PUFFS_FHSIZE_MAX 1020 /* XXX: FHANDLE_SIZE_MAX - 4 */ |
162 | | | 162 | |
163 | struct puffs_req { | | 163 | struct puffs_req { |
164 | struct putter_hdr preq_pth; | | 164 | struct putter_hdr preq_pth; |
165 | | | 165 | |
166 | uint64_t preq_id; | | 166 | uint64_t preq_id; |
167 | puffs_cookie_t preq_cookie; | | 167 | puffs_cookie_t preq_cookie; |
168 | | | 168 | |
169 | uint16_t preq_opclass; | | 169 | uint16_t preq_opclass; |
170 | uint16_t preq_optype; | | 170 | uint16_t preq_optype; |
171 | int preq_rv; | | 171 | int preq_rv; |
172 | | | 172 | |
173 | uint32_t preq_setbacks; | | 173 | uint32_t preq_setbacks; |
174 | | | 174 | |
175 | /* Who is making the call? Eventually host id is also needed. */ | | 175 | /* Who is making the call? Eventually host id is also needed. */ |
176 | pid_t preq_pid; | | 176 | pid_t preq_pid; |
177 | lwpid_t preq_lid; | | 177 | lwpid_t preq_lid; |
178 | | | 178 | |
179 | /* | | 179 | /* |
180 | * the following helper pads the struct size to md alignment | | 180 | * the following helper pads the struct size to md alignment |
181 | * multiple (should size_t not cut it). it makes sure that | | 181 | * multiple (should size_t not cut it). it makes sure that |
182 | * whatever comes after this struct is aligned | | 182 | * whatever comes after this struct is aligned |
183 | */ | | 183 | */ |
184 | size_t preq_buflen; | | 184 | size_t preq_buflen; |
185 | uint8_t preq_buf[0] __aligned(ALIGNBYTES+1); | | 185 | uint8_t preq_buf[0] __aligned(ALIGNBYTES+1); |
186 | }; | | 186 | }; |
187 | | | 187 | |
188 | #define PUFFS_SETBACK_INACT_N1 0x01 /* set VOP_INACTIVE for node 1 */ | | 188 | #define PUFFS_SETBACK_INACT_N1 0x01 /* set VOP_INACTIVE for node 1 */ |
189 | #define PUFFS_SETBACK_INACT_N2 0x02 /* set VOP_INACTIVE for node 2 */ | | 189 | #define PUFFS_SETBACK_INACT_N2 0x02 /* set VOP_INACTIVE for node 2 */ |
190 | #define PUFFS_SETBACK_NOREF_N1 0x04 /* set pn PN_NOREFS for node 1 */ | | 190 | #define PUFFS_SETBACK_NOREF_N1 0x04 /* set pn PN_NOREFS for node 1 */ |
191 | #define PUFFS_SETBACK_NOREF_N2 0x08 /* set pn PN_NOREFS for node 2 */ | | 191 | #define PUFFS_SETBACK_NOREF_N2 0x08 /* set pn PN_NOREFS for node 2 */ |
192 | #define PUFFS_SETBACK_MASK 0x0f | | 192 | #define PUFFS_SETBACK_MASK 0x0f |
193 | | | 193 | |
194 | /* | | 194 | /* |
195 | * Flush operation. This can be used to invalidate: | | 195 | * Flush operation. This can be used to invalidate: |
196 | * 1) name cache for one node | | 196 | * 1) name cache for one node |
197 | * 2) name cache for all children | | 197 | * 2) name cache for all children |
198 | * 3) name cache for the entire mount | | 198 | * 3) name cache for the entire mount |
199 | * 4) page cache for a set of ranges in one node | | 199 | * 4) page cache for a set of ranges in one node |
200 | * 5) page cache for one entire node | | 200 | * 5) page cache for one entire node |
201 | * | | 201 | * |
202 | * It can be used to flush: | | 202 | * It can be used to flush: |
203 | * 1) page cache for a set of ranges in one node | | 203 | * 1) page cache for a set of ranges in one node |
204 | * 2) page cache for one entire node | | 204 | * 2) page cache for one entire node |
205 | */ | | 205 | */ |
206 | | | 206 | |
207 | /* XXX: needs restructuring */ | | 207 | /* XXX: needs restructuring */ |
208 | struct puffs_flush { | | 208 | struct puffs_flush { |
209 | struct puffs_req pf_req; | | 209 | struct puffs_req pf_req; |
210 | | | 210 | |
211 | puffs_cookie_t pf_cookie; | | 211 | puffs_cookie_t pf_cookie; |
212 | | | 212 | |
213 | int pf_op; | | 213 | int pf_op; |
214 | off_t pf_start; | | 214 | off_t pf_start; |
215 | off_t pf_end; | | 215 | off_t pf_end; |
216 | }; | | 216 | }; |
217 | #define PUFFS_INVAL_NAMECACHE_NODE 0 | | 217 | #define PUFFS_INVAL_NAMECACHE_NODE 0 |
218 | #define PUFFS_INVAL_NAMECACHE_DIR 1 | | 218 | #define PUFFS_INVAL_NAMECACHE_DIR 1 |
219 | #define PUFFS_INVAL_NAMECACHE_ALL 2 | | 219 | #define PUFFS_INVAL_NAMECACHE_ALL 2 |
220 | #define PUFFS_INVAL_PAGECACHE_NODE_RANGE 3 | | 220 | #define PUFFS_INVAL_PAGECACHE_NODE_RANGE 3 |
221 | #define PUFFS_FLUSH_PAGECACHE_NODE_RANGE 4 | | 221 | #define PUFFS_FLUSH_PAGECACHE_NODE_RANGE 4 |
222 | | | 222 | |
223 | /* keep this for now */ | | 223 | /* keep this for now */ |
224 | #define PUFFSREQSIZEOP _IOR ('p', 1, size_t) | | 224 | #define PUFFSREQSIZEOP _IOR ('p', 1, size_t) |
225 | | | 225 | |
226 | /* | | 226 | /* |
227 | * Credentials for an operation. Can be either struct uucred for | | 227 | * Credentials for an operation. Can be either struct uucred for |
228 | * ops called from a credential context or NOCRED/FSCRED for ops | | 228 | * ops called from a credential context or NOCRED/FSCRED for ops |
229 | * called from within the kernel. It is up to the implementation | | 229 | * called from within the kernel. It is up to the implementation |
230 | * if it makes a difference between these two and the super-user. | | 230 | * if it makes a difference between these two and the super-user. |
231 | */ | | 231 | */ |
232 | struct puffs_kcred { | | 232 | struct puffs_kcred { |
233 | struct uucred pkcr_uuc; | | 233 | struct uucred pkcr_uuc; |
234 | uint8_t pkcr_type; | | 234 | uint8_t pkcr_type; |
235 | uint8_t pkcr_internal; | | 235 | uint8_t pkcr_internal; |
236 | }; | | 236 | }; |
237 | #define PUFFCRED_TYPE_UUC 1 | | 237 | #define PUFFCRED_TYPE_UUC 1 |
238 | #define PUFFCRED_TYPE_INTERNAL 2 | | 238 | #define PUFFCRED_TYPE_INTERNAL 2 |
239 | #define PUFFCRED_CRED_NOCRED 1 | | 239 | #define PUFFCRED_CRED_NOCRED 1 |
240 | #define PUFFCRED_CRED_FSCRED 2 | | 240 | #define PUFFCRED_CRED_FSCRED 2 |
241 | | | 241 | |
242 | /* | | 242 | /* |
243 | * 2*MAXPHYS is the max size the system will attempt to copy, | | 243 | * 2*MAXPHYS is the max size the system will attempt to copy, |
244 | * else treated as garbage | | 244 | * else treated as garbage |
245 | */ | | 245 | */ |
246 | #define PUFFS_MSG_MAXSIZE 2*MAXPHYS | | 246 | #define PUFFS_MSG_MAXSIZE 2*MAXPHYS |
247 | #define PUFFS_MSGSTRUCT_MAX 4096 /* XXX: approxkludge */ | | 247 | #define PUFFS_MSGSTRUCT_MAX 4096 /* XXX: approxkludge */ |
248 | | | 248 | |
249 | #define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX)) | | 249 | #define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX)) |
250 | | | 250 | |
251 | /* puffs struct componentname built by kernel */ | | 251 | /* puffs struct componentname built by kernel */ |
252 | struct puffs_kcn { | | 252 | struct puffs_kcn { |
253 | /* args */ | | 253 | /* args */ |
254 | uint32_t pkcn_nameiop; /* namei operation */ | | 254 | uint32_t pkcn_nameiop; /* namei operation */ |
255 | uint32_t pkcn_flags; /* flags */ | | 255 | uint32_t pkcn_flags; /* flags */ |
256 | | | 256 | |
257 | char pkcn_name[MAXPATHLEN]; /* nulterminated path component */ | | 257 | char pkcn_name[MAXPATHLEN]; /* nulterminated path component */ |
258 | size_t pkcn_namelen; /* current component length */ | | 258 | size_t pkcn_namelen; /* current component length */ |
259 | size_t pkcn_consume; /* IN: extra chars server ate */ | | 259 | size_t pkcn_consume; /* IN: extra chars server ate */ |
260 | }; | | 260 | }; |
261 | | | 261 | |
262 | | | 262 | |
263 | /* | | 263 | /* |
264 | * Next come the individual requests. They are all subclassed from | | 264 | * Next come the individual requests. They are all subclassed from |
265 | * puffs_req and contain request-specific fields in addition. Note | | 265 | * puffs_req and contain request-specific fields in addition. Note |
266 | * that there are some requests which have to handle arbitrary-length | | 266 | * that there are some requests which have to handle arbitrary-length |
267 | * buffers. | | 267 | * buffers. |
268 | * | | 268 | * |
269 | * The division is the following: puffs_req is to be touched only | | 269 | * The division is the following: puffs_req is to be touched only |
270 | * by generic routines while the other stuff is supposed to be | | 270 | * by generic routines while the other stuff is supposed to be |
271 | * modified only by specific routines. | | 271 | * modified only by specific routines. |
272 | */ | | 272 | */ |
273 | | | 273 | |
274 | /* | | 274 | /* |
275 | * aux structures for vfs operations. | | 275 | * aux structures for vfs operations. |
276 | */ | | 276 | */ |
277 | struct puffs_vfsmsg_unmount { | | 277 | struct puffs_vfsmsg_unmount { |
278 | struct puffs_req pvfsr_pr; | | 278 | struct puffs_req pvfsr_pr; |
279 | | | 279 | |
280 | int pvfsr_flags; | | 280 | int pvfsr_flags; |
281 | }; | | 281 | }; |
282 | | | 282 | |
283 | struct puffs_vfsmsg_statvfs { | | 283 | struct puffs_vfsmsg_statvfs { |
284 | struct puffs_req pvfsr_pr; | | 284 | struct puffs_req pvfsr_pr; |
285 | | | 285 | |
286 | struct statvfs pvfsr_sb; | | 286 | struct statvfs pvfsr_sb; |
287 | }; | | 287 | }; |
288 | | | 288 | |
289 | struct puffs_vfsmsg_sync { | | 289 | struct puffs_vfsmsg_sync { |
290 | struct puffs_req pvfsr_pr; | | 290 | struct puffs_req pvfsr_pr; |
291 | | | 291 | |
292 | struct puffs_kcred pvfsr_cred; | | 292 | struct puffs_kcred pvfsr_cred; |
293 | int pvfsr_waitfor; | | 293 | int pvfsr_waitfor; |
294 | }; | | 294 | }; |
295 | | | 295 | |
296 | struct puffs_vfsmsg_fhtonode { | | 296 | struct puffs_vfsmsg_fhtonode { |
297 | struct puffs_req pvfsr_pr; | | 297 | struct puffs_req pvfsr_pr; |
298 | | | 298 | |
299 | void *pvfsr_fhcookie; /* IN */ | | 299 | void *pvfsr_fhcookie; /* IN */ |
300 | enum vtype pvfsr_vtype; /* IN */ | | 300 | enum vtype pvfsr_vtype; /* IN */ |
301 | voff_t pvfsr_size; /* IN */ | | 301 | voff_t pvfsr_size; /* IN */ |
302 | dev_t pvfsr_rdev; /* IN */ | | 302 | dev_t pvfsr_rdev; /* IN */ |
303 | | | 303 | |
304 | size_t pvfsr_dsize; /* OUT */ | | 304 | size_t pvfsr_dsize; /* OUT */ |
305 | uint8_t pvfsr_data[0] /* OUT, XXX */ | | 305 | uint8_t pvfsr_data[0] /* OUT, XXX */ |
306 | __aligned(ALIGNBYTES+1); | | 306 | __aligned(ALIGNBYTES+1); |
307 | }; | | 307 | }; |
308 | | | 308 | |
309 | struct puffs_vfsmsg_nodetofh { | | 309 | struct puffs_vfsmsg_nodetofh { |
310 | struct puffs_req pvfsr_pr; | | 310 | struct puffs_req pvfsr_pr; |
311 | | | 311 | |
312 | void *pvfsr_fhcookie; /* OUT */ | | 312 | void *pvfsr_fhcookie; /* OUT */ |
313 | | | 313 | |
314 | size_t pvfsr_dsize; /* OUT/IN */ | | 314 | size_t pvfsr_dsize; /* OUT/IN */ |
315 | uint8_t pvfsr_data[0] /* IN, XXX */ | | 315 | uint8_t pvfsr_data[0] /* IN, XXX */ |
316 | __aligned(ALIGNBYTES+1); | | 316 | __aligned(ALIGNBYTES+1); |
317 | }; | | 317 | }; |
318 | | | 318 | |
319 | struct puffs_vfsmsg_suspend { | | 319 | struct puffs_vfsmsg_suspend { |
320 | struct puffs_req pvfsr_pr; | | 320 | struct puffs_req pvfsr_pr; |
321 | | | 321 | |
322 | int pvfsr_status; | | 322 | int pvfsr_status; |
323 | }; | | 323 | }; |
324 | #define PUFFS_SUSPEND_START 0 | | 324 | #define PUFFS_SUSPEND_START 0 |
325 | #define PUFFS_SUSPEND_SUSPENDED 1 | | 325 | #define PUFFS_SUSPEND_SUSPENDED 1 |
326 | #define PUFFS_SUSPEND_RESUME 2 | | 326 | #define PUFFS_SUSPEND_RESUME 2 |
327 | #define PUFFS_SUSPEND_ERROR 3 | | 327 | #define PUFFS_SUSPEND_ERROR 3 |
328 | | | 328 | |
329 | /* | | 329 | /* |
330 | * aux structures for vnode operations. | | 330 | * aux structures for vnode operations. |
331 | */ | | 331 | */ |
332 | | | 332 | |
333 | struct puffs_vnmsg_lookup { | | 333 | struct puffs_vnmsg_lookup { |
334 | struct puffs_req pvn_pr; | | 334 | struct puffs_req pvn_pr; |
335 | | | 335 | |
336 | struct puffs_kcn pvnr_cn; /* OUT */ | | 336 | struct puffs_kcn pvnr_cn; /* OUT */ |
337 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 337 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
338 | | | 338 | |
339 | puffs_cookie_t pvnr_newnode; /* IN */ | | 339 | puffs_cookie_t pvnr_newnode; /* IN */ |
340 | enum vtype pvnr_vtype; /* IN */ | | 340 | enum vtype pvnr_vtype; /* IN */ |
341 | voff_t pvnr_size; /* IN */ | | 341 | voff_t pvnr_size; /* IN */ |
342 | dev_t pvnr_rdev; /* IN */ | | 342 | dev_t pvnr_rdev; /* IN */ |
343 | }; | | 343 | }; |
344 | | | 344 | |
345 | struct puffs_vnmsg_create { | | 345 | struct puffs_vnmsg_create { |
346 | struct puffs_req pvn_pr; | | 346 | struct puffs_req pvn_pr; |
347 | | | 347 | |
348 | struct puffs_kcn pvnr_cn; /* OUT */ | | 348 | struct puffs_kcn pvnr_cn; /* OUT */ |
349 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 349 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
350 | | | 350 | |
351 | struct vattr pvnr_va; /* OUT */ | | 351 | struct vattr pvnr_va; /* OUT */ |
352 | puffs_cookie_t pvnr_newnode; /* IN */ | | 352 | puffs_cookie_t pvnr_newnode; /* IN */ |
353 | }; | | 353 | }; |
354 | | | 354 | |
355 | struct puffs_vnmsg_mknod { | | 355 | struct puffs_vnmsg_mknod { |
356 | struct puffs_req pvn_pr; | | 356 | struct puffs_req pvn_pr; |
357 | | | 357 | |
358 | struct puffs_kcn pvnr_cn; /* OUT */ | | 358 | struct puffs_kcn pvnr_cn; /* OUT */ |
359 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 359 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
360 | | | 360 | |
361 | struct vattr pvnr_va; /* OUT */ | | 361 | struct vattr pvnr_va; /* OUT */ |
362 | puffs_cookie_t pvnr_newnode; /* IN */ | | 362 | puffs_cookie_t pvnr_newnode; /* IN */ |
363 | }; | | 363 | }; |
364 | | | 364 | |
365 | struct puffs_vnmsg_open { | | 365 | struct puffs_vnmsg_open { |
366 | struct puffs_req pvn_pr; | | 366 | struct puffs_req pvn_pr; |
367 | | | 367 | |
368 | struct puffs_kcred pvnr_cred; /* OUT */ | | 368 | struct puffs_kcred pvnr_cred; /* OUT */ |
369 | int pvnr_mode; /* OUT */ | | 369 | int pvnr_mode; /* OUT */ |
370 | }; | | 370 | }; |
371 | | | 371 | |
372 | struct puffs_vnmsg_close { | | 372 | struct puffs_vnmsg_close { |
373 | struct puffs_req pvn_pr; | | 373 | struct puffs_req pvn_pr; |
374 | | | 374 | |
375 | struct puffs_kcred pvnr_cred; /* OUT */ | | 375 | struct puffs_kcred pvnr_cred; /* OUT */ |
376 | int pvnr_fflag; /* OUT */ | | 376 | int pvnr_fflag; /* OUT */ |
377 | }; | | 377 | }; |
378 | | | 378 | |
379 | struct puffs_vnmsg_access { | | 379 | struct puffs_vnmsg_access { |
380 | struct puffs_req pvn_pr; | | 380 | struct puffs_req pvn_pr; |
381 | | | 381 | |
382 | struct puffs_kcred pvnr_cred; /* OUT */ | | 382 | struct puffs_kcred pvnr_cred; /* OUT */ |
383 | int pvnr_mode; /* OUT */ | | 383 | int pvnr_mode; /* OUT */ |
384 | }; | | 384 | }; |
385 | | | 385 | |
386 | #define puffs_vnmsg_setattr puffs_vnmsg_setgetattr | | 386 | #define puffs_vnmsg_setattr puffs_vnmsg_setgetattr |
387 | #define puffs_vnmsg_getattr puffs_vnmsg_setgetattr | | 387 | #define puffs_vnmsg_getattr puffs_vnmsg_setgetattr |
388 | struct puffs_vnmsg_setgetattr { | | 388 | struct puffs_vnmsg_setgetattr { |
389 | struct puffs_req pvn_pr; | | 389 | struct puffs_req pvn_pr; |
390 | | | 390 | |
391 | struct puffs_kcred pvnr_cred; /* OUT */ | | 391 | struct puffs_kcred pvnr_cred; /* OUT */ |
392 | struct vattr pvnr_va; /* IN/OUT (op depend) */ | | 392 | struct vattr pvnr_va; /* IN/OUT (op depend) */ |
393 | }; | | 393 | }; |
394 | | | 394 | |
395 | #define puffs_vnmsg_read puffs_vnmsg_rw | | 395 | #define puffs_vnmsg_read puffs_vnmsg_rw |
396 | #define puffs_vnmsg_write puffs_vnmsg_rw | | 396 | #define puffs_vnmsg_write puffs_vnmsg_rw |
397 | struct puffs_vnmsg_rw { | | 397 | struct puffs_vnmsg_rw { |
398 | struct puffs_req pvn_pr; | | 398 | struct puffs_req pvn_pr; |
399 | | | 399 | |
400 | struct puffs_kcred pvnr_cred; /* OUT */ | | 400 | struct puffs_kcred pvnr_cred; /* OUT */ |
401 | off_t pvnr_offset; /* OUT */ | | 401 | off_t pvnr_offset; /* OUT */ |
402 | size_t pvnr_resid; /* IN/OUT */ | | 402 | size_t pvnr_resid; /* IN/OUT */ |
403 | int pvnr_ioflag; /* OUT */ | | 403 | int pvnr_ioflag; /* OUT */ |
404 | | | 404 | |
405 | uint8_t pvnr_data[0]; /* IN/OUT (wr/rd) */ | | 405 | uint8_t pvnr_data[0]; /* IN/OUT (wr/rd) */ |
406 | }; | | 406 | }; |
407 | | | 407 | |
408 | #define puffs_vnmsg_ioctl puffs_vnreq_fcnioctl | | 408 | #define puffs_vnmsg_ioctl puffs_vnreq_fcnioctl |
409 | #define puffs_vnmsg_fcntl puffs_vnreq_fcnioctl | | 409 | #define puffs_vnmsg_fcntl puffs_vnreq_fcnioctl |
410 | struct puffs_vnmsg_fcnioctl { | | 410 | struct puffs_vnmsg_fcnioctl { |
411 | struct puffs_req pvn_pr; | | 411 | struct puffs_req pvn_pr; |
412 | | | 412 | |
413 | struct puffs_kcred pvnr_cred; | | 413 | struct puffs_kcred pvnr_cred; |
414 | u_long pvnr_command; | | 414 | u_long pvnr_command; |
415 | pid_t pvnr_pid; | | 415 | pid_t pvnr_pid; |
416 | int pvnr_fflag; | | 416 | int pvnr_fflag; |
417 | | | 417 | |
418 | void *pvnr_data; | | 418 | void *pvnr_data; |
419 | size_t pvnr_datalen; | | 419 | size_t pvnr_datalen; |
420 | int pvnr_copyback; | | 420 | int pvnr_copyback; |
421 | }; | | 421 | }; |
422 | | | 422 | |
423 | struct puffs_vnmsg_poll { | | 423 | struct puffs_vnmsg_poll { |
424 | struct puffs_req pvn_pr; | | 424 | struct puffs_req pvn_pr; |
425 | | | 425 | |
426 | int pvnr_events; /* IN/OUT */ | | 426 | int pvnr_events; /* IN/OUT */ |
427 | }; | | 427 | }; |
428 | | | 428 | |
429 | struct puffs_vnmsg_fsync { | | 429 | struct puffs_vnmsg_fsync { |
430 | struct puffs_req pvn_pr; | | 430 | struct puffs_req pvn_pr; |
431 | | | 431 | |
432 | struct puffs_kcred pvnr_cred; /* OUT */ | | 432 | struct puffs_kcred pvnr_cred; /* OUT */ |
433 | off_t pvnr_offlo; /* OUT */ | | 433 | off_t pvnr_offlo; /* OUT */ |
434 | off_t pvnr_offhi; /* OUT */ | | 434 | off_t pvnr_offhi; /* OUT */ |
435 | int pvnr_flags; /* OUT */ | | 435 | int pvnr_flags; /* OUT */ |
436 | }; | | 436 | }; |
437 | | | 437 | |
438 | struct puffs_vnmsg_seek { | | 438 | struct puffs_vnmsg_seek { |
439 | struct puffs_req pvn_pr; | | 439 | struct puffs_req pvn_pr; |
440 | | | 440 | |
441 | struct puffs_kcred pvnr_cred; /* OUT */ | | 441 | struct puffs_kcred pvnr_cred; /* OUT */ |
442 | off_t pvnr_oldoff; /* OUT */ | | 442 | off_t pvnr_oldoff; /* OUT */ |
443 | off_t pvnr_newoff; /* OUT */ | | 443 | off_t pvnr_newoff; /* OUT */ |
444 | }; | | 444 | }; |
445 | | | 445 | |
446 | struct puffs_vnmsg_remove { | | 446 | struct puffs_vnmsg_remove { |
447 | struct puffs_req pvn_pr; | | 447 | struct puffs_req pvn_pr; |
448 | | | 448 | |
449 | struct puffs_kcn pvnr_cn; /* OUT */ | | 449 | struct puffs_kcn pvnr_cn; /* OUT */ |
450 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 450 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
451 | | | 451 | |
452 | puffs_cookie_t pvnr_cookie_targ; /* OUT */ | | 452 | puffs_cookie_t pvnr_cookie_targ; /* OUT */ |
453 | }; | | 453 | }; |
454 | | | 454 | |
455 | struct puffs_vnmsg_mkdir { | | 455 | struct puffs_vnmsg_mkdir { |
456 | struct puffs_req pvn_pr; | | 456 | struct puffs_req pvn_pr; |
457 | | | 457 | |
458 | struct puffs_kcn pvnr_cn; /* OUT */ | | 458 | struct puffs_kcn pvnr_cn; /* OUT */ |
459 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 459 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
460 | | | 460 | |
461 | struct vattr pvnr_va; /* OUT */ | | 461 | struct vattr pvnr_va; /* OUT */ |
462 | puffs_cookie_t pvnr_newnode; /* IN */ | | 462 | puffs_cookie_t pvnr_newnode; /* IN */ |
463 | }; | | 463 | }; |
464 | | | 464 | |
465 | struct puffs_vnmsg_rmdir { | | 465 | struct puffs_vnmsg_rmdir { |
466 | struct puffs_req pvn_pr; | | 466 | struct puffs_req pvn_pr; |
467 | | | 467 | |
468 | struct puffs_kcn pvnr_cn; /* OUT */ | | 468 | struct puffs_kcn pvnr_cn; /* OUT */ |
469 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 469 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
470 | | | 470 | |
471 | puffs_cookie_t pvnr_cookie_targ; /* OUT */ | | 471 | puffs_cookie_t pvnr_cookie_targ; /* OUT */ |
472 | }; | | 472 | }; |
473 | | | 473 | |
474 | struct puffs_vnmsg_link { | | 474 | struct puffs_vnmsg_link { |
475 | struct puffs_req pvn_pr; | | 475 | struct puffs_req pvn_pr; |
476 | | | 476 | |
477 | struct puffs_kcn pvnr_cn; /* OUT */ | | 477 | struct puffs_kcn pvnr_cn; /* OUT */ |
478 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 478 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
479 | | | 479 | |
480 | puffs_cookie_t pvnr_cookie_targ; /* OUT */ | | 480 | puffs_cookie_t pvnr_cookie_targ; /* OUT */ |
481 | }; | | 481 | }; |
482 | | | 482 | |
483 | struct puffs_vnmsg_rename { | | 483 | struct puffs_vnmsg_rename { |
484 | struct puffs_req pvn_pr; | | 484 | struct puffs_req pvn_pr; |
485 | | | 485 | |
486 | struct puffs_kcn pvnr_cn_src; /* OUT */ | | 486 | struct puffs_kcn pvnr_cn_src; /* OUT */ |
487 | struct puffs_kcred pvnr_cn_src_cred; /* OUT */ | | 487 | struct puffs_kcred pvnr_cn_src_cred; /* OUT */ |
488 | struct puffs_kcn pvnr_cn_targ; /* OUT */ | | 488 | struct puffs_kcn pvnr_cn_targ; /* OUT */ |
489 | struct puffs_kcred pvnr_cn_targ_cred; /* OUT */ | | 489 | struct puffs_kcred pvnr_cn_targ_cred; /* OUT */ |
490 | | | 490 | |
491 | puffs_cookie_t pvnr_cookie_src; /* OUT */ | | 491 | puffs_cookie_t pvnr_cookie_src; /* OUT */ |
492 | puffs_cookie_t pvnr_cookie_targ; /* OUT */ | | 492 | puffs_cookie_t pvnr_cookie_targ; /* OUT */ |
493 | puffs_cookie_t pvnr_cookie_targdir; /* OUT */ | | 493 | puffs_cookie_t pvnr_cookie_targdir; /* OUT */ |
494 | }; | | 494 | }; |
495 | | | 495 | |
496 | struct puffs_vnmsg_symlink { | | 496 | struct puffs_vnmsg_symlink { |
497 | struct puffs_req pvn_pr; | | 497 | struct puffs_req pvn_pr; |
498 | | | 498 | |
499 | struct puffs_kcn pvnr_cn; /* OUT */ | | 499 | struct puffs_kcn pvnr_cn; /* OUT */ |
500 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 500 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
501 | | | 501 | |
502 | struct vattr pvnr_va; /* OUT */ | | 502 | struct vattr pvnr_va; /* OUT */ |
503 | puffs_cookie_t pvnr_newnode; /* IN */ | | 503 | puffs_cookie_t pvnr_newnode; /* IN */ |
504 | char pvnr_link[MAXPATHLEN]; /* OUT */ | | 504 | char pvnr_link[MAXPATHLEN]; /* OUT */ |
505 | }; | | 505 | }; |
506 | | | 506 | |
507 | struct puffs_vnmsg_readdir { | | 507 | struct puffs_vnmsg_readdir { |
508 | struct puffs_req pvn_pr; | | 508 | struct puffs_req pvn_pr; |
509 | | | 509 | |
510 | struct puffs_kcred pvnr_cred; /* OUT */ | | 510 | struct puffs_kcred pvnr_cred; /* OUT */ |
511 | off_t pvnr_offset; /* IN/OUT */ | | 511 | off_t pvnr_offset; /* IN/OUT */ |
512 | size_t pvnr_resid; /* IN/OUT */ | | 512 | size_t pvnr_resid; /* IN/OUT */ |
513 | size_t pvnr_ncookies; /* IN/OUT */ | | 513 | size_t pvnr_ncookies; /* IN/OUT */ |
514 | int pvnr_eofflag; /* IN */ | | 514 | int pvnr_eofflag; /* IN */ |
515 | | | 515 | |
516 | size_t pvnr_dentoff; /* OUT */ | | 516 | size_t pvnr_dentoff; /* OUT */ |
517 | uint8_t pvnr_data[0] /* IN */ | | 517 | uint8_t pvnr_data[0] /* IN */ |
518 | __aligned(ALIGNBYTES+1); | | 518 | __aligned(ALIGNBYTES+1); |
519 | }; | | 519 | }; |
520 | | | 520 | |
521 | struct puffs_vnmsg_readlink { | | 521 | struct puffs_vnmsg_readlink { |
522 | struct puffs_req pvn_pr; | | 522 | struct puffs_req pvn_pr; |
523 | | | 523 | |
524 | struct puffs_kcred pvnr_cred; /* OUT */ | | 524 | struct puffs_kcred pvnr_cred; /* OUT */ |
525 | size_t pvnr_linklen; /* IN */ | | 525 | size_t pvnr_linklen; /* IN */ |
526 | char pvnr_link[MAXPATHLEN]; /* IN, XXX */ | | 526 | char pvnr_link[MAXPATHLEN]; /* IN, XXX */ |
527 | }; | | 527 | }; |
528 | | | 528 | |
529 | struct puffs_vnmsg_reclaim { | | 529 | struct puffs_vnmsg_reclaim { |
530 | struct puffs_req pvn_pr; | | 530 | struct puffs_req pvn_pr; |
531 | }; | | 531 | }; |
532 | | | 532 | |
533 | struct puffs_vnmsg_inactive { | | 533 | struct puffs_vnmsg_inactive { |
534 | struct puffs_req pvn_pr; | | 534 | struct puffs_req pvn_pr; |
535 | }; | | 535 | }; |
536 | | | 536 | |
537 | struct puffs_vnmsg_print { | | 537 | struct puffs_vnmsg_print { |
538 | struct puffs_req pvn_pr; | | 538 | struct puffs_req pvn_pr; |
539 | | | 539 | |
540 | /* empty */ | | 540 | /* empty */ |
541 | }; | | 541 | }; |
542 | | | 542 | |
543 | struct puffs_vnmsg_pathconf { | | 543 | struct puffs_vnmsg_pathconf { |
544 | struct puffs_req pvn_pr; | | 544 | struct puffs_req pvn_pr; |
545 | | | 545 | |
546 | int pvnr_name; /* OUT */ | | 546 | int pvnr_name; /* OUT */ |
547 | int pvnr_retval; /* IN */ | | 547 | int pvnr_retval; /* IN */ |
548 | }; | | 548 | }; |
549 | | | 549 | |
550 | struct puffs_vnmsg_advlock { | | 550 | struct puffs_vnmsg_advlock { |
551 | struct puffs_req pvn_pr; | | 551 | struct puffs_req pvn_pr; |
552 | | | 552 | |
553 | struct flock pvnr_fl; /* OUT */ | | 553 | struct flock pvnr_fl; /* OUT */ |
554 | void *pvnr_id; /* OUT */ | | 554 | void *pvnr_id; /* OUT */ |
555 | int pvnr_op; /* OUT */ | | 555 | int pvnr_op; /* OUT */ |
556 | int pvnr_flags; /* OUT */ | | 556 | int pvnr_flags; /* OUT */ |
557 | }; | | 557 | }; |
558 | | | 558 | |
559 | struct puffs_vnmsg_mmap { | | 559 | struct puffs_vnmsg_mmap { |
560 | struct puffs_req pvn_pr; | | 560 | struct puffs_req pvn_pr; |
561 | | | 561 | |
562 | vm_prot_t pvnr_prot; /* OUT */ | | 562 | vm_prot_t pvnr_prot; /* OUT */ |
563 | struct puffs_kcred pvnr_cred; /* OUT */ | | 563 | struct puffs_kcred pvnr_cred; /* OUT */ |
564 | }; | | 564 | }; |
565 | | | 565 | |
566 | struct puffs_vnmsg_abortop { | | 566 | struct puffs_vnmsg_abortop { |
567 | struct puffs_req pvn_pr; | | 567 | struct puffs_req pvn_pr; |
568 | | | 568 | |
569 | struct puffs_kcn pvnr_cn; /* OUT */ | | 569 | struct puffs_kcn pvnr_cn; /* OUT */ |
570 | struct puffs_kcred pvnr_cn_cred; /* OUT */ | | 570 | struct puffs_kcred pvnr_cn_cred; /* OUT */ |
571 | }; | | 571 | }; |
572 | | | 572 | |
573 | | | 573 | |
574 | /* | | 574 | /* |
575 | * For cache reports. Everything is always out-out-out, no replies | | 575 | * For cache reports. Everything is always out-out-out, no replies |
576 | */ | | 576 | */ |
577 | | | 577 | |
578 | struct puffs_cacherun { | | 578 | struct puffs_cacherun { |
579 | off_t pcache_runstart; | | 579 | off_t pcache_runstart; |
580 | off_t pcache_runend; | | 580 | off_t pcache_runend; |
581 | }; | | 581 | }; |
582 | | | 582 | |
583 | /* cache info. old used for write now */ | | 583 | /* cache info. old used for write now */ |
584 | struct puffs_cacheinfo { | | 584 | struct puffs_cacheinfo { |
585 | struct puffs_req pcache_pr; | | 585 | struct puffs_req pcache_pr; |
586 | | | 586 | |
587 | int pcache_type; | | 587 | int pcache_type; |
588 | size_t pcache_nruns; | | 588 | size_t pcache_nruns; |
589 | struct puffs_cacherun pcache_runs[0]; | | 589 | struct puffs_cacherun pcache_runs[0]; |
590 | }; | | 590 | }; |
591 | #define PCACHE_TYPE_READ 0 | | 591 | #define PCACHE_TYPE_READ 0 |
592 | #define PCACHE_TYPE_WRITE 1 | | 592 | #define PCACHE_TYPE_WRITE 1 |
593 | | | 593 | |
594 | /* | | 594 | /* |
595 | * Error notification. Always outgoing, no response, no remorse. | | 595 | * Error notification. Always outgoing, no response, no remorse. |
596 | */ | | 596 | */ |
597 | struct puffs_error { | | 597 | struct puffs_error { |
598 | struct puffs_req perr_pr; | | 598 | struct puffs_req perr_pr; |
599 | | | 599 | |
600 | int perr_error; | | 600 | int perr_error; |
601 | char perr_str[256]; | | 601 | char perr_str[256]; |
602 | }; | | 602 | }; |
603 | | | 603 | |
604 | #endif /* _FS_PUFFS_PUFFS_MSGIF_H_ */ | | 604 | #endif /* _FS_PUFFS_PUFFS_MSGIF_H_ */ |