summaryrefslogtreecommitdiffstats
path: root/share/man/man9/VOP_LOOKUP.9
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2009-03-30 20:56:37 +0000
committertrasz <trasz@FreeBSD.org>2009-03-30 20:56:37 +0000
commit369dfb5670f24cf9f27d3b0d4949c570bb2907b8 (patch)
tree0bd177c2c20120877ec7daa02b1f1adcbf8657bc /share/man/man9/VOP_LOOKUP.9
parent17f31804478d7c687653b106a7fa0648e81eb417 (diff)
downloadFreeBSD-src-369dfb5670f24cf9f27d3b0d4949c570bb2907b8.zip
FreeBSD-src-369dfb5670f24cf9f27d3b0d4949c570bb2907b8.tar.gz
Remove pseudocode from VOP_* manual pages. It was out of date anyway.
Reviewed by: scottl Approved by: rwatson (mentor)
Diffstat (limited to 'share/man/man9/VOP_LOOKUP.9')
-rw-r--r--share/man/man9/VOP_LOOKUP.9254
1 files changed, 0 insertions, 254 deletions
diff --git a/share/man/man9/VOP_LOOKUP.9 b/share/man/man9/VOP_LOOKUP.9
index 270f83f..ba5a260 100644
--- a/share/man/man9/VOP_LOOKUP.9
+++ b/share/man/man9/VOP_LOOKUP.9
@@ -156,260 +156,6 @@ is specified and the operation would succeed, the special return value
.Er EJUSTRETURN
is returned.
Otherwise, an appropriate error code is returned.
-.Sh PSEUDOCODE
-.Bd -literal
-int
-vop_lookup(struct vnode *dvp,
- struct vnode **vpp,
- struct componentname *cnp)
-{
- int error;
- int nameiop = cnp->cn_nameiop;
- int flags = cnp->cn_flags;
- int lockparent = flags & LOCKPARENT;
- int islastcn = flags & ISLASTCN;
- struct vnode *vp = NULL;
-
- /*
- * Check accessibility of directory.
- */
- if (dvp->v_type != VDIR)
- return ENOTDIR;
-
- error = VOP_ACCESS(dvp, VEXEC, cred, cnp->cn_thread);
- if (error)
- return (error);
-
- if (islastcn && (dvp->v_mount->mnt_flag & MNT_RDONLY) &&
- (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME))
- return (EROFS);
-
- /*
- * Check name cache for directory/name pair. This returns ENOENT
- * if the name is known not to exist, -1 if the name was found, or
- * zero if not.
- */
- error = cache_lookup(dvp, vpp, cnp);
- if (error) {
- int vpid;
-
- if (error = ENOENT)
- return error;
-
- vp = *vpp;
- if (dvp == vp) { /* lookup on "." */
- VREF(vp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- /*
- * We need to unlock the directory before getting
- * the locked vnode for ".." to avoid deadlocks.
- */
- VOP_UNLOCK(dvp);
- error = vget(vp, 1);
- if (!error) {
- if (lockparent && islastcn)
- error = VOP_LOCK(dvp);
- }
- } else {
- error = vget(vp, 1);
- if (error || !(lockparent && islastcn)) {
- VOP_UNLOCK(dvp);
- }
- }
-
- /*
- * Check that the capability number did not change
- * while we were waiting for the lock.
- */
- if (!error) {
- if (vpid == vp->v_id) {
- /*
- * dvp is locked if lockparent && islastcn.
- * vp is locked.
- */
- return (0);
- }
- vput(vp);
-
- if (dvp != vp && lockparent && islastcn)
- VOP_UNLOCK(pdp);
- }
-
- /*
- * Re-lock dvp for the directory search below.
- */
- error = VOP_LOCK(dvp);
- if (error) {
- return (error);
- }
-
- *vpp = NULL;
- }
-
- /*
- * Search dvp for the component cnp->cn_nameptr.
- */
- ...;
-
- if (!found) {
- if ((nameiop == CREATE || nameiop == RENAME)
- && islastcn
- && directory dvp has not been removed) {
- /*
- * Check for write access on directory.
- */
-
- /*
- * Possibly record the position of a slot in the directory
- * large enough for the new component name. This can be
- * recorded in the vnode private data for dvp.
- * Set the SAVENAME flag to hold onto the pathname for use
- * later in VOP_CREATE or VOP_RENAME.
- */
- cnp->cn_flags |= SAVENAME;
- if (!lockparent)
- /*
- * Note that the extra data recorded above is only
- * useful if lockparent is specified.
- */
- VOP_UNLOCK(dvp);
-
- return EJUSTRETURN;
- }
-
- /*
- * Consider inserting name into cache.
- */
- if ((cnp->cn_flags & MAKEENTRY) && nameiop != CREATE)
- cache_enter(dvp, NULL, cnp);
-
- return ENOENT;
- } else {
- /*
- * If deleting, and at end of pathname, return parameters
- * which can be used to remove file. If the wantparent flag
- * isn't set, we return only the directory, otherwise we go on
- * and lock the inode, being careful with ".".
- */
- if (nameiop == DELETE && islastcn) {
- /*
- * Check for write access on directory.
- */
- error = VOP_ACCESS(dvp, VWRITE, cred, cnp->cn_thread);
- if (error)
- return (error);
-
- if (found entry is same as dvp) {
- VREF(dvp);
- *vpp = dvp;
- return 0;
- }
-
- error = VFS_VGET(dvp->v_mount, ..., &vp);
- if (error)
- return error;
-
- if (directory is sticky
- && cred->cr_uid != 0
- && cred->cr_uid != owner of dvp
- && owner of vp != cred->cr_uid) {
- vput(vp);
- return EPERM;
- }
- *vpp = vp;
- if (!lockparent)
- VOP_UNLOCK(dvp);
-
- return 0;
- }
-
- /*
- * If rewriting (RENAME), return the inode and the
- * information required to rewrite the present directory
- * Must get inode of directory entry to verify it's a
- * regular file, or empty directory.
- */
- if (nameiop == RENAME && wantparent && islastcn) {
- error = VOP_ACCESS(dvp, VWRITE, cred, cnp->cn_thread);
- if (error)
- return (error);
-
- /*
- * Check for "."
- */
- if (found entry is same as dvp)
- return EISDIR;
-
- error = VFS_VGET(dvp->v_mount, ..., &vp);
- if (error)
- return error;
- *vpp = vp;
- /*
- * Save the name for use in VOP_RENAME later.
- */
- cnp->cn_flags |= SAVENAME;
- if (!lockparent)
- VOP_UNLOCK(dvp);
-
- return 0;
- }
-
- /*
- * Step through the translation in the name. We do not `vput' the
- * directory because we may need it again if a symbolic link
- * is relative to the current directory. Instead we save it
- * unlocked as "pdp". We must get the target inode before unlocking
- * the directory to insure that the inode will not be removed
- * before we get it. We prevent deadlock by always fetching
- * inodes from the root, moving down the directory tree. Thus
- * when following backward pointers ".." we must unlock the
- * parent directory before getting the requested directory.
- * There is a potential race condition here if both the current
- * and parent directories are removed before the VFS_VGET for the
- * inode associated with ".." returns. We hope that this occurs
- * infrequently since we cannot avoid this race condition without
- * implementing a sophisticated deadlock detection algorithm.
- * Note also that this simple deadlock detection scheme will not
- * work if the file system has any hard links other than ".."
- * that point backwards in the directory structure.
- */
- if (flags & ISDOTDOT) {
- VOP_UNLOCK(dvp); /* race to get the inode */
- error = VFS_VGET(dvp->v_mount, ..., &vp);
- if (error) {
- VOP_LOCK(dvp);
- return (error);
- }
- if (lockparent && islastcn) {
- error = VOP_LOCK(dvp);
- if (error) {
- vput(vp);
- return error;
- }
- }
- *vpp = vp;
- } else if (found entry is same as dvp) {
- VREF(dvp); /* we want ourself, ie "." */
- *vpp = dvp;
- } else {
- error = VFS_VGET(dvp->v_mount, ..., &vp);
- if (error)
- return (error);
- if (!lockparent || !islastcn)
- VOP_UNLOCK(dvp);
- *vpp = vp;
- }
-
- /*
- * Insert name into cache if appropriate.
- */
- if (cnp->cn_flags & MAKEENTRY)
- cache_enter(dvp, *vpp, cnp);
- return (0);
- }
-}
-.Ed
.Sh ERRORS
.Bl -tag -width Er
.It Bq Er ENOTDIR
OpenPOWER on IntegriCloud