diff options
Diffstat (limited to 'static/netbsd/man9/vnode.9')
| -rw-r--r-- | static/netbsd/man9/vnode.9 | 780 |
1 files changed, 780 insertions, 0 deletions
diff --git a/static/netbsd/man9/vnode.9 b/static/netbsd/man9/vnode.9 new file mode 100644 index 00000000..88710951 --- /dev/null +++ b/static/netbsd/man9/vnode.9 @@ -0,0 +1,780 @@ +.\" $NetBSD: vnode.9,v 1.84 2022/03/19 13:53:32 hannken Exp $ +.\" +.\" Copyright (c) 2001, 2005, 2006 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to The NetBSD Foundation +.\" by Gregory McGarry. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +.\" POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd March 19, 2022 +.Dt VNODE 9 +.Os +.Sh NAME +.Nm vnode , +.Nm vref , +.Nm vrele , +.Nm vrele_async , +.Nm vput , +.Nm vhold , +.Nm holdrele , +.Nm vcache_get , +.Nm vcache_new , +.Nm vcache_rekey_enter , +.Nm vcache_rekey_exit , +.Nm vrecycle , +.Nm vgone , +.Nm vgonel , +.Nm vdead_check , +.Nm vflush , +.Nm bdevvp , +.Nm cdevvp , +.Nm vfinddev , +.Nm vdevgone , +.Nm vwakeup , +.Nm vflushbuf , +.Nm vinvalbuf , +.Nm vtruncbuf , +.Nm vprint +.Nd kernel representation of a file or directory +.Sh SYNOPSIS +.In sys/param.h +.In sys/vnode.h +.Ft void +.Fn vref "struct vnode *vp" +.Ft void +.Fn vrele "struct vnode *vp" +.Ft void +.Fn vrele_async "struct vnode *vp" +.Ft void +.Fn vput "struct vnode *vp" +.Ft void +.Fn vhold "struct vnode *vp" +.Ft void +.Fn holdrele "struct vnode *vp" +.Ft int +.Fn vcache_get "struct mount *mp" "const void *key" "size_t key_len" "struct vnode **vpp" +.Ft int +.Fn vcache_new "struct mount *mp" "struct vnode *dvp" "struct vattr *vap" "kauth_cred_t cred" "void *extra" "struct vnode **vpp" +.Ft int +.Fn vcache_rekey_enter "struct mount *mp" "struct vnode *vp" "const void *old_key" "size_t old_key_len" "const void *new_key" "size_t new_key_len" +.Ft void +.Fn vcache_rekey_exit "struct mount *mp" "struct vnode *vp" "const void *old_key" "size_t old_key_len" "const void *new_key" "size_t new_key_len" +.Ft int +.Fn vrecycle "struct vnode *vp" +.Ft void +.Fn vgone "struct vnode *vp" +.Ft void +.Fn vgonel "struct vnode *vp" "struct lwp *l" +.Ft int +.Fn vdead_check "struct vnode *vp" "int flags" +.Ft int +.Fn vflush "struct mount *mp" "struct vnode *skipvp" "int flags" +.Ft int +.Fn bdevvp "dev_t dev" "struct vnode **vpp" +.Ft int +.Fn cdevvp "dev_t dev" "struct vnode **vpp" +.Ft int +.Fn vfinddev "dev_t dev" "enum vtype" "struct vnode **vpp" +.Ft void +.Fn vdevgone "int maj" "int minl" "int minh" "enum vtype type" +.Ft void +.Fn vwakeup "struct buf *bp" +.Ft int +.Fn vflushbuf "struct vnode *vp" "int sync" +.Ft int +.Fn vinvalbuf "struct vnode *vp" "int flags" "kauth_cred_t cred" "struct lwp *l" "int slpflag" "int slptimeo" +.Ft int +.Fn vtruncbuf "struct vnode *vp" "daddr_t lbn" "int slpflag" "int slptimeo" +.Ft void +.Fn vprint "const char *label" "struct vnode *vp" +.Sh DESCRIPTION +A +.Em vnode +represents an on-disk file in use by the system. +Each +.Xr vfs 9 +file system provides a set of +.Xr vnodeops 9 +operations on vnodes, invoked by file-system-independent system calls +and supported by file-system-independent library routines. +.Pp +Each mounted file system provides a vnode for the root of the file +system, via +.Xr VFS_ROOT 9 . +Other vnodes are obtained by +.Xr VOP_LOOKUP 9 . +Users of vnodes usually invoke these indirectly via +.Xr namei 9 +to obtain vnodes from paths. +.Pp +Each file system usually maintains a cache mapping recently used inode +numbers, or the equivalent, to vnodes, and a cache mapping recently +used file names to vnodes. +If memory is scarce, the system may decide to +.Em reclaim +an unused cached vnode, calling +.Xr VOP_RECLAIM 9 +to remove it from the caches and to free file-system-specific memory +associated with it. +A file system may also choose to immediately reclaim a cached vnode +once it is unused, in +.Xr VOP_INACTIVE 9 , +if the vnode has been deleted on disk. +.Pp +When a file system retrieves a vnode from a cache, the vnode may not +have any users, and another thread in the system may be simultaneously +deciding to reclaim it. +Thus, to retrieve a vnode from a cache, one must use +.Fn vcache_get , +not +.Fn vref , +to acquire the first reference. +.Pp +The vnode has the following structure: +.Bd -literal +struct vnode { + struct uvm_object v_uobj; /* the VM object */ + kcondvar_t v_cv; /* synchronization */ + voff_t v_size; /* size of file */ + voff_t v_writesize; /* new size after write */ + int v_iflag; /* VI_* flags */ + int v_vflag; /* VV_* flags */ + int v_uflag; /* VU_* flags */ + int v_numoutput; /* # of pending writes */ + int v_writecount; /* ref count of writers */ + int v_holdcnt; /* page & buffer refs */ + struct mount *v_mount; /* ptr to vfs we are in */ + int (**v_op)(void *); /* vnode operations vector */ + struct buflists v_cleanblkhd; /* clean blocklist head */ + struct buflists v_dirtyblkhd; /* dirty blocklist head */ + union { + struct mount *vu_mountedhere;/* ptr to vfs (VDIR) */ + struct socket *vu_socket; /* unix ipc (VSOCK) */ + struct specnode *vu_specnode; /* device (VCHR, VBLK) */ + struct fifoinfo *vu_fifoinfo; /* fifo (VFIFO) */ + struct uvm_ractx *vu_ractx; /* read-ahead ctx (VREG) */ + } v_un; + enum vtype v_type; /* vnode type */ + enum vtagtype v_tag; /* type of underlying data */ + void *v_data; /* private data for fs */ + struct klist v_klist; /* notes attached to vnode */ +}; +.Ed +.Pp +Most members of the vnode structure should be treated as opaque and +only manipulated using the proper functions. +There are some rather common exceptions detailed throughout this page. +.Pp +Files and file systems are inextricably linked with the virtual memory +system and +.Em v_uobj +contains the data maintained by the virtual memory system. +For compatibility with code written before the integration of +.Xr uvm 9 +into +.Nx , +C-preprocessor directives are used to alias the members of +.Em v_uobj . +.Pp +Vnode flags are recorded by +.Em v_iflag , +.Em v_vflag +and +.Em v_uflag . +Valid flags are: +.Pp +.Bl -tag -offset indent -width ".Dv VI_WRMAPDIRTY" -compact +.It Dv VV_ROOT +This vnode is the root of its file system. +.It Dv VV_SYSTEM +This vnode is being used by the kernel; only used to skip quota files in +.Fn vflush . +.It Dv VV_ISTTY +This vnode represents a tty; used when reading dead vnodes. +.It Dv VV_MAPPED +This vnode might have user mappings. +.It Dv VV_MPSAFE +This file system is MP safe. +.It Dv VI_TEXT +This vnode is a pure text prototype. +.It Dv VI_EXECMAP +This vnode has executable mappings. +.It Dv VI_WRMAP +This vnode might have PROT_WRITE user mappings. +.It Dv VI_WRMAPDIRTY +This vnode might have dirty pages due to +.Dv VWRITEMAP . +.It Dv VI_XLOCK +This vnode is currently locked to change underlying type. +.It Dv VI_ONWORKLST +This vnode is on syncer work-list. +.It Dv VI_MARKER +A dummy marker vnode. +.It Dv VI_CLEAN +This vnode has been reclaimed and is no longer attached to a file system. +.It Dv VU_DIROP +This vnode is involved in a directory operation. +This flag is used exclusively by LFS. +.El +.Pp +The +.Dv VI_XLOCK +flag is used to prevent multiple processes from entering +the vnode reclamation code. +It is also used as a flag to indicate that reclamation is in progress. +Before +.Em v_iflag +can be modified, the +.Em v_interlock +mutex must be acquired. +See +.Xr lock 9 +for details on the kernel locking API. +.Pp +Each vnode has three reference counts: +.Em v_usecount , +.Em v_writecount +and +.Em v_holdcnt . +The first is the number of active references within the +kernel to the vnode. +This count is maintained by +.Fn vref , +.Fn vrele , +.Fn vrele_async , +and +.Fn vput . +The second is the number of active references within the kernel to the +vnode performing write access to the file. +It is maintained by the +.Xr open 2 +and +.Xr close 2 +system calls. +The third is the number of references within the kernel +requiring the vnode to remain active and not be recycled. +This count is maintained by +.Fn vhold +and +.Fn holdrele . +When both the +.Em v_usecount +and +.Em v_holdcnt +reach zero, the vnode is cached. +The transition from the cache is handled by a kernel thread and +.Fn vrecycle . +Access to +.Em v_usecount , +.Em v_writecount +and +.Em v_holdcnt +is also protected by the +.Em v_interlock +mutex. +.Pp +The number of pending synchronous and asynchronous writes on the +vnode are recorded in +.Em v_numoutput . +It is used by +.Xr fsync 2 +to wait for all writes to complete before returning to the user. +Its value must only be modified at splbio (see +.Xr spl 9 ) . +It does not track the number of dirty buffers attached to the +vnode. +.Pp +The link to the file system which owns the vnode is recorded by +.Em v_mount . +See +.Xr vfsops 9 +for further information of file system mount status. +.Pp +The +.Em v_op +pointer points to its vnode operations vector. +This vector describes what operations can be done to the file associated +with the vnode. +The system maintains one vnode operations vector for each file system +type configured into the kernel. +The vnode operations vector contains a pointer to a function for +each operation supported by the file system. +See +.Xr vnodeops 9 +for a description of vnode operations. +.Pp +When a user wants a new vnode for another file or wants a valid vnode +which is cached, +.Fn vcache_get +or +.Fn vcache_new +is invoked to allocate a vnode and initialize it for the new file. +.Pp +The type of object the vnode represents is recorded by +.Em v_type . +It is used by generic code to perform checks to ensure operations are +performed on valid file system objects. +Valid types are: +.Pp +.Bl -tag -offset indent -width VFIFO -compact +.It Dv VNON +The vnode has no type. +.It Dv VREG +The vnode represents a regular file. +.It Dv VDIR +The vnode represents a directory. +.It Dv VBLK +The vnode represents a block special device. +.It Dv VCHR +The vnode represents a character special device. +.It Dv VLNK +The vnode represents a symbolic link. +.It Dv VSOCK +The vnode represents a socket. +.It Dv VFIFO +The vnode represents a pipe. +.It Dv VBAD +The vnode represents a bad file (not currently used). +.El +.Pp +Vnode tag types are used by external programs only (e.g., +.Xr pstat 8 ) , +and should never be inspected by the kernel. +Its use is deprecated +since new +.Em v_tag +values cannot be defined for loadable file systems. +The +.Em v_tag +member is read-only. +Valid tag types are: +.Pp +.Bl -tag -offset indent -width "VT_FILECORE " -compact +.It Dv VT_NON +non file system +.It Dv VT_UFS +universal file system +.It Dv VT_NFS +network file system +.It Dv VT_MFS +memory file system +.It Dv VT_MSDOSFS +FAT file system +.It Dv VT_LFS +log-structured file system +.It Dv VT_LOFS +loopback file system +.It Dv VT_FDESC +file descriptor file system +.It Dv VT_NULL +null file system layer +.It Dv VT_UMAP +uid/gid remapping file system layer +.It Dv VT_KERNFS +kernel interface file system +.It Dv VT_PROCFS +process interface file system +.It Dv VT_AFS +AFS file system +.It Dv VT_ISOFS +ISO 9660 file system(s) +.It Dv VT_UNION +union file system +.It Dv VT_ADOSFS +Amiga file system +.It Dv VT_EXT2FS +Linux's ext2 file system +.It Dv VT_CODA +Coda file system +.It Dv VT_FILECORE +filecore file system +.It Dv VT_NTFS +Microsoft NT's file system +.It Dv VT_VFS +virtual file system +.It Dv VT_OVERLAY +overlay file system +.It Dv VT_SMBFS +SMB file system +.It Dv VT_PTYFS +pseudo-terminal device file system +.It Dv VT_TMPFS +efficient memory file system +.It Dv VT_UDF +universal disk format file system +.It Dv VT_SYSVBFS +systemV boot file system +.El +.Pp +The vnode lock is acquired by calling +.Xr vn_lock 9 +and released by calling +.Xr VOP_UNLOCK 9 . +The reason for this asymmetry is that +.Xr vn_lock 9 +is a wrapper for +.Xr VOP_LOCK 9 +with extra checks, while the unlocking step usually does not need +additional checks and thus has no wrapper. +.Pp +The vnode locking operation is complicated because it is used for many +purposes. +Sometimes it is used to bundle a series of vnode operations (see +.Xr vnodeops 9 ) +into an atomic group. +Many file systems rely on it to prevent race conditions in updating +file system type specific data structures rather than using their +own private locks. +The vnode lock can operate as a multiple-reader (shared-access lock) +or single-writer lock (exclusive access lock), however many current file +system implementations were written assuming only single-writer +locking. +Multiple-reader locking functions equivalently only in the presence +of big-lock SMP locking or a uni-processor machine. +The lock may be held while sleeping. +While the vnode lock is acquired, the holder is guaranteed that the +vnode will not be reclaimed or invalidated. +Most file system functions require that you hold the vnode lock on entry. +See +.Xr lock 9 +for details on the kernel locking API. +.Pp +Each file system underlying a vnode allocates its own private area and +hangs it from +.Em v_data . +.Pp +Most functions discussed in this page that operate on vnodes cannot be +called from interrupt context. +The members +.Em v_numoutput , +.Em v_holdcnt , +.Em v_dirtyblkhd , +and +.Em v_cleanblkhd +are modified in interrupt context and must be protected by +.Xr splbio 9 +unless it is certain that there is no chance an interrupt handler will +modify them. +The vnode lock must not be acquired within interrupt context. +.Sh FUNCTIONS +.Bl -tag -width compact +.It Fn vref "vp" +Increment +.Em v_usecount +of the vnode +.Em vp . +Any kernel thread system which uses a vnode (e.g., during the operation +of some algorithm or to store in a data structure) should call +.Fn vref . +.It Fn vrele "vp" +Decrement +.Em v_usecount +of unlocked vnode +.Em vp . +Any code in the system which is using a vnode should call +.Fn vrele +when it is finished with the vnode. +If +.Em v_usecount +of the vnode reaches zero and +.Em v_holdcnt +is greater than zero, the vnode is placed on the holdlist. +If both +.Em v_usecount +and +.Em v_holdcnt +are zero, the vnode is cached. +.It Fn vrele_async "vp" +Will asynchronously release the vnode in different context than the caller, +sometime after the call. +.It Fn vput "vp" +Legacy convenience routine for unlocking and releasing +.Fa vp . +Equivalent to: +.Bd -literal -offset abcd +.No "VOP_UNLOCK(" Ns Fa vp Ns Li ");" +.No "vrele(" Ns Fa vp Ns Li ");" +.Ed +.Pp +New code should prefer using +.Xr VOP_UNLOCK 9 +and +.Fn vrele +directly. +.It Fn vhold "vp" +Mark the vnode +.Fa vp +as active by incrementing +.Em vp->v_holdcnt . +Once held, the vnode will not be recycled until it is +released with +.Fn holdrele . +.It Fn holdrele "vp" +Mark the vnode +.Fa vp +as inactive by decrementing +.Em vp->v_holdcnt . +.It Fn vcache_get "mp" "key" "key_len" "vpp" +Allocate a new vnode. +The new vnode is returned referenced in the address specified by +.Fa vpp . +.Pp +The argument +.Fa mp +is the mount point for the file system to lookup the file in. +.Pp +The arguments +.Fa key +and +.Fa key_len +uniquely identify the file in the file system. +.Pp +If a vnode is successfully retrieved zero is returned, otherwise an +appropriate error code is returned. +.It Fn vcache_new "mp" "dvp" "vap" "cred" "vpp" +Allocate a new vnode with a new file. +The new vnode is returned referenced in the address specified by +.Fa vpp . +.Pp +The argument +.Fa mp +is the mount point for the file system to create the file in. +.Pp +The argument +.Fa dvp +points to the directory to create the file in. +.Pp +The argument +.Fa vap +points to the attributes for the file to create. +.Pp +The argument +.Fa cred +holds the credentials for the file to create. +.Pp +The argument +.Fa extra +allows the caller to pass more information about the file to create. +.Pp +If a vnode is successfully created zero is returned, otherwise an +appropriate error code is returned. +.It Fn vcache_rekey_enter "mp" "vp" "old_key" "old_key_len" "new_key" "new_key_len" +Prepare to change the key of a cached vnode. +.Pp +The argument +.Fa mp +is the mount point for the file system the vnode +.Fa vp +resides in. +.Pp +The arguments +.Fa old_key +and +.Fa old_key_len +identify the cached vnode. +.Pp +The arguments +.Fa new_key +and +.Fa new_key_len +will identify the vnode after rename. +.Pp +If the new key already exists +.Er EEXIST +is returned, otherwise zero is returned. +.It Fn vcache_rekey_exit "mp" "vp" "old_key" "old_key_len" "new_key" "new_key_len" +Finish rename after calling +.Fn vcache_rekey_enter . +.It Fn vrecycle "vp" +Recycle the referenced vnode +.Fa vp +if this is the last reference. +.Fn vrecycle +is a null operation if the reference count is greater than one. +.It Fn vgone "vp" +Eliminate all activity associated with the unlocked vnode +.Fa vp +in preparation for recycling. +This operation is restricted to suspended file systems. +See +.Xr vfs_suspend 9 . +.It Fn vgonel "vp" "p" +Eliminate all activity associated with the locked vnode +.Fa vp +in preparation for recycling. +.It Fn vdead_check "vp" "flags" +Check the vnode +.Fa vp +for being or becoming dead. +Returns +.Er ENOENT +for a dead vnode and zero otherwise. +If +.Fa flags +is +.Dv VDEAD_NOWAIT +it will return +.Er EBUSY +if the vnode is becoming dead and the function will not sleep. +.Pp +Whenever this function returns a non-zero value all future calls +for this +.Fa vp +will also return a non-zero value. +.It Fn vflush "mp" "skipvp" "flags" +Remove any vnodes in the vnode table belonging to mount point +.Fa mp . +If +.Fa skipvp +is not +.Dv NULL +it is exempt from being flushed. +The argument +.Fa flags +is a set of flags modifying the operation of +.Fn vflush . +If +.Dv FORCECLOSE +is not specified, there should not be any active vnodes and +the error +.Er EBUSY +is returned if any are found (this is a user error, not a system error). +If +.Dv FORCECLOSE +is specified, active vnodes that are found are detached. +If +.Dv WRITECLOSE +is set, only flush out regular file vnodes open for writing. +SKIPSYSTEM causes any vnodes marked +.Dv V_SYSTEM +to be skipped. +.It Fn bdevvp "dev" "vpp" +Create a vnode for a block device. +.Fn bdevvp +is used for root file systems, swap areas and for memory file system +special devices. +.It Fn cdevvp "dev" "vpp" +Create a vnode for a character device. +.Fn cdevvp +is used for the console and kernfs special devices. +.It Fn vfinddev "dev" "vtype" "vpp" +Lookup a vnode by device number. +The vnode is referenced and returned in the address specified by +.Fa vpp . +.It Fn vdevgone "int maj" "int min" "int minh" "enum vtype type" +Reclaim all vnodes that correspond to the specified minor number range +.Fa minl +to +.Fa minh +(endpoints inclusive) of the specified major +.Fa maj . +.It Fn vwakeup "bp" +Update outstanding I/O count +.Em vp->v_numoutput +for the vnode +.Em bp->b_vp +and do a wakeup if requested and +.Em vp->vflag +has +.Dv VBWAIT +set. +.It Fn vflushbuf "vp" "sync" +Flush all dirty buffers to disk for the file with the locked vnode +.Fa vp . +The argument +.Fa sync +specifies whether the I/O should be synchronous and +.Fn vflushbuf +will sleep until +.Em vp->v_numoutput +is zero and +.Em vp->v_dirtyblkhd +is empty. +.It Fn vinvalbuf "vp" "flags" "cred" "l" "slpflag" "slptimeo" +Flush out and invalidate all buffers associated with locked vnode +.Fa vp . +The argument +.Fa l +and +.Fa cred +specified the calling process and its credentials. +The +.Xr ltsleep 9 +flag and timeout are specified by the arguments +.Fa slpflag +and +.Fa slptimeo +respectively. +If the operation is successful zero is returned, otherwise an +appropriate error code is returned. +.It Fn vtruncbuf "vp" "lbn" "slpflag" "slptimeo" +Destroy any in-core buffers past the file truncation length for the +locked vnode +.Fa vp . +The truncation length is specified by +.Fa lbn . +.Fn vtruncbuf +will sleep while the I/O is performed, The +.Xr ltsleep 9 +flag and timeout are specified by the arguments +.Fa slpflag +and +.Fa slptimeo +respectively. +If the operation is successful zero is returned, otherwise an +appropriate error code is returned. +.It Fn vprint "label" "vp" +This function is used by the kernel to dump vnode information during a +panic. +It is only used if the kernel option DIAGNOSTIC is compiled into the kernel. +The argument +.Fa label +is a string to prefix the information dump of vnode +.Fa vp . +.El +.Sh CODE REFERENCES +The vnode framework is implemented within the file +.Pa sys/kern/vfs_subr.c . +.Sh SEE ALSO +.Xr intro 9 , +.Xr lock 9 , +.Xr namecache 9 , +.Xr namei 9 , +.Xr uvm 9 , +.Xr vattr 9 , +.Xr vfs 9 , +.Xr vfsops 9 , +.Xr vnodeops 9 , +.Xr vnsubr 9 +.Sh BUGS +The locking protocol is inconsistent. +Many vnode operations are passed locked vnodes on entry but release +the lock before they exit. +The locking protocol is used in some places to attempt to make a +series of operations atomic (e.g., access check then operation). +This does not work for non-local file systems that do not support locking +(e.g., NFS). +The +.Nm +interface would benefit from a simpler locking protocol. |
