* Copyright (c) 1985, 1989, 1991 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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
* from: @(#)namei.h 7.15 (Berkeley) 5/15/91
* Encapsulation of namei parameters.
caddr_t ni_dirp
; /* pathname pointer */
enum uio_seg ni_segflg
; /* location of pathname */
u_long ni_nameiop
; /* see below */
struct ucred
*ni_cred
; /* credentials */
struct vnode
*ni_startdir
; /* starting directory */
struct vnode
*ni_rootdir
; /* logical root directory */
struct vnode
*ni_vp
; /* vnode of result */
struct vnode
*ni_dvp
; /* vnode of intermediate directory */
* Shared between namei, lookup routines, and commit routines.
char *ni_pnbuf
; /* pathname buffer */
long ni_pathlen
; /* remaining chars in path */
char *ni_ptr
; /* current location in pathname */
long ni_namelen
; /* length of current component */
char *ni_next
; /* next location in pathname */
u_long ni_hash
; /* hash value of current component */
u_char ni_loopcnt
; /* count of symlinks encountered */
u_char ni_makeentry
; /* 1 => add entry to name cache */
u_char ni_isdotdot
; /* 1 => current component name is .. */
u_char ni_more
; /* 1 => symlink needs interpretation */
struct ufs_specific
{ /* saved info for new dir entry */
off_t ufs_endoff
; /* end of useful directory contents */
long ufs_offset
; /* offset of free space in directory */
long ufs_count
; /* size of free slot in directory */
ino_t ufs_ino
; /* inode number of found directory */
u_long ufs_reclen
; /* size of found directory entry */
#define LOOKUP 0 /* perform name lookup only */
#define CREATE 1 /* setup for file creation */
#define DELETE 2 /* setup for file deletion */
#define RENAME 3 /* setup for file renaming */
#define OPMASK 3 /* mask for operation */
* namei operational modifiers
#define LOCKLEAF 0x0004 /* lock inode on return */
#define LOCKPARENT 0x0008 /* want parent vnode returned locked */
#define WANTPARENT 0x0010 /* want parent vnode returned unlocked */
#define NOCACHE 0x0020 /* name must not be left in cache */
#define FOLLOW 0x0040 /* follow symbolic links */
#define NOFOLLOW 0x0000 /* do not follow symbolic links (pseudo) */
#define MODMASK 0x00fc /* mask of operational modifiers */
* Namei parameter descriptors.
* SAVENAME may be set by either the callers of namei or by VOP_LOOKUP.
* If the caller of namei sets the flag (for example execve wants to
* know the name of the program that is being executed), then it must
* free the buffer. If VOP_LOOKUP sets the flag, then the buffer must
* be freed by either the commit routine or the VOP_ABORT routine.
* SAVESTART is set only by the callers of namei. It implies SAVENAME
* plus the addition of saving the parent directory that contains the
* name in ni_startdir. It allows repeated calls to lookup for the
* name being sought. The caller is responsible for releasing the
* buffer and for vrele'ing ni_startdir.
#define NOCROSSMOUNT 0x0100 /* do not cross mount points */
#define REMOTE 0x0200 /* lookup for remote filesystem servers */
#define HASBUF 0x0400 /* has allocated pathname buffer */
#define SAVENAME 0x0800 /* save pathanme buffer */
#define SAVESTART 0x1000 /* save starting directory */
#define PARAMASK 0xff00 /* mask of parameter descriptors */
* This structure describes the elements in the cache of recent
* names looked up by namei. NCHNAMLEN is sized to make structure
* size a power of two to optimize malloc's. Minimum reasonable
#define NCHNAMLEN 31 /* maximum name segment length we bother with */
struct namecache
*nc_forw
; /* hash chain, MUST BE FIRST */
struct namecache
*nc_back
; /* hash chain, MUST BE FIRST */
struct namecache
*nc_nxt
; /* LRU chain */
struct namecache
**nc_prev
; /* LRU chain */
struct vnode
*nc_dvp
; /* vnode of parent of name */
u_long nc_dvpid
; /* capability number of nc_dvp */
struct vnode
*nc_vp
; /* vnode the name refers to */
u_long nc_vpid
; /* capability number of nc_vp */
char nc_nlen
; /* length of name */
char nc_name
[NCHNAMLEN
]; /* segment name */
int namei
__P((struct nameidata
*ndp
, struct proc
*p
));
int lookup
__P((struct nameidata
*ndp
, struct proc
*p
));
* Stats on usefulness of namei caches.
long ncs_goodhits
; /* hits that we can really use */
long ncs_neghits
; /* negative hits that we can use */
long ncs_badhits
; /* hits we must drop */
long ncs_falsehits
; /* hits with id mismatch */
long ncs_miss
; /* misses */
long ncs_long
; /* long names that ignore cache */
long ncs_pass2
; /* names found with passes == 2 */
long ncs_2passes
; /* number of times we attempt it */