puffs_compat.c revision 1.2.10.2 1 1.2.10.2 rmind /* $NetBSD: puffs_compat.c,v 1.2.10.2 2011/03/05 20:55:07 rmind Exp $ */
2 1.2.10.2 rmind
3 1.2.10.2 rmind /*
4 1.2.10.2 rmind * Copyright (c) 2010 Antti Kantee. All Rights Reserved.
5 1.2.10.2 rmind *
6 1.2.10.2 rmind * Redistribution and use in source and binary forms, with or without
7 1.2.10.2 rmind * modification, are permitted provided that the following conditions
8 1.2.10.2 rmind * are met:
9 1.2.10.2 rmind * 1. Redistributions of source code must retain the above copyright
10 1.2.10.2 rmind * notice, this list of conditions and the following disclaimer.
11 1.2.10.2 rmind * 2. Redistributions in binary form must reproduce the above copyright
12 1.2.10.2 rmind * notice, this list of conditions and the following disclaimer in the
13 1.2.10.2 rmind * documentation and/or other materials provided with the distribution.
14 1.2.10.2 rmind *
15 1.2.10.2 rmind * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16 1.2.10.2 rmind * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 1.2.10.2 rmind * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 1.2.10.2 rmind * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 1.2.10.2 rmind * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 1.2.10.2 rmind * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 1.2.10.2 rmind * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.2.10.2 rmind * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 1.2.10.2 rmind * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.2.10.2 rmind * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.2.10.2 rmind * SUCH DAMAGE.
26 1.2.10.2 rmind */
27 1.2.10.2 rmind
28 1.2.10.2 rmind /*
29 1.2.10.2 rmind * This file handles puffs PDUs so that they are compatible between
30 1.2.10.2 rmind * 32bit<->64bit time_t/dev_t. It enables running a -current kernel
31 1.2.10.2 rmind * against a 5.0 userland (assuming the protocol otherwise matches!).
32 1.2.10.2 rmind */
33 1.2.10.2 rmind
34 1.2.10.2 rmind #include <sys/cdefs.h>
35 1.2.10.2 rmind __KERNEL_RCSID(0, "$NetBSD: puffs_compat.c,v 1.2.10.2 2011/03/05 20:55:07 rmind Exp $");
36 1.2.10.2 rmind
37 1.2.10.2 rmind #include <sys/param.h>
38 1.2.10.2 rmind #include <sys/atomic.h>
39 1.2.10.2 rmind #include <sys/kmem.h>
40 1.2.10.2 rmind #include <sys/kthread.h>
41 1.2.10.2 rmind #include <sys/lock.h>
42 1.2.10.2 rmind #include <sys/malloc.h>
43 1.2.10.2 rmind #include <sys/mount.h>
44 1.2.10.2 rmind #include <sys/namei.h>
45 1.2.10.2 rmind #include <sys/proc.h>
46 1.2.10.2 rmind #include <sys/vnode.h>
47 1.2.10.2 rmind #include <sys/atomic.h>
48 1.2.10.2 rmind
49 1.2.10.2 rmind #include <dev/putter/putter_sys.h>
50 1.2.10.2 rmind
51 1.2.10.2 rmind #include <fs/puffs/puffs_msgif.h>
52 1.2.10.2 rmind #include <fs/puffs/puffs_sys.h>
53 1.2.10.2 rmind
54 1.2.10.2 rmind #include <compat/sys/time.h>
55 1.2.10.2 rmind
56 1.2.10.2 rmind /*
57 1.2.10.2 rmind * compat types
58 1.2.10.2 rmind */
59 1.2.10.2 rmind struct vattr50 {
60 1.2.10.2 rmind enum vtype va_type;
61 1.2.10.2 rmind mode_t va_mode;
62 1.2.10.2 rmind nlink_t va_nlink;
63 1.2.10.2 rmind uid_t va_uid;
64 1.2.10.2 rmind gid_t va_gid;
65 1.2.10.2 rmind uint32_t va_fsid;
66 1.2.10.2 rmind ino_t va_fileid;
67 1.2.10.2 rmind u_quad_t va_size;
68 1.2.10.2 rmind long va_blocksize;
69 1.2.10.2 rmind struct timespec50 va_atime;
70 1.2.10.2 rmind struct timespec50 va_mtime;
71 1.2.10.2 rmind struct timespec50 va_ctime;
72 1.2.10.2 rmind struct timespec50 va_birthtime;
73 1.2.10.2 rmind u_long va_gen;
74 1.2.10.2 rmind u_long va_flags;
75 1.2.10.2 rmind uint32_t va_rdev;
76 1.2.10.2 rmind u_quad_t va_bytes;
77 1.2.10.2 rmind u_quad_t va_filerev;
78 1.2.10.2 rmind u_int va_vaflags;
79 1.2.10.2 rmind long va_spare;
80 1.2.10.2 rmind };
81 1.2.10.2 rmind
82 1.2.10.2 rmind struct puffs50_vfsmsg_fhtonode {
83 1.2.10.2 rmind struct puffs_req pvfsr_pr;
84 1.2.10.2 rmind
85 1.2.10.2 rmind void *pvfsr_fhcookie; /* IN */
86 1.2.10.2 rmind enum vtype pvfsr_vtype; /* IN */
87 1.2.10.2 rmind voff_t pvfsr_size; /* IN */
88 1.2.10.2 rmind uint32_t pvfsr_rdev; /* IN */
89 1.2.10.2 rmind
90 1.2.10.2 rmind size_t pvfsr_dsize; /* OUT */
91 1.2.10.2 rmind uint8_t pvfsr_data[0] /* OUT, XXX */
92 1.2.10.2 rmind __aligned(ALIGNBYTES+1);
93 1.2.10.2 rmind };
94 1.2.10.2 rmind
95 1.2.10.2 rmind struct puffs50_vnmsg_lookup {
96 1.2.10.2 rmind struct puffs_req pvn_pr;
97 1.2.10.2 rmind
98 1.2.10.2 rmind struct puffs_kcn pvnr_cn; /* OUT */
99 1.2.10.2 rmind struct puffs_kcred pvnr_cn_cred; /* OUT */
100 1.2.10.2 rmind
101 1.2.10.2 rmind puffs_cookie_t pvnr_newnode; /* IN */
102 1.2.10.2 rmind enum vtype pvnr_vtype; /* IN */
103 1.2.10.2 rmind voff_t pvnr_size; /* IN */
104 1.2.10.2 rmind uint32_t pvnr_rdev; /* IN */
105 1.2.10.2 rmind };
106 1.2.10.2 rmind
107 1.2.10.2 rmind struct puffs50_vnmsg_create {
108 1.2.10.2 rmind struct puffs_req pvn_pr;
109 1.2.10.2 rmind
110 1.2.10.2 rmind struct puffs_kcn pvnr_cn; /* OUT */
111 1.2.10.2 rmind struct puffs_kcred pvnr_cn_cred; /* OUT */
112 1.2.10.2 rmind
113 1.2.10.2 rmind struct vattr50 pvnr_va; /* OUT */
114 1.2.10.2 rmind puffs_cookie_t pvnr_newnode; /* IN */
115 1.2.10.2 rmind };
116 1.2.10.2 rmind
117 1.2.10.2 rmind struct puffs50_vnmsg_mknod {
118 1.2.10.2 rmind struct puffs_req pvn_pr;
119 1.2.10.2 rmind
120 1.2.10.2 rmind struct puffs_kcn pvnr_cn; /* OUT */
121 1.2.10.2 rmind struct puffs_kcred pvnr_cn_cred; /* OUT */
122 1.2.10.2 rmind
123 1.2.10.2 rmind struct vattr50 pvnr_va; /* OUT */
124 1.2.10.2 rmind puffs_cookie_t pvnr_newnode; /* IN */
125 1.2.10.2 rmind };
126 1.2.10.2 rmind
127 1.2.10.2 rmind #define puffs50_vnmsg_setattr puffs50_vnmsg_setgetattr
128 1.2.10.2 rmind #define puffs50_vnmsg_getattr puffs50_vnmsg_setgetattr
129 1.2.10.2 rmind struct puffs50_vnmsg_setgetattr {
130 1.2.10.2 rmind struct puffs_req pvn_pr;
131 1.2.10.2 rmind
132 1.2.10.2 rmind struct puffs_kcred pvnr_cred; /* OUT */
133 1.2.10.2 rmind struct vattr50 pvnr_va; /* IN/OUT (op depend) */
134 1.2.10.2 rmind };
135 1.2.10.2 rmind
136 1.2.10.2 rmind struct puffs50_vnmsg_mkdir {
137 1.2.10.2 rmind struct puffs_req pvn_pr;
138 1.2.10.2 rmind
139 1.2.10.2 rmind struct puffs_kcn pvnr_cn; /* OUT */
140 1.2.10.2 rmind struct puffs_kcred pvnr_cn_cred; /* OUT */
141 1.2.10.2 rmind
142 1.2.10.2 rmind struct vattr50 pvnr_va; /* OUT */
143 1.2.10.2 rmind puffs_cookie_t pvnr_newnode; /* IN */
144 1.2.10.2 rmind };
145 1.2.10.2 rmind
146 1.2.10.2 rmind struct puffs50_vnmsg_symlink {
147 1.2.10.2 rmind struct puffs_req pvn_pr;
148 1.2.10.2 rmind
149 1.2.10.2 rmind struct puffs_kcn pvnr_cn; /* OUT */
150 1.2.10.2 rmind struct puffs_kcred pvnr_cn_cred; /* OUT */
151 1.2.10.2 rmind
152 1.2.10.2 rmind struct vattr50 pvnr_va; /* OUT */
153 1.2.10.2 rmind puffs_cookie_t pvnr_newnode; /* IN */
154 1.2.10.2 rmind char pvnr_link[MAXPATHLEN]; /* OUT */
155 1.2.10.2 rmind };
156 1.2.10.2 rmind
157 1.2.10.2 rmind /*
158 1.2.10.2 rmind * vattr translation routines
159 1.2.10.2 rmind */
160 1.2.10.2 rmind
161 1.2.10.2 rmind static void
162 1.2.10.2 rmind vattr_to_50(const struct vattr *va, struct vattr50 *va50)
163 1.2.10.2 rmind {
164 1.2.10.2 rmind
165 1.2.10.2 rmind va50->va_type = va->va_type;
166 1.2.10.2 rmind va50->va_mode = va->va_mode;
167 1.2.10.2 rmind va50->va_nlink = va->va_nlink;
168 1.2.10.2 rmind va50->va_uid = va->va_uid;
169 1.2.10.2 rmind va50->va_gid = va->va_gid;
170 1.2.10.2 rmind va50->va_fsid = (uint64_t)va->va_fsid;
171 1.2.10.2 rmind va50->va_fileid = va->va_fileid;
172 1.2.10.2 rmind va50->va_size = va->va_size;
173 1.2.10.2 rmind va50->va_blocksize = va->va_blocksize;
174 1.2.10.2 rmind timespec_to_timespec50(&va->va_atime, &va50->va_atime);
175 1.2.10.2 rmind timespec_to_timespec50(&va->va_ctime, &va50->va_ctime);
176 1.2.10.2 rmind timespec_to_timespec50(&va->va_mtime, &va50->va_mtime);
177 1.2.10.2 rmind timespec_to_timespec50(&va->va_birthtime, &va50->va_birthtime);
178 1.2.10.2 rmind va50->va_gen = va->va_gen;
179 1.2.10.2 rmind va50->va_flags = va->va_flags;
180 1.2.10.2 rmind va50->va_rdev = (int32_t)va->va_rdev;
181 1.2.10.2 rmind va50->va_bytes = va->va_bytes;
182 1.2.10.2 rmind va50->va_filerev = va->va_filerev;
183 1.2.10.2 rmind va50->va_vaflags = va->va_flags;
184 1.2.10.2 rmind }
185 1.2.10.2 rmind
186 1.2.10.2 rmind static void
187 1.2.10.2 rmind vattr_from_50(const struct vattr50 *va50, struct vattr *va)
188 1.2.10.2 rmind {
189 1.2.10.2 rmind
190 1.2.10.2 rmind va->va_type = va50->va_type;
191 1.2.10.2 rmind va->va_mode = va50->va_mode;
192 1.2.10.2 rmind va->va_nlink = va50->va_nlink;
193 1.2.10.2 rmind va->va_uid = va50->va_uid;
194 1.2.10.2 rmind va->va_gid = va50->va_gid;
195 1.2.10.2 rmind va->va_fsid = (uint32_t)va50->va_fsid;
196 1.2.10.2 rmind va->va_fileid = va50->va_fileid;
197 1.2.10.2 rmind va->va_size = va50->va_size;
198 1.2.10.2 rmind va->va_blocksize = va50->va_blocksize;
199 1.2.10.2 rmind timespec50_to_timespec(&va50->va_atime, &va->va_atime);
200 1.2.10.2 rmind timespec50_to_timespec(&va50->va_ctime, &va->va_ctime);
201 1.2.10.2 rmind timespec50_to_timespec(&va50->va_mtime, &va->va_mtime);
202 1.2.10.2 rmind timespec50_to_timespec(&va50->va_birthtime, &va->va_birthtime);
203 1.2.10.2 rmind va->va_gen = va50->va_gen;
204 1.2.10.2 rmind va->va_flags = va50->va_flags;
205 1.2.10.2 rmind va->va_rdev = (uint32_t)va50->va_rdev;
206 1.2.10.2 rmind va->va_bytes = va50->va_bytes;
207 1.2.10.2 rmind va->va_filerev = va50->va_filerev;
208 1.2.10.2 rmind va->va_vaflags = va50->va_flags;
209 1.2.10.2 rmind }
210 1.2.10.2 rmind
211 1.2.10.2 rmind /*
212 1.2.10.2 rmind * XXX: cannot assert that sleeping is possible
213 1.2.10.2 rmind * (this always a valid assumption for now)
214 1.2.10.2 rmind */
215 1.2.10.2 rmind #define INIT(name, extra) \
216 1.2.10.2 rmind struct puffs50_##name *cmsg; \
217 1.2.10.2 rmind struct puffs_##name *omsg; \
218 1.2.10.2 rmind creq =kmem_zalloc(sizeof(struct puffs50_##name)+extra,KM_SLEEP);\
219 1.2.10.2 rmind cmsg = (struct puffs50_##name *)creq; \
220 1.2.10.2 rmind omsg = (struct puffs_##name *)oreq; \
221 1.2.10.2 rmind delta = sizeof(struct puffs50_##name)-sizeof(struct puffs_##name);
222 1.2.10.2 rmind #define ASSIGN(field) \
223 1.2.10.2 rmind cmsg->field = omsg->field;
224 1.2.10.2 rmind
225 1.2.10.2 rmind bool
226 1.2.10.2 rmind puffs_compat_outgoing(struct puffs_req *oreq,
227 1.2.10.2 rmind struct puffs_req **creqp, ssize_t *deltap)
228 1.2.10.2 rmind {
229 1.2.10.2 rmind struct puffs_req *creq = NULL;
230 1.2.10.2 rmind ssize_t delta = 0;
231 1.2.10.2 rmind bool rv = false;
232 1.2.10.2 rmind
233 1.2.10.2 rmind if (PUFFSOP_OPCLASS(oreq->preq_opclass) == PUFFSOP_VFS
234 1.2.10.2 rmind && oreq->preq_optype == PUFFS_VFS_FHTOVP) {
235 1.2.10.2 rmind INIT(vfsmsg_fhtonode,
236 1.2.10.2 rmind ((struct puffs_vfsmsg_fhtonode *)oreq)->pvfsr_dsize);
237 1.2.10.2 rmind
238 1.2.10.2 rmind ASSIGN(pvfsr_pr);
239 1.2.10.2 rmind ASSIGN(pvfsr_dsize);
240 1.2.10.2 rmind memcpy(cmsg->pvfsr_data, omsg->pvfsr_data, cmsg->pvfsr_dsize);
241 1.2.10.2 rmind } else if (PUFFSOP_OPCLASS(oreq->preq_opclass) == PUFFSOP_VN) {
242 1.2.10.2 rmind switch (oreq->preq_optype) {
243 1.2.10.2 rmind case PUFFS_VN_LOOKUP:
244 1.2.10.2 rmind {
245 1.2.10.2 rmind INIT(vnmsg_lookup, 0);
246 1.2.10.2 rmind
247 1.2.10.2 rmind ASSIGN(pvn_pr);
248 1.2.10.2 rmind ASSIGN(pvnr_cn);
249 1.2.10.2 rmind ASSIGN(pvnr_cn_cred);
250 1.2.10.2 rmind
251 1.2.10.2 rmind break;
252 1.2.10.2 rmind }
253 1.2.10.2 rmind
254 1.2.10.2 rmind case PUFFS_VN_CREATE:
255 1.2.10.2 rmind {
256 1.2.10.2 rmind INIT(vnmsg_create, 0);
257 1.2.10.2 rmind
258 1.2.10.2 rmind ASSIGN(pvn_pr);
259 1.2.10.2 rmind ASSIGN(pvnr_cn);
260 1.2.10.2 rmind ASSIGN(pvnr_cn_cred);
261 1.2.10.2 rmind vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
262 1.2.10.2 rmind
263 1.2.10.2 rmind break;
264 1.2.10.2 rmind }
265 1.2.10.2 rmind
266 1.2.10.2 rmind case PUFFS_VN_MKNOD:
267 1.2.10.2 rmind {
268 1.2.10.2 rmind INIT(vnmsg_mknod, 0);
269 1.2.10.2 rmind
270 1.2.10.2 rmind ASSIGN(pvn_pr);
271 1.2.10.2 rmind ASSIGN(pvnr_cn);
272 1.2.10.2 rmind ASSIGN(pvnr_cn_cred);
273 1.2.10.2 rmind vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
274 1.2.10.2 rmind
275 1.2.10.2 rmind break;
276 1.2.10.2 rmind }
277 1.2.10.2 rmind
278 1.2.10.2 rmind case PUFFS_VN_MKDIR:
279 1.2.10.2 rmind {
280 1.2.10.2 rmind INIT(vnmsg_mkdir, 0);
281 1.2.10.2 rmind
282 1.2.10.2 rmind ASSIGN(pvn_pr);
283 1.2.10.2 rmind ASSIGN(pvnr_cn);
284 1.2.10.2 rmind ASSIGN(pvnr_cn_cred);
285 1.2.10.2 rmind vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
286 1.2.10.2 rmind
287 1.2.10.2 rmind break;
288 1.2.10.2 rmind }
289 1.2.10.2 rmind
290 1.2.10.2 rmind case PUFFS_VN_SYMLINK:
291 1.2.10.2 rmind {
292 1.2.10.2 rmind INIT(vnmsg_symlink, 0);
293 1.2.10.2 rmind
294 1.2.10.2 rmind ASSIGN(pvn_pr);
295 1.2.10.2 rmind ASSIGN(pvnr_cn);
296 1.2.10.2 rmind ASSIGN(pvnr_cn_cred);
297 1.2.10.2 rmind vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
298 1.2.10.2 rmind memcpy(cmsg->pvnr_link, omsg->pvnr_link,
299 1.2.10.2 rmind sizeof(cmsg->pvnr_link));
300 1.2.10.2 rmind
301 1.2.10.2 rmind break;
302 1.2.10.2 rmind }
303 1.2.10.2 rmind
304 1.2.10.2 rmind case PUFFS_VN_SETATTR:
305 1.2.10.2 rmind {
306 1.2.10.2 rmind INIT(vnmsg_setattr, 0);
307 1.2.10.2 rmind
308 1.2.10.2 rmind ASSIGN(pvn_pr);
309 1.2.10.2 rmind ASSIGN(pvnr_cred);
310 1.2.10.2 rmind vattr_to_50(&omsg->pvnr_va, &cmsg->pvnr_va);
311 1.2.10.2 rmind
312 1.2.10.2 rmind break;
313 1.2.10.2 rmind }
314 1.2.10.2 rmind case PUFFS_VN_GETATTR:
315 1.2.10.2 rmind {
316 1.2.10.2 rmind INIT(vnmsg_getattr, 0);
317 1.2.10.2 rmind
318 1.2.10.2 rmind ASSIGN(pvn_pr);
319 1.2.10.2 rmind ASSIGN(pvnr_cred);
320 1.2.10.2 rmind
321 1.2.10.2 rmind break;
322 1.2.10.2 rmind }
323 1.2.10.2 rmind
324 1.2.10.2 rmind default:
325 1.2.10.2 rmind break;
326 1.2.10.2 rmind }
327 1.2.10.2 rmind }
328 1.2.10.2 rmind
329 1.2.10.2 rmind if (creq) {
330 1.2.10.2 rmind *creqp = creq;
331 1.2.10.2 rmind *deltap = delta;
332 1.2.10.2 rmind rv = true;
333 1.2.10.2 rmind }
334 1.2.10.2 rmind
335 1.2.10.2 rmind return rv;
336 1.2.10.2 rmind }
337 1.2.10.2 rmind #undef INIT
338 1.2.10.2 rmind #undef ASSIGN
339 1.2.10.2 rmind
340 1.2.10.2 rmind #define INIT(name) \
341 1.2.10.2 rmind struct puffs50_##name *cmsg = (void *)preq; \
342 1.2.10.2 rmind struct puffs_##name *omsg = (void *)creq;
343 1.2.10.2 rmind #define ASSIGN(field) \
344 1.2.10.2 rmind omsg->field = cmsg->field;
345 1.2.10.2 rmind
346 1.2.10.2 rmind void
347 1.2.10.2 rmind puffs_compat_incoming(struct puffs_req *preq, struct puffs_req *creq)
348 1.2.10.2 rmind {
349 1.2.10.2 rmind
350 1.2.10.2 rmind if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VFS
351 1.2.10.2 rmind && preq->preq_optype == PUFFS_VFS_FHTOVP) {
352 1.2.10.2 rmind INIT(vfsmsg_fhtonode);
353 1.2.10.2 rmind
354 1.2.10.2 rmind ASSIGN(pvfsr_pr);
355 1.2.10.2 rmind
356 1.2.10.2 rmind ASSIGN(pvfsr_fhcookie);
357 1.2.10.2 rmind ASSIGN(pvfsr_vtype);
358 1.2.10.2 rmind ASSIGN(pvfsr_size);
359 1.2.10.2 rmind ASSIGN(pvfsr_rdev);
360 1.2.10.2 rmind } else if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN) {
361 1.2.10.2 rmind switch (preq->preq_optype) {
362 1.2.10.2 rmind case PUFFS_VN_LOOKUP:
363 1.2.10.2 rmind {
364 1.2.10.2 rmind INIT(vnmsg_lookup);
365 1.2.10.2 rmind
366 1.2.10.2 rmind ASSIGN(pvn_pr);
367 1.2.10.2 rmind ASSIGN(pvnr_newnode);
368 1.2.10.2 rmind ASSIGN(pvnr_vtype);
369 1.2.10.2 rmind ASSIGN(pvnr_size);
370 1.2.10.2 rmind ASSIGN(pvnr_rdev);
371 1.2.10.2 rmind
372 1.2.10.2 rmind break;
373 1.2.10.2 rmind }
374 1.2.10.2 rmind
375 1.2.10.2 rmind case PUFFS_VN_CREATE:
376 1.2.10.2 rmind {
377 1.2.10.2 rmind INIT(vnmsg_create);
378 1.2.10.2 rmind
379 1.2.10.2 rmind ASSIGN(pvn_pr);
380 1.2.10.2 rmind ASSIGN(pvnr_newnode);
381 1.2.10.2 rmind
382 1.2.10.2 rmind break;
383 1.2.10.2 rmind }
384 1.2.10.2 rmind
385 1.2.10.2 rmind case PUFFS_VN_MKNOD:
386 1.2.10.2 rmind {
387 1.2.10.2 rmind INIT(vnmsg_mknod);
388 1.2.10.2 rmind
389 1.2.10.2 rmind ASSIGN(pvn_pr);
390 1.2.10.2 rmind ASSIGN(pvnr_newnode);
391 1.2.10.2 rmind
392 1.2.10.2 rmind break;
393 1.2.10.2 rmind }
394 1.2.10.2 rmind
395 1.2.10.2 rmind case PUFFS_VN_MKDIR:
396 1.2.10.2 rmind {
397 1.2.10.2 rmind INIT(vnmsg_mkdir);
398 1.2.10.2 rmind
399 1.2.10.2 rmind ASSIGN(pvn_pr);
400 1.2.10.2 rmind ASSIGN(pvnr_newnode);
401 1.2.10.2 rmind
402 1.2.10.2 rmind break;
403 1.2.10.2 rmind }
404 1.2.10.2 rmind
405 1.2.10.2 rmind case PUFFS_VN_SYMLINK:
406 1.2.10.2 rmind {
407 1.2.10.2 rmind INIT(vnmsg_symlink);
408 1.2.10.2 rmind
409 1.2.10.2 rmind ASSIGN(pvn_pr);
410 1.2.10.2 rmind ASSIGN(pvnr_newnode);
411 1.2.10.2 rmind
412 1.2.10.2 rmind break;
413 1.2.10.2 rmind }
414 1.2.10.2 rmind
415 1.2.10.2 rmind case PUFFS_VN_SETATTR:
416 1.2.10.2 rmind {
417 1.2.10.2 rmind INIT(vnmsg_setattr);
418 1.2.10.2 rmind
419 1.2.10.2 rmind ASSIGN(pvn_pr);
420 1.2.10.2 rmind
421 1.2.10.2 rmind break;
422 1.2.10.2 rmind }
423 1.2.10.2 rmind case PUFFS_VN_GETATTR:
424 1.2.10.2 rmind {
425 1.2.10.2 rmind INIT(vnmsg_getattr);
426 1.2.10.2 rmind
427 1.2.10.2 rmind ASSIGN(pvn_pr);
428 1.2.10.2 rmind vattr_from_50(&cmsg->pvnr_va, &omsg->pvnr_va);
429 1.2.10.2 rmind
430 1.2.10.2 rmind break;
431 1.2.10.2 rmind }
432 1.2.10.2 rmind
433 1.2.10.2 rmind default:
434 1.2.10.2 rmind panic("puffs compat ops come in pairs");
435 1.2.10.2 rmind }
436 1.2.10.2 rmind }
437 1.2.10.2 rmind }
438