]> git.saurik.com Git - apple/xnu.git/blob - bsd/sys/vnode.h
xnu-792.6.61.tar.gz
[apple/xnu.git] / bsd / sys / vnode.h
1 /*
2 * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
23 /*
24 * Copyright (c) 1989, 1993
25 * The Regents of the University of California. All rights reserved.
26 *
27 * Redistribution and use in source and binary forms, with or without
28 * modification, are permitted provided that the following conditions
29 * are met:
30 * 1. Redistributions of source code must retain the above copyright
31 * notice, this list of conditions and the following disclaimer.
32 * 2. Redistributions in binary form must reproduce the above copyright
33 * notice, this list of conditions and the following disclaimer in the
34 * documentation and/or other materials provided with the distribution.
35 * 3. All advertising materials mentioning features or use of this software
36 * must display the following acknowledgement:
37 * This product includes software developed by the University of
38 * California, Berkeley and its contributors.
39 * 4. Neither the name of the University nor the names of its contributors
40 * may be used to endorse or promote products derived from this software
41 * without specific prior written permission.
42 *
43 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
44 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * SUCH DAMAGE.
54 *
55 * @(#)vnode.h 8.17 (Berkeley) 5/20/95
56 */
57
58 #ifndef _VNODE_H_
59 #define _VNODE_H_
60
61 #include <sys/appleapiopts.h>
62 #include <sys/cdefs.h>
63 #ifdef KERNEL
64 #include <sys/kernel_types.h>
65 #include <sys/signal.h>
66 #endif
67
68 /*
69 * The vnode is the focus of all file activity in UNIX. There is a
70 * unique vnode allocated for each active file, each current directory,
71 * each mounted-on file, text file, and the root.
72 */
73
74 /*
75 * Vnode types. VNON means no type.
76 */
77 enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD, VSTR,
78 VCPLX };
79
80 /*
81 * Vnode tag types.
82 * These are for the benefit of external programs only (e.g., pstat)
83 * and should NEVER be inspected by the kernel.
84 */
85 enum vtagtype {
86 VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_MSDOSFS, VT_LFS, VT_LOFS, VT_FDESC,
87 VT_PORTAL, VT_NULL, VT_UMAP, VT_KERNFS, VT_PROCFS, VT_AFS, VT_ISOFS,
88 VT_UNION, VT_HFS, VT_VOLFS, VT_DEVFS, VT_WEBDAV, VT_UDF, VT_AFP,
89 VT_CDDA, VT_CIFS,VT_OTHER};
90
91
92 /*
93 * flags for VNOP_BLOCKMAP
94 */
95 #define VNODE_READ 0x01
96 #define VNODE_WRITE 0x02
97
98
99
100 /* flags for VNOP_ALLOCATE */
101 #define PREALLOCATE 0x00000001 /* preallocate allocation blocks */
102 #define ALLOCATECONTIG 0x00000002 /* allocate contigious space */
103 #define ALLOCATEALL 0x00000004 /* allocate all requested space */
104 /* or no space at all */
105 #define FREEREMAINDER 0x00000008 /* deallocate allocated but */
106 /* unfilled blocks */
107 #define ALLOCATEFROMPEOF 0x00000010 /* allocate from the physical eof */
108 #define ALLOCATEFROMVOL 0x00000020 /* allocate from the volume offset */
109
110 /*
111 * Token indicating no attribute value yet assigned. some user source uses this
112 */
113 #define VNOVAL (-1)
114
115 #ifdef KERNEL
116
117 /*
118 * Flags for ioflag.
119 */
120 #define IO_UNIT 0x0001 /* do I/O as atomic unit */
121 #define IO_APPEND 0x0002 /* append write to end */
122 #define IO_SYNC 0x0004 /* do I/O synchronously */
123 #define IO_NODELOCKED 0x0008 /* underlying node already locked */
124 #define IO_NDELAY 0x0010 /* FNDELAY flag set in file table */
125 #define IO_NOZEROFILL 0x0020 /* F_SETSIZE fcntl uses to prevent zero filling */
126 #define IO_TAILZEROFILL 0x0040 /* zero fills at the tail of write */
127 #define IO_HEADZEROFILL 0x0080 /* zero fills at the head of write */
128 #define IO_NOZEROVALID 0x0100 /* do not zero fill if valid page */
129 #define IO_NOZERODIRTY 0x0200 /* do not zero fill if page is dirty */
130 #define IO_CLOSE 0x0400 /* I/O issued from close path */
131 #define IO_NOCACHE 0x0800 /* same effect as VNOCACHE_DATA, but only for this 1 I/O */
132 #define IO_RAOFF 0x1000 /* same effect as VRAOFF, but only for this 1 I/O */
133 #define IO_DEFWRITE 0x2000 /* defer write if vfs.defwrite is set */
134
135 /*
136 * Component Name: this structure describes the pathname
137 * information that is passed through the VNOP interface.
138 */
139 struct componentname {
140 /*
141 * Arguments to lookup.
142 */
143 u_long cn_nameiop; /* lookup operation */
144 u_long cn_flags; /* flags (see below) */
145 #ifdef BSD_KERNEL_PRIVATE
146 vfs_context_t cn_context;
147 void * pad_obsolete2;
148
149 /* XXX use of these defines are deprecated */
150 #define cn_proc (cn_context->vc_proc + 0) /* non-lvalue */
151 #define cn_cred (cn_context->vc_ucred + 0) /* non-lvalue */
152
153 #else
154 void * obsolete1; /* use vfs_context_t */
155 void * obsolete2; /* use vfs_context_t */
156 #endif
157 /*
158 * Shared between lookup and commit routines.
159 */
160 char *cn_pnbuf; /* pathname buffer */
161 long cn_pnlen; /* length of allocated buffer */
162 char *cn_nameptr; /* pointer to looked up name */
163 long cn_namelen; /* length of looked up component */
164 u_long cn_hash; /* hash value of looked up name */
165 long cn_consume; /* chars to consume in lookup() */
166 };
167
168 /*
169 * component name operations (for VNOP_LOOKUP)
170 */
171 #define LOOKUP 0 /* perform name lookup only */
172 #define CREATE 1 /* setup for file creation */
173 #define DELETE 2 /* setup for file deletion */
174 #define RENAME 3 /* setup for file renaming */
175 #define OPMASK 3 /* mask for operation */
176
177 /*
178 * component name operational modifier flags
179 */
180 #define FOLLOW 0x0040 /* follow symbolic links */
181
182 /*
183 * component name parameter descriptors.
184 */
185 #define ISDOTDOT 0x002000 /* current component name is .. */
186 #define MAKEENTRY 0x004000 /* entry is to be added to name cache */
187 #define ISLASTCN 0x008000 /* this is last component of pathname */
188 #define ISWHITEOUT 0x020000 /* found whiteout */
189 #define DOWHITEOUT 0x040000 /* do whiteouts */
190
191
192
193 /* The following structure specifies a vnode for creation */
194 struct vnode_fsparam {
195 struct mount * vnfs_mp; /* mount point to which this vnode_t is part of */
196 enum vtype vnfs_vtype; /* vnode type */
197 const char * vnfs_str; /* File system Debug aid */
198 struct vnode * vnfs_dvp; /* The parent vnode */
199 void * vnfs_fsnode; /* inode */
200 int (**vnfs_vops)(void *); /* vnode dispatch table */
201 int vnfs_markroot; /* is this a root vnode in FS (not a system wide one) */
202 int vnfs_marksystem; /* is a system vnode */
203 dev_t vnfs_rdev; /* dev_t for block or char vnodes */
204 off_t vnfs_filesize; /* that way no need for getattr in UBC */
205 struct componentname * vnfs_cnp; /* component name to add to namecache */
206 uint32_t vnfs_flags; /* flags */
207 };
208
209 #define VNFS_NOCACHE 0x01 /* do not add to name cache at this time */
210 #define VNFS_CANTCACHE 0x02 /* never add this instance to the name cache */
211
212 #define VNCREATE_FLAVOR 0
213 #define VCREATESIZE sizeof(struct vnode_fsparam)
214
215 /*
216 * Vnode attributes, new-style.
217 *
218 * The vnode_attr structure is used to transact attribute changes and queries
219 * with the filesystem.
220 *
221 * Note that this structure may be extended, but existing fields must not move.
222 */
223
224 #define VATTR_INIT(v) do {(v)->va_supported = (v)->va_active = 0ll; (v)->va_vaflags = 0;} while(0)
225 #define VATTR_SET_ACTIVE(v, a) ((v)->va_active |= VNODE_ATTR_ ## a)
226 #define VATTR_SET_SUPPORTED(v, a) ((v)->va_supported |= VNODE_ATTR_ ## a)
227 #define VATTR_IS_SUPPORTED(v, a) ((v)->va_supported & VNODE_ATTR_ ## a)
228 #define VATTR_CLEAR_ACTIVE(v, a) ((v)->va_active &= ~VNODE_ATTR_ ## a)
229 #define VATTR_CLEAR_SUPPORTED(v, a) ((v)->va_supported &= ~VNODE_ATTR_ ## a)
230 #define VATTR_IS_ACTIVE(v, a) ((v)->va_active & VNODE_ATTR_ ## a)
231 #define VATTR_ALL_SUPPORTED(v) (((v)->va_active & (v)->va_supported) == (v)->va_active)
232 #define VATTR_INACTIVE_SUPPORTED(v) do {(v)->va_active &= ~(v)->va_supported; (v)->va_supported = 0;} while(0)
233 #define VATTR_SET(v, a, x) do { (v)-> a = (x); VATTR_SET_ACTIVE(v, a);} while(0)
234 #define VATTR_WANTED(v, a) VATTR_SET_ACTIVE(v, a)
235 #define VATTR_RETURN(v, a, x) do { (v)-> a = (x); VATTR_SET_SUPPORTED(v, a);} while(0)
236 #define VATTR_NOT_RETURNED(v, a) (VATTR_IS_ACTIVE(v, a) && !VATTR_IS_SUPPORTED(v, a))
237
238 /*
239 * Two macros to simplify conditional checking in kernel code.
240 */
241 #define VATTR_IS(v, a, x) (VATTR_IS_SUPPORTED(v, a) && (v)-> a == (x))
242 #define VATTR_IS_NOT(v, a, x) (VATTR_IS_SUPPORTED(v, a) && (v)-> a != (x))
243
244 #define VNODE_ATTR_va_rdev (1LL<< 0) /* 00000001 */
245 #define VNODE_ATTR_va_nlink (1LL<< 1) /* 00000002 */
246 #define VNODE_ATTR_va_total_size (1LL<< 2) /* 00000004 */
247 #define VNODE_ATTR_va_total_alloc (1LL<< 3) /* 00000008 */
248 #define VNODE_ATTR_va_data_size (1LL<< 4) /* 00000010 */
249 #define VNODE_ATTR_va_data_alloc (1LL<< 5) /* 00000020 */
250 #define VNODE_ATTR_va_iosize (1LL<< 6) /* 00000040 */
251 #define VNODE_ATTR_va_uid (1LL<< 7) /* 00000080 */
252 #define VNODE_ATTR_va_gid (1LL<< 8) /* 00000100 */
253 #define VNODE_ATTR_va_mode (1LL<< 9) /* 00000200 */
254 #define VNODE_ATTR_va_flags (1LL<<10) /* 00000400 */
255 #define VNODE_ATTR_va_acl (1LL<<11) /* 00000800 */
256 #define VNODE_ATTR_va_create_time (1LL<<12) /* 00001000 */
257 #define VNODE_ATTR_va_access_time (1LL<<13) /* 00002000 */
258 #define VNODE_ATTR_va_modify_time (1LL<<14) /* 00004000 */
259 #define VNODE_ATTR_va_change_time (1LL<<15) /* 00008000 */
260 #define VNODE_ATTR_va_backup_time (1LL<<16) /* 00010000 */
261 #define VNODE_ATTR_va_fileid (1LL<<17) /* 00020000 */
262 #define VNODE_ATTR_va_linkid (1LL<<18) /* 00040000 */
263 #define VNODE_ATTR_va_parentid (1LL<<19) /* 00080000 */
264 #define VNODE_ATTR_va_fsid (1LL<<20) /* 00100000 */
265 #define VNODE_ATTR_va_filerev (1LL<<21) /* 00200000 */
266 #define VNODE_ATTR_va_gen (1LL<<22) /* 00400000 */
267 #define VNODE_ATTR_va_encoding (1LL<<23) /* 00800000 */
268 #define VNODE_ATTR_va_type (1LL<<24) /* 01000000 */
269 #define VNODE_ATTR_va_name (1LL<<25) /* 02000000 */
270 #define VNODE_ATTR_va_uuuid (1LL<<26) /* 04000000 */
271 #define VNODE_ATTR_va_guuid (1LL<<27) /* 08000000 */
272 #define VNODE_ATTR_va_nchildren (1LL<<28) /* 10000000 */
273
274 #define VNODE_ATTR_BIT(n) (VNODE_ATTR_ ## n)
275 /*
276 * Read-only attributes.
277 */
278 #define VNODE_ATTR_RDONLY (VNODE_ATTR_BIT(va_rdev) | \
279 VNODE_ATTR_BIT(va_nlink) | \
280 VNODE_ATTR_BIT(va_total_size) | \
281 VNODE_ATTR_BIT(va_total_alloc) | \
282 VNODE_ATTR_BIT(va_data_alloc) | \
283 VNODE_ATTR_BIT(va_iosize) | \
284 VNODE_ATTR_BIT(va_fileid) | \
285 VNODE_ATTR_BIT(va_linkid) | \
286 VNODE_ATTR_BIT(va_parentid) | \
287 VNODE_ATTR_BIT(va_fsid) | \
288 VNODE_ATTR_BIT(va_filerev) | \
289 VNODE_ATTR_BIT(va_gen) | \
290 VNODE_ATTR_BIT(va_name) | \
291 VNODE_ATTR_BIT(va_type) | \
292 VNODE_ATTR_BIT(va_nchildren))
293 /*
294 * Attributes that can be applied to a new file object.
295 */
296 #define VNODE_ATTR_NEWOBJ (VNODE_ATTR_BIT(va_rdev) | \
297 VNODE_ATTR_BIT(va_uid) | \
298 VNODE_ATTR_BIT(va_gid) | \
299 VNODE_ATTR_BIT(va_mode) | \
300 VNODE_ATTR_BIT(va_flags) | \
301 VNODE_ATTR_BIT(va_acl) | \
302 VNODE_ATTR_BIT(va_create_time) | \
303 VNODE_ATTR_BIT(va_modify_time) | \
304 VNODE_ATTR_BIT(va_change_time) | \
305 VNODE_ATTR_BIT(va_encoding) | \
306 VNODE_ATTR_BIT(va_type) | \
307 VNODE_ATTR_BIT(va_uuuid) | \
308 VNODE_ATTR_BIT(va_guuid))
309
310 struct vnode_attr {
311 /* bitfields */
312 uint64_t va_supported;
313 uint64_t va_active;
314
315 /*
316 * Control flags. The low 16 bits are reserved for the
317 * ioflags being passed for truncation operations.
318 */
319 int va_vaflags;
320
321 /* traditional stat(2) parameter fields */
322 dev_t va_rdev; /* device id (device nodes only) */
323 uint64_t va_nlink; /* number of references to this file */
324 uint64_t va_total_size; /* size in bytes of all forks */
325 uint64_t va_total_alloc; /* disk space used by all forks */
326 uint64_t va_data_size; /* size in bytes of the main(data) fork */
327 uint64_t va_data_alloc; /* disk space used by the main(data) fork */
328 uint32_t va_iosize; /* optimal I/O blocksize */
329
330 /* file security information */
331 uid_t va_uid; /* owner UID */
332 gid_t va_gid; /* owner GID */
333 mode_t va_mode; /* posix permissions */
334 uint32_t va_flags; /* file flags */
335 struct kauth_acl *va_acl; /* access control list */
336
337 /* timestamps */
338 struct timespec va_create_time; /* time of creation */
339 struct timespec va_access_time; /* time of last access */
340 struct timespec va_modify_time; /* time of last data modification */
341 struct timespec va_change_time; /* time of last metadata change */
342 struct timespec va_backup_time; /* time of last backup */
343
344 /* file parameters */
345 uint64_t va_fileid; /* file unique ID in filesystem */
346 uint64_t va_linkid; /* file link unique ID */
347 uint64_t va_parentid; /* parent ID */
348 uint32_t va_fsid; /* filesystem ID */
349 uint64_t va_filerev; /* file revision counter */ /* XXX */
350 uint32_t va_gen; /* file generation count */ /* XXX - relationship of
351 * these two? */
352 /* misc parameters */
353 uint32_t va_encoding; /* filename encoding script */
354
355 enum vtype va_type; /* file type (create only) */
356 char * va_name; /* Name for ATTR_CMN_NAME; MAXPATHLEN bytes */
357 guid_t va_uuuid; /* file owner UUID */
358 guid_t va_guuid; /* file group UUID */
359
360 uint64_t va_nchildren; /* Number of items in a directory */
361 /* Meaningful for directories only */
362
363 /* add new fields here only */
364 };
365
366 /*
367 * Flags for va_vaflags.
368 */
369 #define VA_UTIMES_NULL 0x010000 /* utimes argument was NULL */
370 #define VA_EXCLUSIVE 0x020000 /* exclusive create request */
371
372
373
374 /*
375 * Modes. Some values same as Ixxx entries from inode.h for now.
376 */
377 #define VSUID 0x800 /*04000*/ /* set user id on execution */
378 #define VSGID 0x400 /*02000*/ /* set group id on execution */
379 #define VSVTX 0x200 /*01000*/ /* save swapped text even after use */
380 #define VREAD 0x100 /*00400*/ /* read, write, execute permissions */
381 #define VWRITE 0x080 /*00200*/
382 #define VEXEC 0x040 /*00100*/
383
384
385 /*
386 * Convert between vnode types and inode formats (since POSIX.1
387 * defines mode word of stat structure in terms of inode formats).
388 */
389 extern enum vtype iftovt_tab[];
390 extern int vttoif_tab[];
391 #define IFTOVT(mode) (iftovt_tab[((mode) & S_IFMT) >> 12])
392 #define VTTOIF(indx) (vttoif_tab[(int)(indx)])
393 #define MAKEIMODE(indx, mode) (int)(VTTOIF(indx) | (mode))
394
395
396 /*
397 * Flags to various vnode functions.
398 */
399 #define SKIPSYSTEM 0x0001 /* vflush: skip vnodes marked VSYSTEM */
400 #define FORCECLOSE 0x0002 /* vflush: force file closeure */
401 #define WRITECLOSE 0x0004 /* vflush: only close writeable files */
402 #define SKIPSWAP 0x0008 /* vflush: skip vnodes marked VSWAP */
403 #define SKIPROOT 0x0010 /* vflush: skip root vnodes marked VROOT */
404
405 #define DOCLOSE 0x0008 /* vclean: close active files */
406
407 #define V_SAVE 0x0001 /* vinvalbuf: sync file first */
408 #define V_SAVEMETA 0x0002 /* vinvalbuf: leave indirect blocks */
409
410 #define REVOKEALL 0x0001 /* vnop_revoke: revoke all aliases */
411
412 /* VNOP_REMOVE: do not delete busy files (Carbon remove file semantics) */
413 #define VNODE_REMOVE_NODELETEBUSY 0x0001
414
415 /* VNOP_READDIR flags: */
416 #define VNODE_READDIR_EXTENDED 0x0001 /* use extended directory entries */
417 #define VNODE_READDIR_REQSEEKOFF 0x0002 /* requires seek offset (cookies) */
418 #define VNODE_READDIR_SEEKOFF32 0x0004 /* seek offset values should fit in 32 bits */
419
420
421 #define NULLVP ((struct vnode *)NULL)
422
423 /*
424 * Macro/function to check for client cache inconsistency w.r.t. leasing.
425 */
426 #define LEASE_READ 0x1 /* Check lease for readers */
427 #define LEASE_WRITE 0x2 /* Check lease for modifiers */
428
429
430 #ifndef BSD_KERNEL_PRIVATE
431 struct vnodeop_desc;
432 #endif
433
434 extern int desiredvnodes; /* number of vnodes desired */
435
436
437 /*
438 * This structure is used to configure the new vnodeops vector.
439 */
440 struct vnodeopv_entry_desc {
441 struct vnodeop_desc *opve_op; /* which operation this is */
442 int (*opve_impl)(void *); /* code implementing this operation */
443 };
444 struct vnodeopv_desc {
445 /* ptr to the ptr to the vector where op should go */
446 int (***opv_desc_vector_p)(void *);
447 struct vnodeopv_entry_desc *opv_desc_ops; /* null terminated list */
448 };
449
450 /*
451 * A default routine which just returns an error.
452 */
453 int vn_default_error(void);
454
455 /*
456 * A generic structure.
457 * This can be used by bypass routines to identify generic arguments.
458 */
459 struct vnop_generic_args {
460 struct vnodeop_desc *a_desc;
461 /* other random data follows, presumably */
462 };
463
464 #ifndef _KAUTH_ACTION_T
465 typedef int kauth_action_t;
466 # define _KAUTH_ACTION_T
467 #endif
468
469 #include <sys/vnode_if.h>
470
471 __BEGIN_DECLS
472
473 errno_t vnode_create(int, size_t, void *, vnode_t *);
474 int vnode_addfsref(vnode_t);
475 int vnode_removefsref(vnode_t);
476
477 int vnode_hasdirtyblks(vnode_t);
478 int vnode_hascleanblks(vnode_t);
479 #define VNODE_ASYNC_THROTTLE 18
480 /* timeout is in 10 msecs and not hz tick based */
481 int vnode_waitforwrites(vnode_t, int, int, int, char *);
482 void vnode_startwrite(vnode_t);
483 void vnode_writedone(vnode_t);
484
485 enum vtype vnode_vtype(vnode_t);
486 uint32_t vnode_vid(vnode_t);
487 mount_t vnode_mountedhere(vnode_t vp);
488 mount_t vnode_mount(vnode_t);
489 dev_t vnode_specrdev(vnode_t);
490 void * vnode_fsnode(vnode_t);
491 void vnode_clearfsnode(vnode_t);
492
493 int vnode_isvroot(vnode_t);
494 int vnode_issystem(vnode_t);
495 int vnode_ismount(vnode_t);
496 int vnode_isreg(vnode_t);
497 int vnode_isdir(vnode_t);
498 int vnode_islnk(vnode_t);
499 int vnode_isfifo(vnode_t);
500 int vnode_isblk(vnode_t);
501 int vnode_ischr(vnode_t);
502
503 int vnode_ismountedon(vnode_t);
504 void vnode_setmountedon(vnode_t);
505 void vnode_clearmountedon(vnode_t);
506
507 int vnode_isnocache(vnode_t);
508 void vnode_setnocache(vnode_t);
509 void vnode_clearnocache(vnode_t);
510 int vnode_isnoreadahead(vnode_t);
511 void vnode_setnoreadahead(vnode_t);
512 void vnode_clearnoreadahead(vnode_t);
513 /* left only for compat reasons as User code depends on this from getattrlist, for ex */
514 void vnode_settag(vnode_t, int);
515 int vnode_tag(vnode_t);
516 int vnode_getattr(vnode_t vp, struct vnode_attr *vap, vfs_context_t ctx);
517 int vnode_setattr(vnode_t vp, struct vnode_attr *vap, vfs_context_t ctx);
518
519 #ifdef BSD_KERNEL_PRIVATE
520
521 /*
522 * Indicate that a file has multiple hard links. VFS will always call
523 * VNOP_LOOKUP on this vnode. Volfs will always ask for it's parent
524 * object ID (instead of using the v_parent pointer).
525 */
526 void vnode_set_hard_link(vnode_t vp);
527
528 vnode_t vnode_parent(vnode_t);
529 void vnode_setparent(vnode_t, vnode_t);
530 char * vnode_name(vnode_t);
531 void vnode_setname(vnode_t, char *);
532 int vnode_isnoflush(vnode_t);
533 void vnode_setnoflush(vnode_t);
534 void vnode_clearnoflush(vnode_t);
535 #endif
536
537 uint32_t vnode_vfsmaxsymlen(vnode_t);
538 int vnode_vfsisrdonly(vnode_t);
539 int vnode_vfstypenum(vnode_t);
540 void vnode_vfsname(vnode_t, char *);
541 int vnode_vfs64bitready(vnode_t);
542
543 proc_t vfs_context_proc(vfs_context_t);
544 ucred_t vfs_context_ucred(vfs_context_t);
545 int vfs_context_issuser(vfs_context_t);
546 int vfs_context_pid(vfs_context_t);
547 int vfs_context_issignal(vfs_context_t, sigset_t);
548 int vfs_context_suser(vfs_context_t);
549 int vfs_context_is64bit(vfs_context_t);
550 vfs_context_t vfs_context_create(vfs_context_t);
551 int vfs_context_rele(vfs_context_t);
552
553
554 int vflush(struct mount *mp, struct vnode *skipvp, int flags);
555 int vnode_get(vnode_t);
556 int vnode_getwithvid(vnode_t, int);
557 int vnode_put(vnode_t);
558 int vnode_ref(vnode_t);
559 void vnode_rele(vnode_t);
560 int vnode_isinuse(vnode_t, int);
561 void vnode_lock(vnode_t);
562 void vnode_unlock(vnode_t);
563 int vnode_recycle(vnode_t);
564 void vnode_reclaim(vnode_t);
565
566 #define VNODE_UPDATE_PARENT 0x01
567 #define VNODE_UPDATE_NAME 0x02
568 #define VNODE_UPDATE_CACHE 0x04
569 void vnode_update_identity(vnode_t vp, vnode_t dvp, char *name, int name_len, int name_hashval, int flags);
570
571 int vn_bwrite(struct vnop_bwrite_args *ap);
572
573 int vnode_authorize(vnode_t /*vp*/, vnode_t /*dvp*/, kauth_action_t, vfs_context_t);
574 int vnode_authattr(vnode_t, struct vnode_attr *, kauth_action_t *, vfs_context_t);
575 int vnode_authattr_new(vnode_t /*dvp*/, struct vnode_attr *, int /*noauth*/, vfs_context_t);
576 errno_t vnode_close(vnode_t, int, vfs_context_t);
577
578 int vn_getpath(struct vnode *vp, char *pathbuf, int *len);
579
580 /*
581 * Flags for the vnode_lookup and vnode_open
582 */
583 #define VNODE_LOOKUP_NOFOLLOW 0x01
584 #define VNODE_LOOKUP_NOCROSSMOUNT 0x02
585 #define VNODE_LOOKUP_DOWHITEOUT 0x04
586
587 errno_t vnode_lookup(const char *, int, vnode_t *, vfs_context_t);
588 errno_t vnode_open(const char *, int, int, int, vnode_t *, vfs_context_t);
589
590 /*
591 * exported vnode operations
592 */
593
594 int vnode_iterate(struct mount *, int, int (*)(struct vnode *, void *), void *);
595 /*
596 * flags passed into vnode_iterate
597 */
598 #define VNODE_RELOAD 0x01
599 #define VNODE_WAIT 0x02
600 #define VNODE_WRITEABLE 0x04
601 #define VNODE_WITHID 0x08
602 #define VNODE_NOLOCK_INTERNAL 0x10
603 #define VNODE_NODEAD 0x20
604 #define VNODE_NOSUSPEND 0x40
605 #define VNODE_ITERATE_ALL 0x80
606 #define VNODE_ITERATE_ACTIVE 0x100
607 #define VNODE_ITERATE_INACTIVE 0x200
608
609 /*
610 * return values from callback
611 */
612 #define VNODE_RETURNED 0 /* done with vnode, reference can be dropped */
613 #define VNODE_RETURNED_DONE 1 /* done with vnode, reference can be dropped, terminate iteration */
614 #define VNODE_CLAIMED 2 /* don't drop reference */
615 #define VNODE_CLAIMED_DONE 3 /* don't drop reference, terminate iteration */
616
617
618 struct stat;
619 int vn_stat(struct vnode *vp, struct stat *sb, kauth_filesec_t *xsec, vfs_context_t ctx);
620 int vn_stat_noauth(struct vnode *vp, struct stat *sb, kauth_filesec_t *xsec, vfs_context_t ctx);
621 int vn_revoke(vnode_t vp, int flags, vfs_context_t);
622 /* XXX BOGUS */
623 int vaccess(mode_t file_mode, uid_t uid, gid_t gid,
624 mode_t acc_mode, struct ucred *cred);
625
626
627 /* namecache function prototypes */
628 int cache_lookup(vnode_t dvp, vnode_t *vpp, struct componentname *cnp);
629 void cache_enter(vnode_t dvp, vnode_t vp, struct componentname *cnp);
630 void cache_purge(vnode_t vp);
631 void cache_purge_negatives(vnode_t vp);
632
633 /*
634 * Global string-cache routines. You can pass zero for nc_hash
635 * if you don't know it (add_name() will then compute the hash).
636 * There are no flags for now but maybe someday.
637 */
638 char *vfs_addname(const char *name, size_t len, u_int nc_hash, u_int flags);
639 int vfs_removename(const char *name);
640
641 __END_DECLS
642
643 #endif /* KERNEL */
644
645 #endif /* !_VNODE_H_ */