summaryrefslogtreecommitdiff
path: root/share/man/man9/VOP_LOOKUP.9
diff options
context:
space:
mode:
Diffstat (limited to 'share/man/man9/VOP_LOOKUP.9')
-rw-r--r--share/man/man9/VOP_LOOKUP.9435
1 files changed, 435 insertions, 0 deletions
diff --git a/share/man/man9/VOP_LOOKUP.9 b/share/man/man9/VOP_LOOKUP.9
new file mode 100644
index 00000000000..f09d471b124
--- /dev/null
+++ b/share/man/man9/VOP_LOOKUP.9
@@ -0,0 +1,435 @@
+.\" $OpenBSD: VOP_LOOKUP.9,v 1.11 2003/07/25 02:27:33 deraadt Exp $
+.\"
+.\" Copyright (c) 2003 Ted Unangst
+.\" All rights reserved.
+.\"
+.\" 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 AUTHOR ``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 AUTHOR 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 9, 2003
+.Dt VOP_LOOKUP 9
+.Os
+.Sh NAME
+.Nm VOP functions
+.Nd vnode operations
+.Sh SYNOPSIS
+.Fd #include <sys/vnode.h>
+.Ft int
+.Fo VOP_CREATE
+.Fa "struct vnode *dvp"
+.Fa "struct vnode **vpp"
+.Fa "struct componentname *cnp"
+.Fa "struct vattr *vap"
+.Fc
+.Ft int
+.Fo VOP_FSYNC
+.Fa "struct vnode *vp"
+.Fa "struct ucred *cred"
+.Fa "int waitfor"
+.Fa "struct proc *p"
+.Fc
+.Ft int
+.Fo VOP_GETEXTATTR
+.Fa "struct vnode *vp"
+.Fa "int attrnamespace"
+.Fa "const char *name"
+.Fa "struct uio *uio"
+.Fa "size_t *size"
+.Fa "struct ucred *cred"
+.Fa "struct proc *p"
+.Fc
+.Ft int
+.Fo VOP_ISLOCKED
+.Fa "struct vnode *"
+.Fc
+.Ft int
+.Fo VOP_LINK
+.Fa "struct vnode *dvp"
+.Fa "struct vnode *vp"
+.Fa "struct componentname *cnp"
+.Fc
+.Ft int
+.Fo VOP_LOCK
+.Fa "struct vnode *vp"
+.Fa "int flags"
+.Fa "struct proc *p"
+.Fc
+.Ft int
+.Fo VOP_LOOKUP
+.Fa "struct vnode *dvp"
+.Fa "struct vnode **vpp"
+.Fa "struct componentname *cnp"
+.Fc
+.Ft int
+.Fo VOP_MKDIR
+.Fa "struct vnode *dvp"
+.Fa "struct vnode **vpp"
+.Fa "struct componentname *cnp"
+.Fa "struct vattr *vap"
+.Fc
+.Ft int
+.Fo VOP_PRINT
+.Fa "struct vnode *vp"
+.Fc
+.Ft int
+.Fo VOP_READLINK
+.Fa "struct vnode *vp"
+.Fa "struct uio *uio"
+.Fa "struct ucred *cred"
+.Fc
+.Ft int
+.Fo VOP_REALLOCBLKS
+.Fa "struct vnode *vp"
+.Fa "struct cluster_save *buflist"
+.Fc
+.Ft int
+.Fo VOP_RECLAIM
+.Fa "struct vnode *vp"
+.Fa "struct proc *p"
+.Fc
+.Ft int
+.Fo VOP_REMOVE
+.Fa "struct vnode *dvp"
+.Fa "struct vnode *vp"
+.Fa "struct componentname *cnp"
+.Fc
+.Ft int
+.Fo VOP_REVOKE
+.Fa "struct vnode *vp"
+.Fa "int flags"
+.Fc
+.Ft int
+.Fo VOP_RMDIR
+.Fa "struct vnode *dvp"
+.Fa "struct vnode *vp"
+.Fa "struct componentname *cnp"
+.Fc
+.Ft int
+.Fo VOP_SETEXTATTR
+.Fa "struct vnode *vp"
+.Fa "int attrnamespace"
+.Fa "const char *name"
+.Fa "struct uio *uio"
+.Fa "struct ucred *cred"
+.Fa "struct proc *p"
+.Fc
+.Ft int
+.Fo VOP_STRATEGY
+.Fa "struct buf *bp"
+.Fc
+.Ft int
+.Fo VOP_SYMLINK
+.Fa "struct vnode *dvp"
+.Fa "struct vnode *vpp"
+.Fa "struct componentname *cnp"
+.Fa "struct vattr *vap"
+.Fa "char *target"
+.Fc
+.Ft int
+.Fo VOP_UNLOCK
+.Fa "struct vnode *vp"
+.Fa "int flags"
+.Fa "struct proc *p"
+.Fc
+.Ft int
+.Fo VOP_WHITEOUT
+.Fa "struct vnode *dvp"
+.Fa "struct componentname *cnp"
+.Fa "int flags"
+.Fc
+.\" and many more
+.Sh DESCRIPTION
+The
+.Nm
+functions implement a generic way to perform operations on vnodes.
+The VOP function called passes the arguments to the correct file system
+specific function.
+Not all file systems implement all operations, in which case a generic
+method will be used.
+These functions exist to provide an abstract method to invoke vnode
+operations without needing to know anything about the underlying file system.
+Many syscalls map directly to a specific VOP function.
+.Pp
+The arguments for each VOP
+function consist of one or more vnode pointers along with other data
+needed to perform the operation.
+Care must be taken to obey the vnode locking discipline when using
+VOP functions.
+The locking discipline for all currently defined VOP
+functions is described in the file
+.Pa sys/kern/vnode_if.src .
+Many VOP calls take a struct proc *p argument.
+This should be the current process.
+VOP calls are not safe to call in an interrupt context.
+.Pp
+The following sections comment on the VOP functions from the consumer's
+perspective.
+Some notes for file system implementors follow.
+.Sh VOP_CREATE
+.Fn VOP_CREATE
+creates a new directory entry for a regular file in the directory
+.Ar dvp
+and returns a locked, referenced vnode in
+.Ar vpp .
+The file name is in
+.Ar cnp
+and its permissions will be
+.Ar vap .
+.Sh VOP_FSYNC
+.Fn VOP_FSYNC
+flushes any dirty buffers associated with
+.Ar vp
+to disk.
+The vnode is locked on entry and exit.
+.Ar waitfor
+can be set to MNT_WAIT to indicate VOP_FSYNC should not return
+until all data is written.
+.Sh VOP_GETEXTATTR
+.Fn VOP_GETEXTATTR
+and
+.Fn VOP_SETEXTATTR
+are called to get and set named extended file attributes (see
+.Xr extattr 9 ) .
+.Ar vp
+is the vnode for which to get or set the attribute.
+It must be locked.
+.Ar attrnamespace
+is an integer describing whether the attribute belongs in the
+user or system namespace.
+.Ar name
+is the extended attribute to get or set.
+.Ar uio
+is a
+.Xr uio 9
+structure with the userland address containing the userland data.
+VOP_GETEXTATTR will return the actual length of the attribute
+in
+.Ar size
+if it is non-NULL.
+.Ar cred
+is a pointer to the credentials used to access the file.
+.Sh VOP_LINK
+.Fn VOP_LINK
+increases the link count for the vnode
+.Ar vp .
+A new entry with name
+.Ar cnp
+should be added to the directory
+.Ar dvp .
+.Ar dvp
+is locked on entry and unlocked on exit.
+.Sh VOP_LOOKUP
+.Fn VOP_LOOKUP
+finds the file corresponding to the name
+.Ar cnp
+in the directory
+.Ar dvp
+and returns a vnode in
+.Ar vpp .
+.Ar dvp
+is locked on entry and exit, and
+.Ar vpp
+is locked upon a successful return.
+.Ar vpp
+will be NULL on error, and cnp->cn_flags will be set to PDIRUNLOCK
+if
+.Ar dvp
+has been unlocked for an unsuccessful return.
+.Sh VOP_MKDIR
+.Fn VOP_MKDIR
+implements the
+.Xr mkdir 2
+syscall.
+A new directory with name matching that in
+.Ar cnp
+and with permissions
+.Ar vattr
+will be created in the directory
+.Ar dvp .
+On success, the new vnode is returned locked in
+.Ar vpp .
+.Ar dvp
+must be locked on entry and is unlocked on exit.
+.Sh VOP_PRINT
+.Fn VOP_PRINT
+prints information about the vnode to the kernel message buffer.
+It is not used normally, but exists only for debugging purposes.
+.Sh VOP_READLINK
+.Fn VOP_READLINK
+reads a symbolic link and returns the target's name in
+.Ar uio .
+.Ar vp
+is locked on entry and exit and must be a symlink.
+.Sh VOP_REALLOCBLKS
+.Fn VOP_REALLOCBLKS
+is called by the vfs write clustering code.
+It gives the file system an opporunity to rearrange the on disk blocks
+for a file to reduce fragmentation.
+.Ar vp
+is the locked vnode for the file, and
+.Ar buflist
+is a cluster of the outstanding buffers about to written.
+Currently, only FFS implements this call.
+.Sh VOP_RECLAIM
+.Fn VOP_RECLAIM
+is used by
+.Xr vclean 9
+so that the file system has an opportunity to free memory
+and perform any other cleanup activity related to
+.Ar vp .
+.Ar vp
+is unlocked on entry and exit.
+VOP_RECLAIM should not be used by generic code.
+.Sh VOP_REMOVE
+.Fn VOP_REMOVE
+removes the link named
+.Ar cnp
+from the directory
+.Ar dvp .
+This file corresponds to the vnode
+.Ar vp .
+Both dvp and vp are locked on entry and unlocked on exit, and
+each has its reference count decremented by one.
+VOP_REMOVE does not delete the file from disk unless its link count
+becomes zero (for file systems which support multiple links).
+.Sh VOP_REVOKE
+.Fn VOP_REVOKE
+is used by the
+.Xr revoke 2
+syscall to prevent any further access to a vnode.
+The vnode ops will be changed to those of deadfs, which returns only
+errors.
+.Ar vp
+must be unlocked.
+.Sh VOP_RMDIR
+.Fn VOP_RMDIR
+implements the
+.Xr rmdir 2
+syscall.
+The directory
+.Ar vp
+will be removed from the directory
+.Ar dvp .
+Both are locked on entry and unlocked on exit.
+The name of the directory for removal is additionally contained in
+.Ar cnp .
+.Sh VOP_STRATEGY
+.Fn VOP_STRATEGY
+is the only VOP call not taking a vnode argument.
+It calls the appropriate strategy function for the device backing the
+buffer's vnode.
+.Sh VOP_SYMLINK
+.Fn VOP_SYMLINK
+creates a symbolic link with name
+.Ar cnp
+in the directory
+.Ar dvp
+with mode
+.Ar vap .
+The link will point to
+.Ar target
+and a vnode for it is returned in
+.Ar vpp .
+The directory vnode is locked on entry and unlocked on exit.
+Note that unlike most VOP calls returning a vnode, VOP_SYMLINK
+does not lock or reference
+.Ar vpp .
+.Sh VOP_LOCK
+.Fn VOP_LOCK
+is used internally by
+.Xr vn_lock 9
+to lock a vnode.
+It should not be used by other file system code.
+.Fn VOP_UNLOCK
+unlocks a vnode.
+.Ar flags
+should be zero in most cases.
+.Fn VOP_ISLOCKED
+returns 1 if
+.Ar vp
+is locked and 0 if not.
+It should be used cautiously, as not all file systems implement locks
+effectively.
+Note the asymmetry between vn_lock and VOP_UNLOCK.
+.Sh VOP_WHITEOUT
+.Fn VOP_WHITEOUT
+manipulates whiteout entries in a directory.
+.Ar dvp
+is the directory containing, or to contain, the whiteout.
+It is locked on entry and exit.
+.Ar cnp
+contains the name of the whiteout.
+.Ar flags
+is used to indicate the operation.
+Whiteouts may be created or deleted.
+A whiteout entry is normally used to indicate the absence of a file on a
+translucent file system.
+.Sh IMPLEMENTATION NOTES
+The
+.Nm VOP
+functions are stubs which redirect their arguments to the
+appropriate function for each file system.
+In order to allow for layered file systems and generic bypass methods,
+all vnode operation implementing functions take only a single void *
+pointer as an argument.
+This points to a structure containing the real arguments.
+Additionally, this structure contains a struct vnodeop_desc *,
+or vnodeop description.
+The description is typically used by the abstract VOP code, but can
+be useful to the lower implementation as well.
+Every file system defines an array of struct vnodeopv_entry_desc
+that contains one entry for each implemented vnode op.
+Unimplemented vnode operations match the default description,
+.Em vop_default_desc .
+Most non-layer file systems should assign the default error handler,
+.Em vn_default_error ,
+to the generic description.
+.Pp
+All lower level implementations should conform to the interfaces described
+above.
+The rules for locking and referencing vnodes are enforced by each
+file system implementation, not the VOP stubs.
+.Sh RETURN VALUES
+The
+.Nm
+functions return 0 to indicate success and a non-zero error code
+to indicate failure.
+.Sh FILES
+.Bl -tag -width sys/kern/vnode_if.src -compact
+.It Pa sys/kern/vnode_if.src
+source file containing
+.Nm
+definitions
+.It Pa sys/kern/vnode_if.c
+C file with implementations of each
+.Nm
+stub call
+.El
+.Sh SEE ALSO
+.Xr errno 2 ,
+.Xr vn_lock 9 ,
+.Xr vnode 9
+.Sh AUTHORS
+This man page was written by Ted Unangst for
+.Ox .
+.Sh BUGS
+The locking discipline is too complex.
+Refer to
+.Xr vn_lock 9 .