1 /* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)vnode.h 8.7 (Berkeley) 2/4/94 34 * $FreeBSD: src/sys/sys/vnode.h,v 1.111.2.19 2002/12/29 18:19:53 dillon Exp $ 35 * $DragonFly: src/sys/sys/vnode.h,v 1.39 2005/09/17 07:43:01 dillon Exp $ 36 */ 37 38 #ifndef _SYS_VNODE_H_ 39 #define _SYS_VNODE_H_ 40 41 #include <sys/queue.h> 42 #include <sys/lock.h> 43 #include <sys/select.h> 44 #include <sys/uio.h> 45 #include <sys/acl.h> 46 #include <sys/namecache.h> 47 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) 48 #include <sys/thread.h> 49 #endif 50 #include <sys/vfsops.h> 51 #include <sys/vfscache.h> 52 #include <sys/tree.h> 53 54 #include <machine/lock.h> 55 56 /* 57 * The vnode is the focus of all file activity in UNIX. There is a 58 * unique vnode allocated for each active file, each current directory, 59 * each mounted-on file, text file, and the root. 60 */ 61 62 /* 63 * Each underlying filesystem allocates its own private area and hangs 64 * it from v_data. If non-null, this area is freed in getnewvnode(). 65 */ 66 TAILQ_HEAD(buflists, buf); 67 68 /* 69 * Range locks protect offset ranges in files and directories at a high 70 * level, allowing the actual I/O to be broken down into smaller pieces. 71 * Range locks will eventually be integrated into the clustered cache 72 * coherency infrastructure. 73 * 74 * We use a simple data structure for now, but eventually this should 75 * probably be a btree or red-black tree. 76 */ 77 struct vrangelock; 78 79 TAILQ_HEAD(vrangelock_list, vrangelock); 80 81 struct vrangehead { 82 struct vrangelock_list vh_list; 83 }; 84 85 struct vrangelock { 86 TAILQ_ENTRY(vrangelock) vr_node; 87 int vr_flags; 88 off_t vr_offset; 89 off_t vr_length; 90 }; 91 92 #define RNGL_WAITING 0x0001 /* waiting for lock, else has lock */ 93 #define RNGL_CHECK 0x0002 /* check for work on unlock */ 94 #define RNGL_SHARED 0x0004 /* shared lock, else exclusive */ 95 #define RNGL_ONLIST 0x0008 /* sanity check */ 96 97 static __inline 98 void 99 vrange_init(struct vrangelock *vr, int flags, off_t offset, off_t length) 100 { 101 vr->vr_flags = flags; 102 vr->vr_offset = offset; 103 vr->vr_length = length; 104 } 105 106 #ifdef _KERNEL 107 108 void vrange_lock(struct vnode *vp, struct vrangelock *vr); 109 void vrange_unlock(struct vnode *vp, struct vrangelock *vr); 110 111 static __inline 112 void 113 vrange_lock_shared(struct vnode *vp, struct vrangelock *vr, 114 off_t offset, off_t length) 115 { 116 vrange_init(vr, RNGL_SHARED, offset, length); 117 vrange_lock(vp, vr); 118 } 119 120 static __inline 121 void 122 vrange_lock_excl(struct vnode *vp, struct vrangelock *vr, 123 off_t offset, off_t length) 124 { 125 vrange_init(vr, 0, offset, length); 126 vrange_lock(vp, vr); 127 } 128 129 #endif 130 131 /* 132 * The vnode infrastructure is being reorgranized. Most reference-related 133 * fields are locked by the BGL, and most file I/O related operations and 134 * vnode teardown functions are locked by the vnode lock. 135 * 136 * File read operations require a shared lock, file write operations require 137 * an exclusive lock. Most directory operations (read or write) currently 138 * require an exclusive lock due to the side effects stored in the directory 139 * inode (which we intend to fix). 140 * 141 * File reads and writes are further protected by a range lock. The intention 142 * is to be able to break I/O operations down into more easily managed pieces 143 * so vm_page arrays can be passed through rather then UIOs. This work will 144 * occur in multiple stages. The range locks will also eventually be used to 145 * deal with clustered cache coherency issues and, more immediately, to 146 * protect operations associated with the kernel-managed journaling module. 147 * 148 * NOTE: XXX v_opencount currently only used by specfs. It should be used 149 * universally. 150 * 151 * NOTE: The vnode operations vector, v_ops, is a double-indirect that 152 * typically points to &v_mount->mnt_vn_use_ops. We use a double 153 * pointer because mnt_vn_use_ops may change dynamically when e.g. 154 * journaling is turned on or off. 155 */ 156 RB_HEAD(buf_rb_tree, buf); 157 158 struct vnode { 159 u_long v_flag; /* vnode flags (see below) */ 160 int v_usecount; /* reference count of users */ 161 int v_writecount; /* reference count of writers */ 162 int v_holdcnt; /* page & buffer references */ 163 int v_opencount; /* number of explicit opens */ 164 u_long v_id; /* capability identifier */ 165 struct mount *v_mount; /* ptr to vfs we are in */ 166 struct vop_ops **v_ops; /* vnode operations vector */ 167 TAILQ_ENTRY(vnode) v_freelist; /* vnode freelist */ 168 TAILQ_ENTRY(vnode) v_nmntvnodes; /* vnodes for mount point */ 169 struct buf_rb_tree v_rbclean_tree; /* RB tree of clean bufs */ 170 struct buf_rb_tree v_rbdirty_tree; /* RB tree of dirty bufs */ 171 LIST_ENTRY(vnode) v_synclist; /* vnodes with dirty buffers */ 172 long v_numoutput; /* num of writes in progress */ 173 enum vtype v_type; /* vnode type */ 174 union { 175 struct mount *vu_mountedhere;/* ptr to mounted vfs (VDIR) */ 176 struct socket *vu_socket; /* unix ipc (VSOCK) */ 177 struct { 178 udev_t vu_udev; /* device number for attach */ 179 struct specinfo *vu_specinfo; /* device (VCHR, VBLK) */ 180 SLIST_ENTRY(vnode) vu_specnext; 181 } vu_spec; 182 struct fifoinfo *vu_fifoinfo; /* fifo (VFIFO) */ 183 } v_un; 184 struct nqlease *v_lease; /* Soft reference to lease */ 185 daddr_t v_lazyw; /* lazy write iterator */ 186 daddr_t v_lastw; /* last write (write cluster) */ 187 daddr_t v_cstart; /* start block of cluster */ 188 daddr_t v_lasta; /* last allocation */ 189 int v_clen; /* length of current cluster */ 190 struct vm_object *v_object; /* Place to store VM object */ 191 struct lock v_lock; /* file/dir ops lock */ 192 enum vtagtype v_tag; /* type of underlying data */ 193 void *v_data; /* private data for fs */ 194 struct namecache_list v_namecache; /* associated nc entries */ 195 struct { 196 struct lwkt_token vpi_token; /* lock to protect below */ 197 struct selinfo vpi_selinfo; /* identity of poller(s) */ 198 short vpi_events; /* what they are looking for */ 199 short vpi_revents; /* what has happened */ 200 } v_pollinfo; 201 struct vmresident *v_resident; /* optional vmresident */ 202 struct vrangehead v_range; /* range lock */ 203 #ifdef DEBUG_LOCKS 204 const char *filename; /* Source file doing locking */ 205 int line; /* Line number doing locking */ 206 #endif 207 void *v_xaddr; 208 }; 209 #define v_mountedhere v_un.vu_mountedhere 210 #define v_socket v_un.vu_socket 211 #define v_udev v_un.vu_spec.vu_udev 212 #define v_rdev v_un.vu_spec.vu_specinfo 213 #define v_specnext v_un.vu_spec.vu_specnext 214 #define v_fifoinfo v_un.vu_fifoinfo 215 216 #define VN_POLLEVENT(vp, events) \ 217 do { \ 218 if ((vp)->v_pollinfo.vpi_events & (events)) \ 219 vn_pollevent((vp), (events)); \ 220 } while (0) 221 222 /* 223 * Vnode flags. 224 */ 225 #define VROOT 0x00001 /* root of its file system */ 226 #define VTEXT 0x00002 /* vnode is a pure text prototype */ 227 #define VSYSTEM 0x00004 /* vnode being used by kernel */ 228 #define VISTTY 0x00008 /* vnode represents a tty */ 229 #define VCTTYISOPEN 0x00010 /* controlling terminal tty is open */ 230 #define VCKPT 0x00020 /* checkpoint-restored vnode */ 231 /* open for business 0x00040 */ 232 /* open for business 0x00080 */ 233 /* open for business 0x00100 */ 234 /* open for business 0x00200 */ 235 #define VBWAIT 0x00400 /* waiting for output to complete */ 236 /* open for business 0x00800 */ 237 /* open for business 0x01000 */ 238 #define VOBJBUF 0x02000 /* Allocate buffers in VM object */ 239 #define VINACTIVE 0x04000 /* The vnode is inactive */ 240 #define VAGE 0x08000 /* Insert vnode at head of free list */ 241 #define VOLOCK 0x10000 /* vnode is locked waiting for an object */ 242 #define VOWANT 0x20000 /* a process is waiting for VOLOCK */ 243 #define VRECLAIMED 0x40000 /* This vnode has been destroyed */ 244 #define VFREE 0x80000 /* This vnode is on the freelist */ 245 /* open for business 0x100000 */ 246 #define VONWORKLST 0x200000 /* On syncer work-list */ 247 #define VMOUNT 0x400000 /* Mount in progress */ 248 #define VOBJDIRTY 0x800000 /* object might be dirty */ 249 250 /* 251 * vmntvnodescan() flags 252 */ 253 #define VMSC_GETVP 1 254 #define VMSC_GETVX 2 255 #define VMSC_REFVP 3 256 #define VMSC_NOWAIT 0x10 257 258 /* 259 * Flags for ioflag. (high 16 bits used to ask for read-ahead and 260 * help with write clustering) 261 */ 262 #define IO_UNIT 0x0001 /* do I/O as atomic unit */ 263 #define IO_APPEND 0x0002 /* append write to end */ 264 #define IO_SYNC 0x0004 /* do I/O synchronously */ 265 #define IO_NODELOCKED 0x0008 /* underlying node already locked */ 266 #define IO_NDELAY 0x0010 /* FNDELAY flag set in file table */ 267 #define IO_VMIO 0x0020 /* data already in VMIO space */ 268 #define IO_INVAL 0x0040 /* invalidate after I/O */ 269 #define IO_ASYNC 0x0080 /* bawrite rather then bdwrite */ 270 #define IO_DIRECT 0x0100 /* attempt to bypass buffer cache */ 271 #define IO_NOWDRAIN 0x0200 /* do not block on wdrain */ 272 #define IO_CORE 0x0400 /* I/O is part of core dump */ 273 274 #define IO_SEQMAX 0x7F /* seq heuristic max value */ 275 #define IO_SEQSHIFT 16 /* seq heuristic in upper 16 bits */ 276 277 /* 278 * Modes. Note that these V-modes must match file S_I*USR, SUID, SGID, 279 * and SVTX flag bits. 280 * 281 * VCREATE, VDELETE, and VEXCL may only be used in naccess() calls. 282 */ 283 #define VDELETE 040000 /* delete if the file/dir exists */ 284 #define VCREATE 020000 /* create if the file/dir does not exist */ 285 #define VEXCL 010000 /* error if the file/dir already exists */ 286 287 #define VSUID 04000 /* set user id on execution */ 288 #define VSGID 02000 /* set group id on execution */ 289 #define VSVTX 01000 /* save swapped text even after use */ 290 #define VREAD 00400 /* read, write, execute permissions */ 291 #define VWRITE 00200 292 #define VEXEC 00100 293 294 /* 295 * Token indicating no attribute value yet assigned. 296 */ 297 #define VNOVAL (-1) 298 299 /* 300 * LK_TIMELOCK timeout for vnode locks (used mainly by the pageout daemon) 301 */ 302 #define VLKTIMEOUT (hz / 20 + 1) 303 304 #ifdef _KERNEL 305 306 /* 307 * Convert between vnode types and inode formats (since POSIX.1 308 * defines mode word of stat structure in terms of inode formats). 309 */ 310 extern enum vtype iftovt_tab[]; 311 extern int vttoif_tab[]; 312 #define IFTOVT(mode) (iftovt_tab[((mode) & S_IFMT) >> 12]) 313 #define VTTOIF(indx) (vttoif_tab[(int)(indx)]) 314 #define MAKEIMODE(indx, mode) (int)(VTTOIF(indx) | (mode)) 315 316 /* 317 * Flags to various vnode functions. 318 */ 319 #define SKIPSYSTEM 0x0001 /* vflush: skip vnodes marked VSYSTEM */ 320 #define FORCECLOSE 0x0002 /* vflush: force file closure */ 321 #define WRITECLOSE 0x0004 /* vflush: only close writable files */ 322 #define DOCLOSE 0x0008 /* vclean: close active files */ 323 #define V_SAVE 0x0001 /* vinvalbuf: sync file first */ 324 #define REVOKEALL 0x0001 /* vop_revoke: revoke all aliases */ 325 326 #ifdef DIAGNOSTIC 327 #define VATTR_NULL(vap) vattr_null(vap) 328 #else 329 #define VATTR_NULL(vap) (*(vap) = va_null) /* initialize a vattr */ 330 #endif /* DIAGNOSTIC */ 331 332 #define NULLVP ((struct vnode *)NULL) 333 334 #define VNODEOP_SET(f) \ 335 C_SYSINIT(f##init, SI_SUB_VFS, SI_ORDER_SECOND, vfs_add_vnodeops_sysinit, &f); \ 336 C_SYSUNINIT(f##uninit, SI_SUB_VFS, SI_ORDER_SECOND,vfs_rm_vnodeops_sysinit, &f); 337 338 /* 339 * Global vnode data. 340 */ 341 extern struct vnode *rootvnode; /* root (i.e. "/") vnode */ 342 extern struct namecache *rootncp; /* root (i.e. "/") namecache */ 343 extern int desiredvnodes; /* number of vnodes desired */ 344 extern time_t syncdelay; /* max time to delay syncing data */ 345 extern time_t filedelay; /* time to delay syncing files */ 346 extern time_t dirdelay; /* time to delay syncing directories */ 347 extern time_t metadelay; /* time to delay syncing metadata */ 348 extern struct vm_zone *namei_zone; 349 extern int prtactive; /* nonzero to call vprint() */ 350 extern struct vattr va_null; /* predefined null vattr structure */ 351 extern int vfs_ioopt; 352 extern int numvnodes; 353 extern int freevnodes; 354 extern int vfs_fastdev; /* fast specfs device access */ 355 356 /* 357 * Macro/function to check for client cache inconsistency w.r.t. leasing. 358 */ 359 #define LEASE_READ 0x1 /* Check lease for readers */ 360 #define LEASE_WRITE 0x2 /* Check lease for modifiers */ 361 362 363 extern void (*lease_updatetime) (int deltat); 364 365 #endif /* _KERNEL */ 366 367 /* 368 * Mods for extensibility. 369 */ 370 371 /* 372 * Flags for vdesc_flags: 373 */ 374 #define VDESC_MAX_VPS 8 375 /* Low order 8 flag bits are reserved for willrele flags for vp arguments. */ 376 #define VDESC_VP0_WILLRELE 0x00000001 377 #define VDESC_VP1_WILLRELE 0x00000002 378 #define VDESC_VP2_WILLRELE 0x00000004 379 #define VDESC_VP3_WILLRELE 0x00000008 380 #define VDESC_VP4_WILLRELE 0x00000010 381 #define VDESC_VP5_WILLRELE 0x00000020 382 #define VDESC_VP6_WILLRELE 0x00000040 383 #define VDESC_VP7_WILLRELE 0x00000080 384 #define VDESC_NOMAP_VPP 0x00000100 385 #define VDESC_VPP_WILLRELE 0x00000200 386 #define VDESC_VP0_WILLUNLOCK 0x00010000 387 #define VDESC_VP1_WILLUNLOCK 0x00020000 388 #define VDESC_VP2_WILLUNLOCK 0x00040000 389 #define VDESC_VP3_WILLUNLOCK 0x00080000 390 #define VDESC_VP4_WILLUNLOCK 0x00100000 391 #define VDESC_VP5_WILLUNLOCK 0x00200000 392 #define VDESC_VP6_WILLUNLOCK 0x00400000 393 #define VDESC_VP7_WILLUNLOCK 0x00800000 394 395 /* 396 * VDESC_NO_OFFSET is used to identify the end of the offset list 397 * and in places where no such field exists. 398 */ 399 #define VDESC_NO_OFFSET -1 400 401 /* 402 * This structure describes the vnode operation taking place. 403 */ 404 struct vnodeop_desc { 405 int vdesc_offset; /* offset in vector--first for speed */ 406 char *vdesc_name; /* a readable name for debugging */ 407 int vdesc_flags; /* VDESC_* flags */ 408 409 /* 410 * These ops are used by bypass routines to map and locate arguments. 411 * Creds and procs are not needed in bypass routines, but sometimes 412 * they are useful to (for example) transport layers. 413 * Nameidata is useful because it has a cred in it. 414 */ 415 int *vdesc_vp_offsets; /* list ended by VDESC_NO_OFFSET */ 416 int vdesc_vpp_offset; /* return vpp location */ 417 int vdesc_cred_offset; /* cred location, if any */ 418 int vdesc_proc_offset; /* proc location, if any */ 419 int vdesc_componentname_offset; /* if any */ 420 }; 421 422 #ifdef _KERNEL 423 /* 424 * A list of all the operation descs. 425 */ 426 extern struct vnodeop_desc *vnodeop_descs[]; 427 428 /* 429 * Interlock for scanning list of vnodes attached to a mountpoint 430 */ 431 extern struct lwkt_token mntvnode_token; 432 433 /* 434 * This macro is very helpful in defining those offsets in the vdesc struct. 435 * 436 * This is stolen from X11R4. I ignored all the fancy stuff for 437 * Crays, so if you decide to port this to such a serious machine, 438 * you might want to consult Intrinsic.h's XtOffset{,Of,To}. 439 */ 440 #define VOPARG_OFFSET(p_type,field) \ 441 ((int) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL))) 442 #define VOPARG_OFFSETOF(s_type,field) \ 443 VOPARG_OFFSET(s_type*,field) 444 #define VOPARG_OFFSETTO(S_TYPE,S_OFFSET,STRUCT_P) \ 445 ((S_TYPE)(((char*)(STRUCT_P))+(S_OFFSET))) 446 447 typedef int (*vnodeopv_entry_t)(struct vop_generic_args *); 448 449 /* 450 * This structure is used to configure the new vnodeops vector. The entry 451 * descriptor describes a patricular VOP function while the operations 452 * vector descriptor recursively describes arrays of entry descriptors. 453 */ 454 struct vnodeopv_entry_desc { 455 struct vnodeop_desc *opve_op; 456 vnodeopv_entry_t opve_func; 457 }; 458 459 struct vnodeopv_desc { 460 struct vop_ops **opv_desc_vector; /* vect to allocate/fill*/ 461 struct vnodeopv_entry_desc *opv_desc_ops; /* null terminated list */ 462 int opv_flags; 463 }; 464 465 struct vnodeopv_node { 466 TAILQ_ENTRY(vnodeopv_node) entry; 467 struct vop_ops *ops; /* allocated vector */ 468 struct vnodeopv_entry_desc *descs; /* null terminated list */ 469 }; 470 471 #ifdef DEBUG_VFS_LOCKS 472 /* 473 * Macros to aid in tracing VFS locking problems. Not totally 474 * reliable since if the process sleeps between changing the lock 475 * state and checking it with the assert, some other process could 476 * change the state. They are good enough for debugging a single 477 * filesystem using a single-threaded test. I find that 'cvs co src' 478 * is a pretty good test. 479 */ 480 481 /* 482 * [dfr] Kludge until I get around to fixing all the vfs locking. 483 */ 484 #define IS_LOCKING_VFS(vp) ((vp)->v_tag == VT_UFS \ 485 || (vp)->v_tag == VT_MFS \ 486 || (vp)->v_tag == VT_NFS \ 487 || (vp)->v_tag == VT_LFS \ 488 || (vp)->v_tag == VT_ISOFS \ 489 || (vp)->v_tag == VT_MSDOSFS) 490 491 #define ASSERT_VOP_LOCKED(vp, str) assert_vop_locked(vp, str) 492 #define ASSERT_VOP_UNLOCKED(vp, str) assert_vop_unlocked(vp, str); 493 494 #define ASSERT_VOP_ELOCKED(vp, str) \ 495 do { \ 496 struct vnode *_vp = (vp); \ 497 \ 498 if (_vp && IS_LOCKING_VFS(_vp) && \ 499 VOP_ISLOCKED(_vp, curthread) != LK_EXCLUSIVE) \ 500 panic("%s: %p is not exclusive locked but should be", \ 501 str, _vp); \ 502 } while (0) 503 504 #define ASSERT_VOP_ELOCKED_OTHER(vp, str) \ 505 do { \ 506 struct vnode *_vp = (vp); \ 507 \ 508 if (_vp && IS_LOCKING_VFS(_vp) && \ 509 VOP_ISLOCKED(_vp, curthread) != LK_EXCLOTHER) \ 510 panic("%s: %p is not exclusive locked by another proc", \ 511 str, _vp); \ 512 } while (0) 513 514 #define ASSERT_VOP_SLOCKED(vp, str) \ 515 do { \ 516 struct vnode *_vp = (vp); \ 517 \ 518 if (_vp && IS_LOCKING_VFS(_vp) && \ 519 VOP_ISLOCKED(_vp, NULL) != LK_SHARED) \ 520 panic("%s: %p is not locked shared but should be", \ 521 str, _vp); \ 522 } while (0) 523 524 void assert_vop_locked(struct vnode *vp, const char *str); 525 void assert_vop_unlocked(struct vnode *vp, const char *str); 526 527 #else 528 529 #define ASSERT_VOP_LOCKED(vp, str) 530 #define ASSERT_VOP_UNLOCKED(vp, str) 531 532 #endif /* DEBUG_VFS_LOCKS */ 533 534 /* 535 * VOCALL calls an op given an ops vector. We break it out because BSD's 536 * vclean changes the ops vector and then wants to call ops with the old 537 * vector. 538 */ 539 540 typedef int (*vocall_func_t)(struct vop_generic_args *); 541 542 /* 543 * This call executes the vops vector for the offset stored in the ap's 544 * descriptor of the passed vops rather then the one related to the 545 * ap's vop_ops structure. It is used to chain VOPS calls on behalf of 546 * filesystems from a VFS's context ONLY (that is, from a VFS's own vops 547 * vector function). 548 */ 549 #define VOCALL(vops, ap) \ 550 (*(vocall_func_t *)((char *)(vops)+((ap)->a_desc->vdesc_offset)))(ap) 551 552 #define VDESC(OP) (& __CONCAT(OP,_desc)) 553 #define VOFFSET(OP) (VDESC(OP)->vdesc_offset) 554 555 /* 556 * VMIO support inline 557 */ 558 559 extern int vmiodirenable; 560 561 static __inline int 562 vn_canvmio(struct vnode *vp) 563 { 564 if (vp && (vp->v_type == VREG || (vmiodirenable && vp->v_type == VDIR))) 565 return(TRUE); 566 return(FALSE); 567 } 568 569 /* 570 * Public vnode manipulation functions. 571 */ 572 struct file; 573 struct mount; 574 struct nlookupdata; 575 struct proc; 576 struct thread; 577 struct stat; 578 struct ucred; 579 struct uio; 580 struct vattr; 581 struct vnode; 582 struct vop_bwrite_args; 583 584 extern int (*lease_check_hook) (struct vop_lease_args *); 585 586 void addaliasu (struct vnode *vp, udev_t nvp_udev); 587 int v_associate_rdev(struct vnode *vp, dev_t dev); 588 void v_release_rdev(struct vnode *vp); 589 int bdevvp (dev_t dev, struct vnode **vpp); 590 struct vnode *allocvnode(int lktimeout, int lkflags); 591 int getnewvnode (enum vtagtype tag, struct mount *mp, 592 struct vnode **vpp, int timo, int lkflags); 593 int getspecialvnode (enum vtagtype tag, struct mount *mp, 594 struct vop_ops **ops, struct vnode **vpp, int timo, 595 int lkflags); 596 int lease_check (struct vop_lease_args *ap); 597 int spec_vnoperate (struct vop_generic_args *); 598 int speedup_syncer (void); 599 void vattr_null (struct vattr *vap); 600 int vcount (struct vnode *vp); 601 int vfinddev (dev_t dev, enum vtype type, struct vnode **vpp); 602 void vfs_add_vnodeops_sysinit (const void *); 603 void vfs_rm_vnodeops_sysinit (const void *); 604 void vfs_add_vnodeops(struct mount *, struct vop_ops **, 605 struct vnodeopv_entry_desc *, int); 606 void vfs_rm_vnodeops(struct vop_ops **); 607 int vflush (struct mount *mp, int rootrefs, int flags); 608 int vmntvnodescan(struct mount *mp, int flags, 609 int (*fastfunc)(struct mount *mp, struct vnode *vp, void *data), 610 int (*slowfunc)(struct mount *mp, struct vnode *vp, void *data), 611 void *data); 612 void insmntque(struct vnode *vp, struct mount *mp); 613 614 void vclean (struct vnode *vp, int flags, struct thread *td); 615 void vgone (struct vnode *vp); 616 int vinvalbuf (struct vnode *vp, int save, 617 struct thread *td, int slpflag, int slptimeo); 618 int vtruncbuf (struct vnode *vp, struct thread *td, 619 off_t length, int blksize); 620 int vfsync(struct vnode *vp, int waitfor, int passes, daddr_t lbn, 621 int (*checkdef)(struct buf *), 622 int (*waitoutput)(struct vnode *, struct thread *)); 623 void vprint (char *label, struct vnode *vp); 624 int vrecycle (struct vnode *vp, struct thread *td); 625 int vn_close (struct vnode *vp, int flags, struct thread *td); 626 int vn_isdisk (struct vnode *vp, int *errp); 627 int vn_lock (struct vnode *vp, int flags, struct thread *td); 628 #ifdef DEBUG_LOCKS 629 int debug_vn_lock (struct vnode *vp, int flags, struct thread *td, 630 const char *filename, int line); 631 #define vn_lock(vp,flags,p) debug_vn_lock(vp,flags,p,__FILE__,__LINE__) 632 #endif 633 634 int vn_get_namelen(struct vnode *, int *); 635 void vn_setspecops (struct file *fp); 636 int vn_fullpath (struct proc *p, struct vnode *vn, char **retbuf, char **freebuf); 637 int vn_open (struct nlookupdata *ndp, struct file *fp, int fmode, int cmode); 638 void vn_pollevent (struct vnode *vp, int events); 639 void vn_pollgone (struct vnode *vp); 640 int vn_pollrecord (struct vnode *vp, struct thread *td, int events); 641 int vn_rdwr (enum uio_rw rw, struct vnode *vp, caddr_t base, 642 int len, off_t offset, enum uio_seg segflg, int ioflg, 643 struct ucred *cred, int *aresid, struct thread *td); 644 int vn_rdwr_inchunks (enum uio_rw rw, struct vnode *vp, caddr_t base, 645 int len, off_t offset, enum uio_seg segflg, int ioflg, 646 struct ucred *cred, int *aresid, struct thread *td); 647 int vn_stat (struct vnode *vp, struct stat *sb, struct thread *td); 648 dev_t vn_todev (struct vnode *vp); 649 int vfs_object_create (struct vnode *vp, struct thread *td); 650 void vfs_timestamp (struct timespec *); 651 int vn_writechk (struct vnode *vp); 652 int vop_stdbwrite (struct vop_bwrite_args *ap); 653 int vop_stdislocked (struct vop_islocked_args *ap); 654 int vop_stdlock (struct vop_lock_args *ap); 655 int vop_stdrlock (struct vop_lock_args *ap); 656 int vop_stdunlock (struct vop_unlock_args *ap); 657 int vop_nopoll (struct vop_poll_args *ap); 658 int vop_stdpathconf (struct vop_pathconf_args *ap); 659 int vop_stdpoll (struct vop_poll_args *ap); 660 int vop_stdrevoke (struct vop_revoke_args *ap); 661 int vop_eopnotsupp (struct vop_generic_args *ap); 662 int vop_ebadf (struct vop_generic_args *ap); 663 int vop_einval (struct vop_generic_args *ap); 664 int vop_enotty (struct vop_generic_args *ap); 665 int vop_defaultop (struct vop_generic_args *ap); 666 int vop_null (struct vop_generic_args *ap); 667 int vop_panic (struct vop_generic_args *ap); 668 int vop_stdcreatevobject (struct vop_createvobject_args *ap); 669 int vop_stddestroyvobject (struct vop_destroyvobject_args *ap); 670 int vop_stdgetvobject (struct vop_getvobject_args *ap); 671 int vop_write_dirent(int *, struct uio *, ino_t, uint8_t, uint16_t, 672 const char *); 673 674 int vop_compat_nresolve(struct vop_nresolve_args *ap); 675 int vop_compat_nlookupdotdot(struct vop_nlookupdotdot_args *ap); 676 int vop_compat_ncreate(struct vop_ncreate_args *ap); 677 int vop_compat_nmkdir(struct vop_nmkdir_args *ap); 678 int vop_compat_nmknod(struct vop_nmknod_args *ap); 679 int vop_compat_nlink(struct vop_nlink_args *ap); 680 int vop_compat_nsymlink(struct vop_nsymlink_args *ap); 681 int vop_compat_nwhiteout(struct vop_nwhiteout_args *ap); 682 int vop_compat_nremove(struct vop_nremove_args *ap); 683 int vop_compat_nrmdir(struct vop_nrmdir_args *ap); 684 int vop_compat_nrename(struct vop_nrename_args *ap); 685 686 int vx_lock (struct vnode *vp); 687 void vx_unlock (struct vnode *vp); 688 int vx_get (struct vnode *vp); 689 int vx_get_nonblock (struct vnode *vp); 690 void vx_put (struct vnode *vp); 691 int vget (struct vnode *vp, int lockflag, struct thread *td); 692 void vput (struct vnode *vp); 693 void vhold (struct vnode *); 694 void vdrop (struct vnode *); 695 void vref (struct vnode *vp); 696 void vrele (struct vnode *vp); 697 void vsetflags (struct vnode *vp, int flags); 698 void vclrflags (struct vnode *vp, int flags); 699 700 void vfs_subr_init(void); 701 void vfs_mount_init(void); 702 void vfs_lock_init(void); 703 void vfs_sync_init(void); 704 705 void vn_syncer_add_to_worklist(struct vnode *, int); 706 void vnlru_proc_wait(void); 707 708 extern struct vop_ops *default_vnode_vops; 709 extern struct vop_ops *spec_vnode_vops; 710 extern struct vop_ops *dead_vnode_vops; 711 712 #endif /* _KERNEL */ 713 714 #endif /* !_SYS_VNODE_H_ */ 715