Commit | Line | Data |
---|---|---|
2d3e977e MD |
1 | /* |
2 | * Copyright (c) 2004 The DragonFly Project. All rights reserved. | |
eaa61c9d | 3 | * |
2d3e977e MD |
4 | * This code is derived from software contributed to The DragonFly Project |
5 | * by Matthew Dillon <dillon@backplane.com> | |
eaa61c9d | 6 | * |
2d3e977e MD |
7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions | |
9 | * are met: | |
eaa61c9d | 10 | * |
2d3e977e MD |
11 | * 1. Redistributions of source code must retain the above copyright |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * 2. Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in | |
15 | * the documentation and/or other materials provided with the | |
16 | * distribution. | |
17 | * 3. Neither the name of The DragonFly Project nor the names of its | |
18 | * contributors may be used to endorse or promote products derived | |
19 | * from this software without specific, prior written permission. | |
eaa61c9d | 20 | * |
2d3e977e MD |
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
22 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
24 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
25 | * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
26 | * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
27 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
28 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | |
29 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
30 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |
31 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
32 | * SUCH DAMAGE. | |
2d3e977e MD |
33 | */ |
34 | ||
35 | /* | |
0961aa92 | 36 | * The vop_ops structure vectors all access to a filesystem. It contains a |
66a1ddf5 | 37 | * fixed set of vectors. |
2d3e977e MD |
38 | * |
39 | * In DragonFly the ultimate goal is to thread the VFS, which means that | |
eaa61c9d | 40 | * the dispatch functions will eventually be called from the context of |
2d3e977e MD |
41 | * a management thread rather then directly called by a process. This |
42 | * requires us to divorce direct process dependancies (in particular ioctl | |
43 | * and UIO's). In addition, it is our intention to implement kernel | |
44 | * level cache management and coherency in the vop_*() interfacing | |
45 | * layer. | |
46 | * | |
47 | * The number of management threads will depend on the VFS. The idea is | |
48 | * to give a high performance VFS such as UFS at least one thread per cpu, | |
49 | * and a low performance VFS such as CD9660 perhaps just one thread period. | |
50 | * Blocking issues within the management thread are up to the VFS itself, | |
51 | * but DragonFly will introduce a layer above the VFS to handle cacheable | |
52 | * requests without having to enter the VFS (e.g. by making attribute | |
53 | * and VM object information a permanent fixture of the vnode structure | |
54 | * and accessing them directly). | |
55 | * | |
56 | * THE VOPOPS VECTORS SHOULD NEVER BE CALLED DIRECTLY! Instead always use | |
57 | * the kernel helper procedures vop_*() to call a vopop. The kernel | |
58 | * helper procedure will be responsible for handling the DragonFly messaging | |
59 | * conversion when it occurs. | |
60 | */ | |
61 | ||
0961aa92 MD |
62 | #ifndef _SYS_VFSOPS_H_ |
63 | #define _SYS_VFSOPS_H_ | |
64 | ||
c672274b | 65 | #ifdef _KERNEL |
0961aa92 MD |
66 | #ifndef _SYS_ACL_H_ |
67 | #include <sys/acl.h> | |
68 | #endif | |
e92ca23a MD |
69 | #ifndef _SYS_BUF_H_ |
70 | #include <sys/buf.h> /* buf_cmd_t */ | |
71 | #endif | |
cb66845a MD |
72 | #ifndef _SYS_FCNTL_H_ |
73 | #include <sys/fcntl.h> /* AT_EACCESS */ | |
74 | #endif | |
2d3e977e | 75 | |
fef8985e | 76 | struct syslink_desc; |
2d3e977e MD |
77 | struct vnode; |
78 | struct thread; | |
28623bf9 | 79 | struct nchandle; |
2d3e977e MD |
80 | struct componentname; |
81 | struct vattr; | |
82 | struct ucred; | |
83 | struct uio; | |
fad57d0e | 84 | struct file; |
2d3e977e MD |
85 | struct knote; |
86 | struct vm_object; | |
87 | struct vm_page; | |
0961aa92 | 88 | struct vfscache; |
2d3e977e MD |
89 | |
90 | struct vop_generic_args { | |
31bd717a | 91 | struct syslink_desc *a_desc; /* command descriptor for the call */ |
cbe54d63 MD |
92 | struct vop_ops *a_ops; /* operations vector for the call */ |
93 | int a_reserved[4]; | |
2d3e977e MD |
94 | }; |
95 | ||
e62afb5f | 96 | struct vop_old_lookup_args { |
2d3e977e MD |
97 | struct vop_generic_args a_head; |
98 | struct vnode *a_dvp; | |
2d3e977e | 99 | struct vnode **a_vpp; |
2d3e977e MD |
100 | struct componentname *a_cnp; |
101 | }; | |
102 | ||
e62afb5f | 103 | struct vop_old_create_args { |
2d3e977e MD |
104 | struct vop_generic_args a_head; |
105 | struct vnode *a_dvp; | |
2d3e977e MD |
106 | struct vnode **a_vpp; |
107 | struct componentname *a_cnp; | |
108 | struct vattr *a_vap; | |
109 | }; | |
110 | ||
e62afb5f | 111 | struct vop_old_whiteout_args { |
2d3e977e MD |
112 | struct vop_generic_args a_head; |
113 | struct vnode *a_dvp; | |
2d3e977e MD |
114 | struct componentname *a_cnp; |
115 | int a_flags; | |
116 | }; | |
117 | ||
e62afb5f | 118 | struct vop_old_mknod_args { |
2d3e977e MD |
119 | struct vop_generic_args a_head; |
120 | struct vnode *a_dvp; | |
2d3e977e MD |
121 | struct vnode **a_vpp; |
122 | struct componentname *a_cnp; | |
123 | struct vattr *a_vap; | |
124 | }; | |
125 | ||
126 | struct vop_open_args { | |
127 | struct vop_generic_args a_head; | |
128 | struct vnode *a_vp; | |
129 | int a_mode; | |
130 | struct ucred *a_cred; | |
5bd45597 | 131 | struct file **a_fpp; /* optional *fpp for fileops override */ |
2d3e977e MD |
132 | }; |
133 | ||
134 | struct vop_close_args { | |
135 | struct vop_generic_args a_head; | |
136 | struct vnode *a_vp; | |
137 | int a_fflag; | |
ce486e08 | 138 | struct file *a_fp; /* optional fp for fileops override */ |
2d3e977e MD |
139 | }; |
140 | ||
141 | struct vop_access_args { | |
142 | struct vop_generic_args a_head; | |
143 | struct vnode *a_vp; | |
b2aed953 NT |
144 | int a_mode; /* V* bitmask */ |
145 | int a_flags; /* AT_* bitmask */ | |
2d3e977e | 146 | struct ucred *a_cred; |
2d3e977e MD |
147 | }; |
148 | ||
149 | struct vop_getattr_args { | |
150 | struct vop_generic_args a_head; | |
151 | struct vnode *a_vp; | |
152 | struct vattr *a_vap; | |
2dfa19fa | 153 | struct file *a_fp; /* FUSE */ |
2d3e977e MD |
154 | }; |
155 | ||
de9bb133 MD |
156 | struct vop_getattr_lite_args { |
157 | struct vop_generic_args a_head; | |
158 | struct vnode *a_vp; | |
159 | struct vattr_lite *a_lvap; | |
160 | struct file *a_fp; /* FUSE */ | |
161 | }; | |
162 | ||
2d3e977e MD |
163 | struct vop_setattr_args { |
164 | struct vop_generic_args a_head; | |
165 | struct vnode *a_vp; | |
166 | struct vattr *a_vap; | |
167 | struct ucred *a_cred; | |
2dfa19fa | 168 | struct file *a_fp; /* FUSE */ |
2d3e977e MD |
169 | }; |
170 | ||
171 | struct vop_read_args { | |
172 | struct vop_generic_args a_head; | |
173 | struct vnode *a_vp; | |
174 | struct uio *a_uio; | |
175 | int a_ioflag; | |
176 | struct ucred *a_cred; | |
2dfa19fa | 177 | struct file *a_fp; /* FUSE */ |
2d3e977e MD |
178 | }; |
179 | ||
180 | struct vop_write_args { | |
181 | struct vop_generic_args a_head; | |
182 | struct vnode *a_vp; | |
183 | struct uio *a_uio; | |
184 | int a_ioflag; | |
185 | struct ucred *a_cred; | |
2dfa19fa | 186 | struct file *a_fp; /* FUSE */ |
2d3e977e MD |
187 | }; |
188 | ||
2d3e977e MD |
189 | struct vop_ioctl_args { |
190 | struct vop_generic_args a_head; | |
191 | struct vnode *a_vp; | |
192 | u_long a_command; | |
193 | caddr_t a_data; | |
194 | int a_fflag; | |
195 | struct ucred *a_cred; | |
87baaf0c | 196 | struct sysmsg *a_sysmsg; |
2d3e977e MD |
197 | }; |
198 | ||
199 | struct vop_poll_args { | |
200 | struct vop_generic_args a_head; | |
201 | struct vnode *a_vp; | |
202 | int a_events; | |
203 | struct ucred *a_cred; | |
2d3e977e MD |
204 | }; |
205 | ||
206 | struct vop_kqfilter_args { | |
207 | struct vop_generic_args a_head; | |
208 | struct vnode *a_vp; | |
209 | struct knote *a_kn; | |
210 | }; | |
211 | ||
2d3e977e MD |
212 | struct vop_mmap_args { |
213 | struct vop_generic_args a_head; | |
214 | struct vnode *a_vp; | |
215 | int a_fflags; | |
216 | struct ucred *a_cred; | |
2d3e977e MD |
217 | }; |
218 | ||
219 | struct vop_fsync_args { | |
220 | struct vop_generic_args a_head; | |
221 | struct vnode *a_vp; | |
222 | int a_waitfor; | |
52174f71 | 223 | int a_flags; |
2dfa19fa | 224 | struct file *a_fp; /* FUSE */ |
2d3e977e MD |
225 | }; |
226 | ||
74fa2560 TK |
227 | struct vop_fdatasync_args { |
228 | struct vop_generic_args a_head; | |
229 | struct vnode *a_vp; | |
230 | int a_waitfor; | |
231 | int a_flags; | |
232 | struct file *a_fp; /* FUSE */ | |
233 | }; | |
234 | ||
e62afb5f | 235 | struct vop_old_remove_args { |
2d3e977e MD |
236 | struct vop_generic_args a_head; |
237 | struct vnode *a_dvp; | |
2d3e977e MD |
238 | struct vnode *a_vp; |
239 | struct componentname *a_cnp; | |
240 | }; | |
241 | ||
e62afb5f | 242 | struct vop_old_link_args { |
2d3e977e MD |
243 | struct vop_generic_args a_head; |
244 | struct vnode *a_tdvp; | |
2d3e977e MD |
245 | struct vnode *a_vp; |
246 | struct componentname *a_cnp; | |
247 | }; | |
248 | ||
e62afb5f | 249 | struct vop_old_rename_args { |
2d3e977e MD |
250 | struct vop_generic_args a_head; |
251 | struct vnode *a_fdvp; | |
2d3e977e MD |
252 | struct vnode *a_fvp; |
253 | struct componentname *a_fcnp; | |
254 | struct vnode *a_tdvp; | |
2d3e977e MD |
255 | struct vnode *a_tvp; |
256 | struct componentname *a_tcnp; | |
257 | }; | |
258 | ||
e62afb5f | 259 | struct vop_old_mkdir_args { |
2d3e977e MD |
260 | struct vop_generic_args a_head; |
261 | struct vnode *a_dvp; | |
2d3e977e MD |
262 | struct vnode **a_vpp; |
263 | struct componentname *a_cnp; | |
264 | struct vattr *a_vap; | |
265 | }; | |
266 | ||
e62afb5f | 267 | struct vop_old_rmdir_args { |
2d3e977e MD |
268 | struct vop_generic_args a_head; |
269 | struct vnode *a_dvp; | |
2d3e977e MD |
270 | struct vnode *a_vp; |
271 | struct componentname *a_cnp; | |
272 | }; | |
273 | ||
e62afb5f | 274 | struct vop_old_symlink_args { |
2d3e977e MD |
275 | struct vop_generic_args a_head; |
276 | struct vnode *a_dvp; | |
2d3e977e MD |
277 | struct vnode **a_vpp; |
278 | struct componentname *a_cnp; | |
279 | struct vattr *a_vap; | |
280 | char *a_target; | |
281 | }; | |
282 | ||
283 | struct vop_readdir_args { | |
284 | struct vop_generic_args a_head; | |
285 | struct vnode *a_vp; | |
286 | struct uio *a_uio; | |
287 | struct ucred *a_cred; | |
288 | int *a_eofflag; | |
289 | int *a_ncookies; | |
84009d92 | 290 | off_t **a_cookies; |
2dfa19fa | 291 | struct file *a_fp; /* FUSE */ |
2d3e977e MD |
292 | }; |
293 | ||
294 | struct vop_readlink_args { | |
295 | struct vop_generic_args a_head; | |
296 | struct vnode *a_vp; | |
297 | struct uio *a_uio; | |
298 | struct ucred *a_cred; | |
299 | }; | |
300 | ||
301 | struct vop_inactive_args { | |
302 | struct vop_generic_args a_head; | |
303 | struct vnode *a_vp; | |
2d3e977e MD |
304 | }; |
305 | ||
306 | struct vop_reclaim_args { | |
307 | struct vop_generic_args a_head; | |
308 | struct vnode *a_vp; | |
2d3e977e MD |
309 | }; |
310 | ||
2d3e977e MD |
311 | struct vop_bmap_args { |
312 | struct vop_generic_args a_head; | |
313 | struct vnode *a_vp; | |
54078292 | 314 | off_t a_loffset; |
54078292 | 315 | off_t *a_doffsetp; |
2d3e977e MD |
316 | int *a_runp; |
317 | int *a_runb; | |
e92ca23a | 318 | buf_cmd_t a_cmd; /* BUF_CMD_READ, BUF_CMD_WRITE, etc */ |
2d3e977e MD |
319 | }; |
320 | ||
321 | struct vop_strategy_args { | |
322 | struct vop_generic_args a_head; | |
323 | struct vnode *a_vp; | |
81b5c339 | 324 | struct bio *a_bio; |
2d3e977e MD |
325 | }; |
326 | ||
327 | struct vop_print_args { | |
328 | struct vop_generic_args a_head; | |
329 | struct vnode *a_vp; | |
330 | }; | |
331 | ||
332 | struct vop_pathconf_args { | |
333 | struct vop_generic_args a_head; | |
334 | struct vnode *a_vp; | |
335 | int a_name; | |
336 | register_t *a_retval; | |
337 | }; | |
338 | ||
339 | struct vop_advlock_args { | |
340 | struct vop_generic_args a_head; | |
341 | struct vnode *a_vp; | |
342 | caddr_t a_id; | |
343 | int a_op; | |
344 | struct flock *a_fl; | |
345 | int a_flags; | |
346 | }; | |
347 | ||
348 | struct vop_balloc_args { | |
349 | struct vop_generic_args a_head; | |
350 | struct vnode *a_vp; | |
351 | off_t a_startoffset; | |
352 | int a_size; | |
353 | struct ucred *a_cred; | |
354 | int a_flags; | |
355 | struct buf **a_bpp; | |
356 | }; | |
357 | ||
358 | struct vop_reallocblks_args { | |
359 | struct vop_generic_args a_head; | |
360 | struct vnode *a_vp; | |
361 | struct cluster_save *a_buflist; | |
362 | }; | |
363 | ||
364 | struct vop_getpages_args { | |
365 | struct vop_generic_args a_head; | |
366 | struct vnode *a_vp; | |
367 | struct vm_page **a_m; | |
368 | int a_count; | |
369 | int a_reqpage; | |
370 | vm_ooffset_t a_offset; | |
1c48c952 | 371 | int a_seqaccess; |
2d3e977e MD |
372 | }; |
373 | ||
374 | struct vop_putpages_args { | |
375 | struct vop_generic_args a_head; | |
376 | struct vnode *a_vp; | |
377 | struct vm_page **a_m; | |
378 | int a_count; | |
df0b0ead | 379 | int a_flags; |
2d3e977e MD |
380 | int *a_rtvals; |
381 | vm_ooffset_t a_offset; | |
382 | }; | |
383 | ||
384 | struct vop_freeblks_args { | |
385 | struct vop_generic_args a_head; | |
386 | struct vnode *a_vp; | |
54078292 MD |
387 | off_t a_offset; |
388 | int a_length; | |
2d3e977e MD |
389 | }; |
390 | ||
2d3e977e MD |
391 | struct vop_getacl_args { |
392 | struct vop_generic_args a_head; | |
393 | struct vnode *a_vp; | |
394 | acl_type_t a_type; | |
395 | struct acl *a_aclp; | |
396 | struct ucred *a_cred; | |
2d3e977e MD |
397 | }; |
398 | ||
399 | struct vop_setacl_args { | |
400 | struct vop_generic_args a_head; | |
401 | struct vnode *a_vp; | |
402 | acl_type_t a_type; | |
403 | struct acl *a_aclp; | |
404 | struct ucred *a_cred; | |
2d3e977e MD |
405 | }; |
406 | ||
407 | struct vop_aclcheck_args { | |
408 | struct vop_generic_args a_head; | |
409 | struct vnode *a_vp; | |
410 | acl_type_t a_type; | |
411 | struct acl *a_aclp; | |
412 | struct ucred *a_cred; | |
2d3e977e MD |
413 | }; |
414 | ||
415 | struct vop_getextattr_args { | |
416 | struct vop_generic_args a_head; | |
417 | struct vnode *a_vp; | |
0f6997f9 MD |
418 | int a_attrnamespace; |
419 | char *a_attrname; | |
2d3e977e MD |
420 | struct uio *a_uio; |
421 | struct ucred *a_cred; | |
2d3e977e MD |
422 | }; |
423 | ||
424 | struct vop_setextattr_args { | |
425 | struct vop_generic_args a_head; | |
426 | struct vnode *a_vp; | |
0f6997f9 MD |
427 | int a_attrnamespace; |
428 | char *a_attrname; | |
2d3e977e MD |
429 | struct uio *a_uio; |
430 | struct ucred *a_cred; | |
2d3e977e MD |
431 | }; |
432 | ||
949ecb9b | 433 | struct vop_mountctl_args { |
cbe54d63 MD |
434 | struct vop_generic_args a_head; |
435 | int a_op; | |
2281065e | 436 | struct file *a_fp; |
949ecb9b MD |
437 | const void *a_ctl; |
438 | int a_ctllen; | |
439 | void *a_buf; | |
440 | int a_buflen; | |
441 | int *a_res; | |
aac0aabd | 442 | struct vnode *a_vp; |
cbe54d63 MD |
443 | }; |
444 | ||
349433c9 MD |
445 | struct vop_markatime_args { |
446 | struct vop_generic_args a_head; | |
447 | int a_op; | |
448 | struct vnode *a_vp; | |
449 | struct ucred *a_cred; | |
450 | }; | |
451 | ||
09d96b9c TK |
452 | struct vop_allocate_args { |
453 | struct vop_generic_args a_head; | |
454 | int a_op; | |
455 | struct vnode *a_vp; | |
456 | off_t a_offset; | |
457 | off_t a_len; | |
458 | }; | |
459 | ||
fad57d0e MD |
460 | /* |
461 | * NEW API | |
462 | */ | |
dff430ab MD |
463 | |
464 | /* | |
465 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
466 | * it. | |
467 | */ | |
fad57d0e MD |
468 | struct vop_nresolve_args { |
469 | struct vop_generic_args a_head; | |
28623bf9 | 470 | struct nchandle *a_nch; |
dff430ab | 471 | struct vnode *a_dvp; |
fad57d0e MD |
472 | struct ucred *a_cred; |
473 | }; | |
474 | ||
475 | struct vop_nlookupdotdot_args { | |
476 | struct vop_generic_args a_head; | |
477 | struct vnode *a_dvp; | |
478 | struct vnode **a_vpp; | |
479 | struct ucred *a_cred; | |
33387738 | 480 | char **a_fakename; |
fad57d0e MD |
481 | }; |
482 | ||
dff430ab MD |
483 | /* |
484 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
485 | * it. | |
486 | */ | |
fad57d0e MD |
487 | struct vop_ncreate_args { |
488 | struct vop_generic_args a_head; | |
28623bf9 | 489 | struct nchandle *a_nch; /* locked namespace */ |
dff430ab MD |
490 | struct vnode *a_dvp; /* held directory vnode */ |
491 | struct vnode **a_vpp; /* returned refd & locked */ | |
fad57d0e MD |
492 | struct ucred *a_cred; |
493 | struct vattr *a_vap; | |
494 | }; | |
495 | ||
dff430ab MD |
496 | /* |
497 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
498 | * it. | |
499 | */ | |
fad57d0e MD |
500 | struct vop_nmkdir_args { |
501 | struct vop_generic_args a_head; | |
28623bf9 | 502 | struct nchandle *a_nch; /* locked namespace */ |
dff430ab | 503 | struct vnode *a_dvp; |
fad57d0e MD |
504 | struct vnode **a_vpp; /* returned refd & locked */ |
505 | struct ucred *a_cred; | |
506 | struct vattr *a_vap; | |
507 | }; | |
508 | ||
dff430ab MD |
509 | /* |
510 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
511 | * it. | |
512 | */ | |
fad57d0e MD |
513 | struct vop_nmknod_args { |
514 | struct vop_generic_args a_head; | |
28623bf9 | 515 | struct nchandle *a_nch; |
dff430ab | 516 | struct vnode *a_dvp; |
fad57d0e MD |
517 | struct vnode **a_vpp; |
518 | struct ucred *a_cred; | |
519 | struct vattr *a_vap; | |
520 | }; | |
521 | ||
dff430ab MD |
522 | /* |
523 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
524 | * it. | |
525 | */ | |
fad57d0e MD |
526 | struct vop_nlink_args { |
527 | struct vop_generic_args a_head; | |
28623bf9 | 528 | struct nchandle *a_nch; |
dff430ab | 529 | struct vnode *a_dvp; |
fad57d0e MD |
530 | struct vnode *a_vp; |
531 | struct ucred *a_cred; | |
532 | }; | |
533 | ||
dff430ab MD |
534 | /* |
535 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
536 | * it. | |
537 | */ | |
fad57d0e MD |
538 | struct vop_nsymlink_args { |
539 | struct vop_generic_args a_head; | |
28623bf9 | 540 | struct nchandle *a_nch; |
dff430ab | 541 | struct vnode *a_dvp; |
fad57d0e MD |
542 | struct vnode **a_vpp; |
543 | struct ucred *a_cred; | |
544 | struct vattr *a_vap; | |
545 | char *a_target; | |
546 | }; | |
547 | ||
dff430ab MD |
548 | /* |
549 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
550 | * it. | |
551 | */ | |
fad57d0e MD |
552 | struct vop_nwhiteout_args { |
553 | struct vop_generic_args a_head; | |
28623bf9 | 554 | struct nchandle *a_nch; |
dff430ab | 555 | struct vnode *a_dvp; |
fad57d0e MD |
556 | struct ucred *a_cred; |
557 | int a_flags; | |
558 | }; | |
559 | ||
dff430ab MD |
560 | /* |
561 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
562 | * it. | |
563 | */ | |
fad57d0e MD |
564 | struct vop_nremove_args { |
565 | struct vop_generic_args a_head; | |
28623bf9 | 566 | struct nchandle *a_nch; /* locked namespace */ |
dff430ab | 567 | struct vnode *a_dvp; |
fad57d0e MD |
568 | struct ucred *a_cred; |
569 | }; | |
570 | ||
dff430ab MD |
571 | /* |
572 | * Warning: a_dvp is only held, not ref'd. The target must still vget() | |
573 | * it. | |
574 | */ | |
fad57d0e MD |
575 | struct vop_nrmdir_args { |
576 | struct vop_generic_args a_head; | |
28623bf9 | 577 | struct nchandle *a_nch; /* locked namespace */ |
dff430ab | 578 | struct vnode *a_dvp; |
fad57d0e MD |
579 | struct ucred *a_cred; |
580 | }; | |
581 | ||
dff430ab MD |
582 | /* |
583 | * Warning: a_fdvp and a_tdvp are only held, not ref'd. The target must | |
584 | * still vget() it. | |
585 | */ | |
fad57d0e MD |
586 | struct vop_nrename_args { |
587 | struct vop_generic_args a_head; | |
28623bf9 MD |
588 | struct nchandle *a_fnch; /* locked namespace / from */ |
589 | struct nchandle *a_tnch; /* locked namespace / to */ | |
dff430ab MD |
590 | struct vnode *a_fdvp; |
591 | struct vnode *a_tdvp; | |
fad57d0e MD |
592 | struct ucred *a_cred; |
593 | }; | |
594 | ||
2d3e977e | 595 | /* |
0961aa92 MD |
596 | * This structure is the post-compiled VOP operations vector. vop_ops are |
597 | * typically per-mount entities. The first section is used by our vop_*() | |
598 | * function wrappers to implement hooks for per-mount management functions | |
599 | * such as journaling and cache coherency protocols. The second section is | |
600 | * the function dispatch for the VFSs. The functions are supposed to run | |
eaa61c9d | 601 | * in the context of the VFS's thread (if it has one) and should not be |
0961aa92 MD |
602 | * directly called from random kernel code. Note that VOCALL()s are direct |
603 | * calls used for chaining vop_ops structures from a VFS context. | |
2d3e977e MD |
604 | */ |
605 | struct vop_ops { | |
66a1ddf5 MD |
606 | struct { |
607 | struct mount *vv_mount; | |
608 | } head; | |
0961aa92 | 609 | |
2d3e977e MD |
610 | #define vop_ops_first_field vop_default |
611 | int (*vop_default)(struct vop_generic_args *); | |
a11aaa81 | 612 | int (*vop_unused11)(void *); |
e62afb5f | 613 | int (*vop_old_lookup)(struct vop_old_lookup_args *); |
fad57d0e | 614 | int (*vop_unused03)(void *); |
e62afb5f MD |
615 | int (*vop_old_create)(struct vop_old_create_args *); |
616 | int (*vop_old_whiteout)(struct vop_old_whiteout_args *); | |
617 | int (*vop_old_mknod)(struct vop_old_mknod_args *); | |
2d3e977e MD |
618 | int (*vop_open)(struct vop_open_args *); |
619 | int (*vop_close)(struct vop_close_args *); | |
620 | int (*vop_access)(struct vop_access_args *); | |
621 | int (*vop_getattr)(struct vop_getattr_args *); | |
de9bb133 | 622 | int (*vop_getattr_lite)(struct vop_getattr_lite_args *); |
2d3e977e MD |
623 | int (*vop_setattr)(struct vop_setattr_args *); |
624 | int (*vop_read)(struct vop_read_args *); | |
625 | int (*vop_write)(struct vop_write_args *); | |
e07fef60 | 626 | int (*vop_unused04)(void *); |
2d3e977e MD |
627 | int (*vop_ioctl)(struct vop_ioctl_args *); |
628 | int (*vop_poll)(struct vop_poll_args *); | |
629 | int (*vop_kqfilter)(struct vop_kqfilter_args *); | |
b8477cda | 630 | int (*vop_unused01)(void *); /* was vop_revoke */ |
2d3e977e MD |
631 | int (*vop_mmap)(struct vop_mmap_args *); |
632 | int (*vop_fsync)(struct vop_fsync_args *); | |
74fa2560 | 633 | int (*vop_fdatasync)(struct vop_fdatasync_args *); |
e62afb5f MD |
634 | int (*vop_old_remove)(struct vop_old_remove_args *); |
635 | int (*vop_old_link)(struct vop_old_link_args *); | |
636 | int (*vop_old_rename)(struct vop_old_rename_args *); | |
637 | int (*vop_old_mkdir)(struct vop_old_mkdir_args *); | |
638 | int (*vop_old_rmdir)(struct vop_old_rmdir_args *); | |
639 | int (*vop_old_symlink)(struct vop_old_symlink_args *); | |
2d3e977e MD |
640 | int (*vop_readdir)(struct vop_readdir_args *); |
641 | int (*vop_readlink)(struct vop_readlink_args *); | |
642 | int (*vop_inactive)(struct vop_inactive_args *); | |
643 | int (*vop_reclaim)(struct vop_reclaim_args *); | |
a11aaa81 MD |
644 | int (*vop_unused09)(void *); |
645 | int (*vop_unused10)(void *); | |
2d3e977e MD |
646 | int (*vop_bmap)(struct vop_bmap_args *); |
647 | int (*vop_strategy)(struct vop_strategy_args *); | |
648 | int (*vop_print)(struct vop_print_args *); | |
649 | int (*vop_pathconf)(struct vop_pathconf_args *); | |
650 | int (*vop_advlock)(struct vop_advlock_args *); | |
651 | int (*vop_balloc)(struct vop_balloc_args *); | |
652 | int (*vop_reallocblks)(struct vop_reallocblks_args *); | |
653 | int (*vop_getpages)(struct vop_getpages_args *); | |
654 | int (*vop_putpages)(struct vop_putpages_args *); | |
655 | int (*vop_freeblks)(struct vop_freeblks_args *); | |
62cfda27 | 656 | int (*vop_unused05)(void *); |
2d3e977e MD |
657 | int (*vop_getacl)(struct vop_getacl_args *); |
658 | int (*vop_setacl)(struct vop_setacl_args *); | |
659 | int (*vop_aclcheck)(struct vop_aclcheck_args *); | |
660 | int (*vop_getextattr)(struct vop_getextattr_args *); | |
661 | int (*vop_setextattr)(struct vop_setextattr_args *); | |
7540ab49 MD |
662 | int (*vop_unused06)(void *); |
663 | int (*vop_unused07)(void *); | |
62cfda27 | 664 | int (*vop_unused08)(void *); |
949ecb9b | 665 | int (*vop_mountctl)(struct vop_mountctl_args *); |
349433c9 | 666 | int (*vop_markatime)(struct vop_markatime_args *); |
09d96b9c | 667 | int (*vop_allocate)(struct vop_allocate_args *); |
fad57d0e MD |
668 | |
669 | int (*vop_nresolve)(struct vop_nresolve_args *); | |
670 | int (*vop_nlookupdotdot)(struct vop_nlookupdotdot_args *); | |
671 | int (*vop_ncreate)(struct vop_ncreate_args *); | |
672 | int (*vop_nmkdir)(struct vop_nmkdir_args *); | |
673 | int (*vop_nmknod)(struct vop_nmknod_args *); | |
674 | int (*vop_nlink)(struct vop_nlink_args *); | |
675 | int (*vop_nsymlink)(struct vop_nsymlink_args *); | |
676 | int (*vop_nwhiteout)(struct vop_nwhiteout_args *); | |
21739618 | 677 | int (*vop_nremove)(struct vop_nremove_args *); |
fad57d0e MD |
678 | int (*vop_nrmdir)(struct vop_nrmdir_args *); |
679 | int (*vop_nrename)(struct vop_nrename_args *); | |
680 | #define vop_ops_last_field vop_nrename | |
2d3e977e | 681 | }; |
c672274b | 682 | #endif /* _KERNEL */ |
2d3e977e | 683 | |
cbe54d63 | 684 | /* |
949ecb9b | 685 | * vop_mountctl() operations |
cbe54d63 MD |
686 | */ |
687 | #define VFSSET_DETACH 0 | |
688 | #define VFSSET_ATTACH 1 | |
0961aa92 | 689 | |
2d3e977e MD |
690 | /* |
691 | * Kernel VOP arguments union, suitable for malloc / embedding in other | |
692 | * structures. The vop_args_union can hold any VOP call argument structure. | |
693 | * Note that vu_head is broken out. | |
694 | */ | |
eaa61c9d | 695 | #if 0 |
2d3e977e MD |
696 | union vop_args_union { |
697 | struct vop_generic_args vu_head; | |
698 | struct vop_generic_args vu_default; | |
e62afb5f MD |
699 | struct vop_old_lookup_args vu_lookup; |
700 | struct vop_old_create_args vu_create; | |
701 | struct vop_old_whiteout_args vu_whiteout; | |
702 | struct vop_old_mknod_args vu_mknod; | |
2d3e977e MD |
703 | struct vop_open_args vu_open; |
704 | struct vop_close_args vu_close; | |
705 | struct vop_access_args vu_access; | |
706 | struct vop_getattr_args vu_getattr; | |
707 | struct vop_setattr_args vu_setattr; | |
708 | struct vop_read_args vu_read; | |
709 | struct vop_write_args vu_write; | |
2d3e977e MD |
710 | struct vop_ioctl_args vu_ioctl; |
711 | struct vop_poll_args vu_poll; | |
712 | struct vop_kqfilter_args vu_kqfilter; | |
2d3e977e MD |
713 | struct vop_mmap_args vu_mmap; |
714 | struct vop_fsync_args vu_fsync; | |
74fa2560 | 715 | struct vop_fdatasync_args vu_fdatasync; |
e62afb5f MD |
716 | struct vop_old_remove_args vu_remove; |
717 | struct vop_old_link_args vu_link; | |
718 | struct vop_old_rename_args vu_rename; | |
719 | struct vop_old_mkdir_args vu_mkdir; | |
720 | struct vop_old_rmdir_args vu_rmdir; | |
721 | struct vop_old_symlink_args vu_symlink; | |
2d3e977e MD |
722 | struct vop_readdir_args vu_readdir; |
723 | struct vop_readlink_args vu_readlink; | |
724 | struct vop_inactive_args vu_inactive; | |
725 | struct vop_reclaim_args vu_reclaim; | |
2d3e977e MD |
726 | struct vop_bmap_args vu_bmap; |
727 | struct vop_strategy_args vu_strategy; | |
728 | struct vop_print_args vu_print; | |
729 | struct vop_pathconf_args vu_pathconf; | |
730 | struct vop_advlock_args vu_advlock; | |
731 | struct vop_balloc_args vu_balloc; | |
732 | struct vop_reallocblks_args vu_reallocblks; | |
733 | struct vop_getpages_args vu_getpages; | |
734 | struct vop_putpages_args vu_putpages; | |
735 | struct vop_freeblks_args vu_freeblks; | |
2d3e977e MD |
736 | struct vop_getacl_args vu_getacl; |
737 | struct vop_setacl_args vu_setacl; | |
738 | struct vop_aclcheck_args vu_aclcheck; | |
739 | struct vop_getextattr_args vu_getextattr; | |
740 | struct vop_setextattr_args vu_setextattr; | |
949ecb9b | 741 | struct vop_mountctl_args vu_mountctl; |
349433c9 | 742 | struct vop_markatime_args vu_markatime; |
09d96b9c | 743 | struct vop_allocate_args vu_allocate; |
fad57d0e MD |
744 | |
745 | struct vop_nresolve_args vu_nresolve; | |
746 | struct vop_nlookupdotdot_args vu_nlookupdotdot; | |
747 | struct vop_ncreate_args vu_ncreate; | |
748 | struct vop_nmkdir_args vu_nmkdir; | |
749 | struct vop_nmknod_args vu_nmknod; | |
750 | struct vop_nlink_args vu_nlink; | |
751 | struct vop_nsymlink_args vu_nsymlink; | |
752 | struct vop_nwhiteout_args vu_nwhiteout; | |
753 | struct vop_nremove_args vu_nremove; | |
754 | struct vop_nrmdir_args vu_nrmdir; | |
755 | struct vop_nrename_args vu_nrename; | |
2d3e977e | 756 | }; |
eaa61c9d | 757 | #endif |
2d3e977e MD |
758 | |
759 | #ifdef _KERNEL | |
760 | ||
761 | /* | |
762 | * Kernel VOP call wrappers. These wrappers are responsible for wrapping | |
763 | * the arguments in the appropriate VOP arguments structure, sending the | |
764 | * message, and waiting for a reply. All kernel and VFS code should generally | |
765 | * call these wrappers rather then attempt to call the operations vector | |
766 | * routine directly in order to allow DragonFly to properly wrap the operation | |
767 | * in a message and dispatch it to the correct thread. | |
768 | */ | |
eaa61c9d | 769 | int vop_old_lookup(struct vop_ops *ops, struct vnode *dvp, |
26b67a34 | 770 | struct vnode **vpp, struct componentname *cnp); |
e62afb5f | 771 | int vop_old_create(struct vop_ops *ops, struct vnode *dvp, |
2d3e977e MD |
772 | struct vnode **vpp, struct componentname *cnp, |
773 | struct vattr *vap); | |
eaa61c9d | 774 | int vop_old_whiteout(struct vop_ops *ops, struct vnode *dvp, |
2d3e977e | 775 | struct componentname *cnp, int flags); |
eaa61c9d | 776 | int vop_old_mknod(struct vop_ops *ops, struct vnode *dvp, |
2d3e977e MD |
777 | struct vnode **vpp, struct componentname *cnp, |
778 | struct vattr *vap); | |
0961aa92 | 779 | int vop_open(struct vop_ops *ops, struct vnode *vp, int mode, |
5bd45597 | 780 | struct ucred *cred, struct file **fpp); |
3596743e MP |
781 | int vop_close(struct vop_ops *ops, struct vnode *vp, int fflag, |
782 | struct file *file); | |
b2aed953 | 783 | int vop_access(struct vop_ops *ops, struct vnode *vp, int mode, int flags, |
87de5057 | 784 | struct ucred *cred); |
2dfa19fa TK |
785 | int vop_getattr(struct vop_ops *ops, struct vnode *vp, struct vattr *vap, |
786 | struct file *fp); | |
de9bb133 MD |
787 | int vop_getattr_lite(struct vop_ops *ops, struct vnode *vp, |
788 | struct vattr_lite *vap); | |
0961aa92 | 789 | int vop_setattr(struct vop_ops *ops, struct vnode *vp, struct vattr *vap, |
2dfa19fa | 790 | struct ucred *cred, struct file *fp); |
0961aa92 | 791 | int vop_read(struct vop_ops *ops, struct vnode *vp, struct uio *uio, |
2dfa19fa | 792 | int ioflag, struct ucred *cred, struct file *fp); |
0961aa92 | 793 | int vop_write(struct vop_ops *ops, struct vnode *vp, struct uio *uio, |
2dfa19fa | 794 | int ioflag, struct ucred *cred, struct file *fp); |
0961aa92 | 795 | int vop_ioctl(struct vop_ops *ops, struct vnode *vp, u_long command, |
87baaf0c MD |
796 | caddr_t data, int fflag, struct ucred *cred, |
797 | struct sysmsg *msg); | |
0961aa92 | 798 | int vop_poll(struct vop_ops *ops, struct vnode *vp, int events, |
87de5057 | 799 | struct ucred *cred); |
0961aa92 | 800 | int vop_kqfilter(struct vop_ops *ops, struct vnode *vp, struct knote *kn); |
0961aa92 | 801 | int vop_mmap(struct vop_ops *ops, struct vnode *vp, int fflags, |
87de5057 | 802 | struct ucred *cred); |
2dfa19fa TK |
803 | int vop_fsync(struct vop_ops *ops, struct vnode *vp, int waitfor, int flags, |
804 | struct file *fp); | |
74fa2560 TK |
805 | int vop_fdatasync(struct vop_ops *ops, struct vnode *vp, int waitfor, int flags, |
806 | struct file *fp); | |
e62afb5f | 807 | int vop_old_remove(struct vop_ops *ops, struct vnode *dvp, |
2d3e977e | 808 | struct vnode *vp, struct componentname *cnp); |
e62afb5f | 809 | int vop_old_link(struct vop_ops *ops, struct vnode *tdvp, |
2d3e977e | 810 | struct vnode *vp, struct componentname *cnp); |
e62afb5f | 811 | int vop_old_rename(struct vop_ops *ops, struct vnode *fdvp, |
2d3e977e | 812 | struct vnode *fvp, struct componentname *fcnp, |
fad57d0e MD |
813 | struct vnode *tdvp, struct vnode *tvp, |
814 | struct componentname *tcnp); | |
e62afb5f | 815 | int vop_old_mkdir(struct vop_ops *ops, struct vnode *dvp, |
2d3e977e MD |
816 | struct vnode **vpp, struct componentname *cnp, |
817 | struct vattr *vap); | |
e62afb5f | 818 | int vop_old_rmdir(struct vop_ops *ops, struct vnode *dvp, |
2d3e977e | 819 | struct vnode *vp, struct componentname *cnp); |
e62afb5f | 820 | int vop_old_symlink(struct vop_ops *ops, struct vnode *dvp, |
2d3e977e MD |
821 | struct vnode **vpp, struct componentname *cnp, |
822 | struct vattr *vap, char *target); | |
0961aa92 | 823 | int vop_readdir(struct vop_ops *ops, struct vnode *vp, struct uio *uio, |
eaa61c9d | 824 | struct ucred *cred, int *eofflag, |
2dfa19fa | 825 | int *ncookies, off_t **cookies, struct file *fp); |
0961aa92 | 826 | int vop_readlink(struct vop_ops *ops, struct vnode *vp, struct uio *uio, |
2d3e977e | 827 | struct ucred *cred); |
87de5057 MD |
828 | int vop_inactive(struct vop_ops *ops, struct vnode *vp); |
829 | int vop_reclaim(struct vop_ops *ops, struct vnode *vp); | |
54078292 | 830 | int vop_bmap(struct vop_ops *ops, struct vnode *vp, off_t loffset, |
e92ca23a | 831 | off_t *doffsetp, int *runp, int *runb, buf_cmd_t cmd); |
81b5c339 | 832 | int vop_strategy(struct vop_ops *ops, struct vnode *vp, struct bio *bio); |
0961aa92 MD |
833 | int vop_print(struct vop_ops *ops, struct vnode *vp); |
834 | int vop_pathconf(struct vop_ops *ops, struct vnode *vp, int name, | |
2d3e977e | 835 | register_t *retval); |
0961aa92 | 836 | int vop_advlock(struct vop_ops *ops, struct vnode *vp, caddr_t id, int op, |
2d3e977e | 837 | struct flock *fl, int flags); |
0961aa92 | 838 | int vop_balloc(struct vop_ops *ops, struct vnode *vp, off_t startoffset, |
2d3e977e MD |
839 | int size, struct ucred *cred, int flags, |
840 | struct buf **bpp); | |
0961aa92 | 841 | int vop_reallocblks(struct vop_ops *ops, struct vnode *vp, |
2d3e977e | 842 | struct cluster_save *buflist); |
0961aa92 | 843 | int vop_getpages(struct vop_ops *ops, struct vnode *vp, struct vm_page **m, |
1c48c952 | 844 | int count, int reqpage, vm_ooffset_t offset, int seqaccess); |
0961aa92 | 845 | int vop_putpages(struct vop_ops *ops, struct vnode *vp, struct vm_page **m, |
df0b0ead | 846 | int count, int flags, int *rtvals, vm_ooffset_t offset); |
0961aa92 | 847 | int vop_freeblks(struct vop_ops *ops, struct vnode *vp, |
54078292 | 848 | off_t offset, int length); |
0961aa92 | 849 | int vop_getacl(struct vop_ops *ops, struct vnode *vp, acl_type_t type, |
87de5057 | 850 | struct acl *aclp, struct ucred *cred); |
0961aa92 | 851 | int vop_setacl(struct vop_ops *ops, struct vnode *vp, acl_type_t type, |
87de5057 | 852 | struct acl *aclp, struct ucred *cred); |
0961aa92 | 853 | int vop_aclcheck(struct vop_ops *ops, struct vnode *vp, acl_type_t type, |
87de5057 | 854 | struct acl *aclp, struct ucred *cred); |
0f6997f9 MD |
855 | |
856 | int vop_getextattr(struct vop_ops *ops, struct vnode *vp, int attrnamespace, | |
857 | char *attrname, struct uio *uio, struct ucred *cred); | |
858 | int vop_setextattr(struct vop_ops *ops, struct vnode *vp, int attrnamespace, | |
859 | char *attrname, struct uio *uio, struct ucred *cred); | |
aac0aabd MD |
860 | int vop_mountctl(struct vop_ops *ops, struct vnode *vp, int op, |
861 | struct file *fp, const void *ctl, int ctllen, | |
862 | void *buf, int buflen, int *res); | |
349433c9 | 863 | int vop_markatime(struct vop_ops *ops, struct vnode *vp, struct ucred *cred); |
09d96b9c TK |
864 | int vop_allocate(struct vop_ops *ops, struct vnode *vp, off_t offset, |
865 | off_t len); | |
866 | ||
28623bf9 | 867 | int vop_nresolve(struct vop_ops *ops, struct nchandle *nch, |
dff430ab | 868 | struct vnode *dvp, struct ucred *cred); |
fad57d0e | 869 | int vop_nlookupdotdot(struct vop_ops *ops, struct vnode *dvp, |
33387738 | 870 | struct vnode **vpp, struct ucred *cred, char **fakename); |
dff430ab | 871 | int vop_ncreate(struct vop_ops *ops, struct nchandle *nch, struct vnode *dvp, |
fad57d0e | 872 | struct vnode **vpp, struct ucred *cred, struct vattr *vap); |
dff430ab | 873 | int vop_nmkdir(struct vop_ops *ops, struct nchandle *nch, struct vnode *dvp, |
fad57d0e | 874 | struct vnode **vpp, struct ucred *cred, struct vattr *vap); |
dff430ab | 875 | int vop_nmknod(struct vop_ops *ops, struct nchandle *nch, struct vnode *dvp, |
fad57d0e | 876 | struct vnode **vpp, struct ucred *cred, struct vattr *vap); |
dff430ab MD |
877 | int vop_nlink(struct vop_ops *ops, struct nchandle *nch, struct vnode *dvp, |
878 | struct vnode *vp, struct ucred *cred); | |
879 | int vop_nsymlink(struct vop_ops *ops, struct nchandle *nch, struct vnode *dvp, | |
fad57d0e MD |
880 | struct vnode **vpp, struct ucred *cred, |
881 | struct vattr *vap, char *target); | |
dff430ab | 882 | int vop_nwhiteout(struct vop_ops *ops, struct nchandle *nch, struct vnode *dvp, |
fad57d0e | 883 | struct ucred *cred, int flags); |
dff430ab MD |
884 | int vop_nremove(struct vop_ops *ops, struct nchandle *nch, struct vnode *dvp, |
885 | struct ucred *cred); | |
886 | int vop_nrmdir(struct vop_ops *ops, struct nchandle *nch, struct vnode *dvp, | |
fad57d0e | 887 | struct ucred *cred); |
dff430ab MD |
888 | int vop_nrename(struct vop_ops *ops, |
889 | struct nchandle *fnch, struct nchandle *tnch, | |
890 | struct vnode *fdvp, struct vnode *tdvp, | |
fad57d0e | 891 | struct ucred *cred); |
21739618 | 892 | |
0961aa92 MD |
893 | /* |
894 | * Kernel VOP forwarding wrappers. These are called when a VFS such as | |
eaa61c9d | 895 | * nullfs needs to push down into another VFS, changing the |
896 | * a_ops pointer and consequentially necessitating additional | |
0961aa92 MD |
897 | * cache management. |
898 | * | |
899 | * Note that this is different from vop_ops chaining within the same | |
900 | * filesystem. When a filesystem chains a vop_ops it just uses VOCALLs. | |
901 | */ | |
902 | int vop_vnoperate_ap(struct vop_generic_args *ap); | |
6ddb7618 MD |
903 | int vop_cache_operate_ap(struct vop_generic_args *ap); |
904 | int vop_journal_operate_ap(struct vop_generic_args *ap); | |
e62afb5f MD |
905 | int vop_old_lookup_ap(struct vop_old_lookup_args *ap); |
906 | int vop_old_create_ap(struct vop_old_create_args *ap); | |
907 | int vop_old_whiteout_ap(struct vop_old_whiteout_args *ap); | |
908 | int vop_old_mknod_ap(struct vop_old_mknod_args *ap); | |
0961aa92 MD |
909 | int vop_open_ap(struct vop_open_args *ap); |
910 | int vop_close_ap(struct vop_close_args *ap); | |
911 | int vop_access_ap(struct vop_access_args *ap); | |
912 | int vop_getattr_ap(struct vop_getattr_args *ap); | |
de9bb133 | 913 | int vop_getattr_lite_ap(struct vop_getattr_lite_args *ap); |
0961aa92 MD |
914 | int vop_setattr_ap(struct vop_setattr_args *ap); |
915 | int vop_read_ap(struct vop_read_args *ap); | |
916 | int vop_write_ap(struct vop_write_args *ap); | |
0961aa92 MD |
917 | int vop_ioctl_ap(struct vop_ioctl_args *ap); |
918 | int vop_poll_ap(struct vop_poll_args *ap); | |
919 | int vop_kqfilter_ap(struct vop_kqfilter_args *ap); | |
0961aa92 MD |
920 | int vop_mmap_ap(struct vop_mmap_args *ap); |
921 | int vop_fsync_ap(struct vop_fsync_args *ap); | |
74fa2560 | 922 | int vop_fdatasync_ap(struct vop_fdatasync_args *ap); |
e62afb5f MD |
923 | int vop_old_remove_ap(struct vop_old_remove_args *ap); |
924 | int vop_old_link_ap(struct vop_old_link_args *ap); | |
925 | int vop_old_rename_ap(struct vop_old_rename_args *ap); | |
926 | int vop_old_mkdir_ap(struct vop_old_mkdir_args *ap); | |
927 | int vop_old_rmdir_ap(struct vop_old_rmdir_args *ap); | |
928 | int vop_old_symlink_ap(struct vop_old_symlink_args *ap); | |
0961aa92 MD |
929 | int vop_readdir_ap(struct vop_readdir_args *ap); |
930 | int vop_readlink_ap(struct vop_readlink_args *ap); | |
931 | int vop_inactive_ap(struct vop_inactive_args *ap); | |
932 | int vop_reclaim_ap(struct vop_reclaim_args *ap); | |
0961aa92 MD |
933 | int vop_bmap_ap(struct vop_bmap_args *ap); |
934 | int vop_strategy_ap(struct vop_strategy_args *ap); | |
935 | int vop_print_ap(struct vop_print_args *ap); | |
936 | int vop_pathconf_ap(struct vop_pathconf_args *ap); | |
937 | int vop_advlock_ap(struct vop_advlock_args *ap); | |
938 | int vop_balloc_ap(struct vop_balloc_args *ap); | |
939 | int vop_reallocblks_ap(struct vop_reallocblks_args *ap); | |
940 | int vop_getpages_ap(struct vop_getpages_args *ap); | |
941 | int vop_putpages_ap(struct vop_putpages_args *ap); | |
942 | int vop_freeblks_ap(struct vop_freeblks_args *ap); | |
0961aa92 MD |
943 | int vop_getacl_ap(struct vop_getacl_args *ap); |
944 | int vop_setacl_ap(struct vop_setacl_args *ap); | |
945 | int vop_aclcheck_ap(struct vop_aclcheck_args *ap); | |
946 | int vop_getextattr_ap(struct vop_getextattr_args *ap); | |
947 | int vop_setextattr_ap(struct vop_setextattr_args *ap); | |
949ecb9b | 948 | int vop_mountctl_ap(struct vop_mountctl_args *ap); |
349433c9 | 949 | int vop_markatime_ap(struct vop_markatime_args *ap); |
09d96b9c | 950 | int vop_allocate_ap(struct vop_allocate_args *ap); |
2d3e977e | 951 | |
fad57d0e MD |
952 | int vop_nresolve_ap(struct vop_nresolve_args *ap); |
953 | int vop_nlookupdotdot_ap(struct vop_nlookupdotdot_args *ap); | |
954 | int vop_ncreate_ap(struct vop_ncreate_args *ap); | |
955 | int vop_nmkdir_ap(struct vop_nmkdir_args *ap); | |
956 | int vop_nmknod_ap(struct vop_nmknod_args *ap); | |
957 | int vop_nlink_ap(struct vop_nlink_args *ap); | |
958 | int vop_nsymlink_ap(struct vop_nsymlink_args *ap); | |
959 | int vop_nwhiteout_ap(struct vop_nwhiteout_args *ap); | |
960 | int vop_nremove_ap(struct vop_nremove_args *ap); | |
961 | int vop_nrmdir_ap(struct vop_nrmdir_args *ap); | |
962 | int vop_nrename_ap(struct vop_nrename_args *ap); | |
963 | ||
2d3e977e | 964 | /* |
0961aa92 | 965 | * VOP operations descriptor. This is used by the vop_ops compiler |
2d3e977e MD |
966 | * to convert VFS vector arrays (typically in vfs/blah/blah_vnops.c) |
967 | * into a vop_ops operations vector. | |
968 | */ | |
31bd717a | 969 | extern struct syslink_desc vop_default_desc; |
31bd717a MD |
970 | extern struct syslink_desc vop_old_lookup_desc; |
971 | extern struct syslink_desc vop_old_create_desc; | |
972 | extern struct syslink_desc vop_old_whiteout_desc; | |
973 | extern struct syslink_desc vop_old_mknod_desc; | |
974 | extern struct syslink_desc vop_open_desc; | |
975 | extern struct syslink_desc vop_close_desc; | |
976 | extern struct syslink_desc vop_access_desc; | |
977 | extern struct syslink_desc vop_getattr_desc; | |
de9bb133 | 978 | extern struct syslink_desc vop_getattr_lite_desc; |
31bd717a MD |
979 | extern struct syslink_desc vop_setattr_desc; |
980 | extern struct syslink_desc vop_read_desc; | |
981 | extern struct syslink_desc vop_write_desc; | |
982 | extern struct syslink_desc vop_ioctl_desc; | |
983 | extern struct syslink_desc vop_poll_desc; | |
984 | extern struct syslink_desc vop_kqfilter_desc; | |
31bd717a MD |
985 | extern struct syslink_desc vop_mmap_desc; |
986 | extern struct syslink_desc vop_fsync_desc; | |
74fa2560 | 987 | extern struct syslink_desc vop_fdatasync_desc; |
31bd717a MD |
988 | extern struct syslink_desc vop_old_remove_desc; |
989 | extern struct syslink_desc vop_old_link_desc; | |
990 | extern struct syslink_desc vop_old_rename_desc; | |
991 | extern struct syslink_desc vop_old_mkdir_desc; | |
992 | extern struct syslink_desc vop_old_rmdir_desc; | |
993 | extern struct syslink_desc vop_old_symlink_desc; | |
994 | extern struct syslink_desc vop_readdir_desc; | |
995 | extern struct syslink_desc vop_readlink_desc; | |
996 | extern struct syslink_desc vop_inactive_desc; | |
997 | extern struct syslink_desc vop_reclaim_desc; | |
31bd717a MD |
998 | extern struct syslink_desc vop_bmap_desc; |
999 | extern struct syslink_desc vop_strategy_desc; | |
1000 | extern struct syslink_desc vop_print_desc; | |
1001 | extern struct syslink_desc vop_pathconf_desc; | |
1002 | extern struct syslink_desc vop_advlock_desc; | |
1003 | extern struct syslink_desc vop_balloc_desc; | |
1004 | extern struct syslink_desc vop_reallocblks_desc; | |
1005 | extern struct syslink_desc vop_getpages_desc; | |
1006 | extern struct syslink_desc vop_putpages_desc; | |
1007 | extern struct syslink_desc vop_freeblks_desc; | |
1008 | extern struct syslink_desc vop_getacl_desc; | |
1009 | extern struct syslink_desc vop_setacl_desc; | |
1010 | extern struct syslink_desc vop_aclcheck_desc; | |
1011 | extern struct syslink_desc vop_getextattr_desc; | |
1012 | extern struct syslink_desc vop_setextattr_desc; | |
1013 | extern struct syslink_desc vop_mountctl_desc; | |
349433c9 | 1014 | extern struct syslink_desc vop_markatime_desc; |
09d96b9c | 1015 | extern struct syslink_desc vop_allocate_desc; |
31bd717a MD |
1016 | |
1017 | extern struct syslink_desc vop_nresolve_desc; | |
1018 | extern struct syslink_desc vop_nlookupdotdot_desc; | |
1019 | extern struct syslink_desc vop_ncreate_desc; | |
1020 | extern struct syslink_desc vop_nmkdir_desc; | |
1021 | extern struct syslink_desc vop_nmknod_desc; | |
1022 | extern struct syslink_desc vop_nlink_desc; | |
1023 | extern struct syslink_desc vop_nsymlink_desc; | |
1024 | extern struct syslink_desc vop_nwhiteout_desc; | |
1025 | extern struct syslink_desc vop_nremove_desc; | |
1026 | extern struct syslink_desc vop_nrmdir_desc; | |
1027 | extern struct syslink_desc vop_nrename_desc; | |
fad57d0e | 1028 | |
c672274b | 1029 | #endif /* _KERNEL */ |
2d3e977e MD |
1030 | |
1031 | /* | |
fad57d0e MD |
1032 | * VOP_*() convenience macros extract the operations vector and make the |
1033 | * vop_*() call. | |
2d3e977e | 1034 | */ |
c672274b | 1035 | #ifdef _KERNEL |
5bd45597 MD |
1036 | #define VOP_OPEN(vp, mode, cred, fpp) \ |
1037 | vop_open(*(vp)->v_ops, vp, mode, cred, fpp) | |
3596743e MP |
1038 | #define VOP_CLOSE(vp, fflag, fp) \ |
1039 | vop_close(*(vp)->v_ops, vp, fflag, fp) | |
87de5057 | 1040 | #define VOP_ACCESS(vp, mode, cred) \ |
b2aed953 | 1041 | vop_access(*(vp)->v_ops, vp, mode, 0, cred) |
cb66845a MD |
1042 | #define VOP_EACCESS(vp, mode, cred) \ |
1043 | vop_access(*(vp)->v_ops, vp, mode, AT_EACCESS, cred) | |
b2aed953 NT |
1044 | #define VOP_ACCESS_FLAGS(vp, mode, flags, cred) \ |
1045 | vop_access(*(vp)->v_ops, vp, mode, flags, cred) | |
2dfa19fa TK |
1046 | #define VOP_GETATTR_FP(vp, vap, fp) \ |
1047 | vop_getattr(*(vp)->v_ops, vp, vap, fp) /* FUSE */ | |
87de5057 | 1048 | #define VOP_GETATTR(vp, vap) \ |
2dfa19fa | 1049 | VOP_GETATTR_FP(vp, vap, NULL) |
de9bb133 MD |
1050 | #define VOP_GETATTR_LITE(vp, lvap) \ |
1051 | vop_getattr_lite(*(vp)->v_ops, vp, lvap) | |
2dfa19fa TK |
1052 | #define VOP_SETATTR_FP(vp, vap, cred, fp) \ |
1053 | vop_setattr(*(vp)->v_ops, vp, vap, cred, fp) /* FUSE */ | |
87de5057 | 1054 | #define VOP_SETATTR(vp, vap, cred) \ |
2dfa19fa TK |
1055 | VOP_SETATTR_FP(vp, vap, cred, NULL) |
1056 | #define VOP_READ_FP(vp, uio, ioflag, cred, fp) \ | |
1057 | vop_read(*(vp)->v_ops, vp, uio, ioflag, cred, fp) /* FUSE */ | |
2d3e977e | 1058 | #define VOP_READ(vp, uio, ioflag, cred) \ |
2dfa19fa TK |
1059 | VOP_READ_FP(vp, uio, ioflag, cred, NULL) |
1060 | #define VOP_WRITE_FP(vp, uio, ioflag, cred, fp) \ | |
1061 | vop_write(*(vp)->v_ops, vp, uio, ioflag, cred, fp) /* FUSE */ | |
2d3e977e | 1062 | #define VOP_WRITE(vp, uio, ioflag, cred) \ |
2dfa19fa | 1063 | VOP_WRITE_FP(vp, uio, ioflag, cred, NULL) |
87baaf0c MD |
1064 | #define VOP_IOCTL(vp, command, data, fflag, cred, msg) \ |
1065 | vop_ioctl(*(vp)->v_ops, vp, command, data, fflag, cred, msg) | |
87de5057 MD |
1066 | #define VOP_POLL(vp, events, cred) \ |
1067 | vop_poll(*(vp)->v_ops, vp, events, cred) | |
2d3e977e | 1068 | #define VOP_KQFILTER(vp, kn) \ |
6ddb7618 | 1069 | vop_kqfilter(*(vp)->v_ops, vp, kn) |
87de5057 MD |
1070 | #define VOP_MMAP(vp, fflags, cred) \ |
1071 | vop_mmap(*(vp)->v_ops, vp, fflags, cred) | |
2dfa19fa TK |
1072 | #define VOP_FSYNC_FP(vp, waitfor, flags, fp) \ |
1073 | vop_fsync(*(vp)->v_ops, vp, waitfor, flags, fp) /* FUSE*/ | |
52174f71 | 1074 | #define VOP_FSYNC(vp, waitfor, flags) \ |
2dfa19fa | 1075 | VOP_FSYNC_FP(vp, waitfor, flags, NULL) |
74fa2560 TK |
1076 | #define VOP_FDATASYNC_FP(vp, waitfor, flags, fp) \ |
1077 | vop_fdatasync(*(vp)->v_ops, vp, waitfor, flags, fp) /* FUSE*/ | |
ee5a5918 | 1078 | #define VOP_FDATASYNC(vp, waitfor, flags) \ |
74fa2560 | 1079 | VOP_FDATASYNC_FP(*(vp)->v_ops, vp, waitfor, flags, NULL) |
2dfa19fa TK |
1080 | #define VOP_READDIR_FP(vp, uio, cred, eofflag, ncookies, cookies, fp) \ |
1081 | vop_readdir(*(vp)->v_ops, vp, uio, cred, eofflag, ncookies, cookies, fp) /* FUSE */ | |
2d3e977e | 1082 | #define VOP_READDIR(vp, uio, cred, eofflag, ncookies, cookies) \ |
2dfa19fa | 1083 | VOP_READDIR_FP(vp, uio, cred, eofflag, ncookies, cookies, NULL) |
2d3e977e | 1084 | #define VOP_READLINK(vp, uio, cred) \ |
6ddb7618 | 1085 | vop_readlink(*(vp)->v_ops, vp, uio, cred) |
87de5057 MD |
1086 | #define VOP_INACTIVE(vp) \ |
1087 | vop_inactive(*(vp)->v_ops, vp) | |
1088 | #define VOP_RECLAIM(vp) \ | |
1089 | vop_reclaim(*(vp)->v_ops, vp) | |
e92ca23a MD |
1090 | #define VOP_BMAP(vp, loff, doffp, runp, runb, cmd) \ |
1091 | vop_bmap(*(vp)->v_ops, vp, loff, doffp, runp, runb, cmd) | |
2d3e977e | 1092 | #define VOP_PRINT(vp) \ |
6ddb7618 | 1093 | vop_print(*(vp)->v_ops, vp) |
2d3e977e | 1094 | #define VOP_PATHCONF(vp, name, retval) \ |
6ddb7618 | 1095 | vop_pathconf(*(vp)->v_ops, vp, name, retval) |
2d3e977e | 1096 | #define VOP_ADVLOCK(vp, id, op, fl, flags) \ |
6ddb7618 | 1097 | vop_advlock(*(vp)->v_ops, vp, id, op, fl, flags) |
2d3e977e | 1098 | #define VOP_BALLOC(vp, offset, size, cred, flags, bpp) \ |
6ddb7618 | 1099 | vop_balloc(*(vp)->v_ops, vp, offset, size, cred, flags, bpp) |
2d3e977e | 1100 | #define VOP_REALLOCBLKS(vp, buflist) \ |
6ddb7618 | 1101 | vop_reallocblks(*(vp)->v_ops, vp, buflist) |
1c48c952 MD |
1102 | #define VOP_GETPAGES(vp, m, count, reqpage, off, seqaccess) \ |
1103 | vop_getpages(*(vp)->v_ops, vp, m, count, reqpage, off, seqaccess) | |
df0b0ead SW |
1104 | #define VOP_PUTPAGES(vp, m, count, flags, rtvals, off) \ |
1105 | vop_putpages(*(vp)->v_ops, vp, m, count, flags, rtvals, off) | |
54078292 MD |
1106 | #define VOP_FREEBLKS(vp, offset, length) \ |
1107 | vop_freeblks(*(vp)->v_ops, vp, offset, length) | |
87de5057 MD |
1108 | #define VOP_GETACL(vp, type, aclp, cred) \ |
1109 | vop_getacl(*(vp)->v_ops, vp, type, aclp, cred) | |
1110 | #define VOP_SETACL(vp, type, aclp, cred) \ | |
1111 | vop_setacl(*(vp)->v_ops, vp, type, aclp, cred) | |
1112 | #define VOP_ACLCHECK(vp, type, aclp, cred) \ | |
1113 | vop_aclcheck(*(vp)->v_ops, vp, type, aclp, cred) | |
0f6997f9 MD |
1114 | #define VOP_GETEXTATTR(vp, attrnamespace, attrname, uio, cred) \ |
1115 | vop_getextattr(*(vp)->v_ops, vp, attrnamespace, attrname, uio, cred) | |
1116 | #define VOP_SETEXTATTR(vp, attrnamespace, attrname, uio, cred) \ | |
1117 | vop_setextattr(*(vp)->v_ops, vp, attrnamespace, attrname, uio, cred) | |
349433c9 MD |
1118 | #define VOP_MARKATIME(vp, cred) \ |
1119 | vop_markatime(*(vp)->v_ops, vp, cred) | |
09d96b9c TK |
1120 | #define VOP_ALLOCATE(vp, offset, len) \ |
1121 | vop_allocate(*(vp)->v_ops, vp, offset, len) | |
cbe54d63 | 1122 | /* no VOP_VFSSET() */ |
81b5c339 | 1123 | /* VOP_STRATEGY - does not exist, use vn_strategy() */ |
2d3e977e | 1124 | |
fad57d0e MD |
1125 | /* |
1126 | * 'OLD' VOP calls. These calls may only be made by the new API | |
1127 | * compatibility functions in kern/vfs_default.c. Attempting to | |
1128 | * call these functions directly will confuse the namecache. These | |
1129 | * calls are deprecated and being removed from the system and from | |
1130 | * the VFS's. | |
1131 | */ | |
1132 | #define VOP_OLD_LOOKUP(dvp, vpp, cnp) \ | |
e62afb5f | 1133 | vop_old_lookup(*(dvp)->v_ops, dvp, vpp, cnp) |
fad57d0e | 1134 | #define VOP_OLD_CREATE(dvp, vpp, cnp, vap) \ |
e62afb5f | 1135 | vop_old_create(*(dvp)->v_ops, dvp, vpp, cnp, vap) |
fad57d0e | 1136 | #define VOP_OLD_MKDIR(dvp, vpp, cnp, vap) \ |
e62afb5f | 1137 | vop_old_mkdir(*(dvp)->v_ops, dvp, vpp, cnp, vap) |
fad57d0e | 1138 | #define VOP_OLD_MKNOD(dvp, vpp, cnp, vap) \ |
e62afb5f | 1139 | vop_old_mknod(*(dvp)->v_ops, dvp, vpp, cnp, vap) |
fad57d0e | 1140 | #define VOP_OLD_LINK(tdvp, vp, cnp) \ |
e62afb5f | 1141 | vop_old_link(*(tdvp)->v_ops, tdvp, vp, cnp) |
fad57d0e | 1142 | #define VOP_OLD_SYMLINK(dvp, vpp, cnp, vap, target) \ |
e62afb5f | 1143 | vop_old_symlink(*(dvp)->v_ops, dvp, vpp, cnp, vap, target) |
fad57d0e | 1144 | #define VOP_OLD_WHITEOUT(dvp, cnp, flags) \ |
e62afb5f | 1145 | vop_old_whiteout(*(dvp)->v_ops, dvp, cnp, flags) |
fad57d0e | 1146 | #define VOP_OLD_RENAME(fdvp, fvp, fcnp, tdvp, tvp, tcnp) \ |
e62afb5f | 1147 | vop_old_rename(*(fdvp)->v_ops, fdvp, fvp, fcnp, tdvp, tvp, tcnp) |
fad57d0e | 1148 | #define VOP_OLD_RMDIR(dvp, vp, cnp) \ |
e62afb5f | 1149 | vop_old_rmdir(*(dvp)->v_ops, dvp, vp, cnp) |
fad57d0e | 1150 | #define VOP_OLD_REMOVE(dvp, vp, cnp) \ |
e62afb5f | 1151 | vop_old_remove(*(dvp)->v_ops, dvp, vp, cnp) |
fad57d0e MD |
1152 | |
1153 | /* | |
1154 | * 'NEW' VOP calls. These calls use namespaces as an operational basis | |
1155 | * rather then vnodes and replace the OLD calls. Eventually all VFS's | |
1156 | * will support these calls. Those that do not fall through to compatibility | |
1157 | * code in kern/vfs_default which does the magic required to call the old | |
1158 | * routines. | |
1159 | */ | |
dff430ab MD |
1160 | #define VOP_NRESOLVE(nch, dvp, cred) \ |
1161 | vop_nresolve((nch)->mount->mnt_vn_use_ops, nch, dvp, cred) | |
33387738 MD |
1162 | #define VOP_NLOOKUPDOTDOT(dvp, vpp, cred, fakename) \ |
1163 | vop_nlookupdotdot(*(dvp)->v_ops, dvp, vpp, cred, fakename) | |
dff430ab MD |
1164 | #define VOP_NCREATE(nch, dvp, vpp, cred, vap) \ |
1165 | vop_ncreate((nch)->mount->mnt_vn_use_ops, nch, dvp, vpp, cred, vap) | |
1166 | #define VOP_NMKDIR(nch, dvp, vpp, cred, vap) \ | |
1167 | vop_nmkdir((nch)->mount->mnt_vn_use_ops, nch, dvp, vpp, cred, vap) | |
1168 | #define VOP_NMKNOD(nch, dvp, vpp, cred, vap) \ | |
1169 | vop_nmknod((nch)->mount->mnt_vn_use_ops, nch, dvp, vpp, cred, vap) | |
1170 | #define VOP_NLINK(nch, dvp, vp, cred) \ | |
1171 | vop_nlink((nch)->mount->mnt_vn_use_ops, nch, dvp, vp, cred) | |
1172 | #define VOP_NSYMLINK(nch, dvp, vpp, cred, vap, target) \ | |
1173 | vop_nsymlink((nch)->mount->mnt_vn_use_ops, nch, dvp, vpp, cred, vap, target) | |
1174 | #define VOP_NWHITEOUT(nch, dvp, cred, flags) \ | |
1175 | vop_nwhiteout((nch)->mount->mnt_vn_use_ops, nch, dvp, cred, flags) | |
1176 | #define VOP_NRENAME(fnch, tnch, fdvp, tdvp, cred) \ | |
1177 | vop_nrename((fnch)->mount->mnt_vn_use_ops, fnch, tnch, fdvp, tdvp, cred) | |
1178 | #define VOP_NRMDIR(nch, dvp, cred) \ | |
1179 | vop_nrmdir((nch)->mount->mnt_vn_use_ops, nch, dvp, cred) | |
1180 | #define VOP_NREMOVE(nch, dvp, cred) \ | |
1181 | vop_nremove((nch)->mount->mnt_vn_use_ops, nch, dvp, cred) | |
c672274b | 1182 | #endif /* _KERNEL */ |
fad57d0e | 1183 | |
c672274b | 1184 | #endif /* !_SYS_VFSOPS_H_ */ |
2d3e977e | 1185 |