1 /* $NetBSD: namei.h,v 1.13 1997/05/08 14:55:25 mycroft Exp $ */ 2 3 /* 4 * Copyright (c) 1985, 1989, 1991, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * @(#)namei.h 8.4 (Berkeley) 8/20/94 36 */ 37 38 #ifndef _SYS_NAMEI_H_ 39 #define _SYS_NAMEI_H_ 40 41 #include <sys/queue.h> 42 43 /* 44 * Encapsulation of namei parameters. 45 */ 46 struct nameidata { 47 /* 48 * Arguments to namei/lookup. 49 */ 50 const char *ni_dirp; /* pathname pointer */ 51 enum uio_seg ni_segflg; /* location of pathname */ 52 /* u_long ni_nameiop; namei operation */ 53 /* u_long ni_flags; flags to namei */ 54 /* struct proc *ni_proc; process requesting lookup */ 55 /* 56 * Arguments to lookup. 57 */ 58 /* struct ucred *ni_cred; credentials */ 59 struct vnode *ni_startdir; /* starting directory */ 60 struct vnode *ni_rootdir; /* logical root directory */ 61 /* 62 * Results: returned from/manipulated by lookup 63 */ 64 struct vnode *ni_vp; /* vnode of result */ 65 struct vnode *ni_dvp; /* vnode of intermediate directory */ 66 /* 67 * Shared between namei and lookup/commit routines. 68 */ 69 size_t ni_pathlen; /* remaining chars in path */ 70 const char *ni_next; /* next location in pathname */ 71 u_long ni_loopcnt; /* count of symlinks encountered */ 72 /* 73 * Lookup parameters: this structure describes the subset of 74 * information from the nameidata structure that is passed 75 * through the VOP interface. 76 */ 77 struct componentname { 78 /* 79 * Arguments to lookup. 80 */ 81 u_long cn_nameiop; /* namei operation */ 82 u_long cn_flags; /* flags to namei */ 83 struct proc *cn_proc; /* process requesting lookup */ 84 struct ucred *cn_cred; /* credentials */ 85 /* 86 * Shared between lookup and commit routines. 87 */ 88 char *cn_pnbuf; /* pathname buffer */ 89 const char *cn_nameptr; /* pointer to looked up name */ 90 long cn_namelen; /* length of looked up component */ 91 u_long cn_hash; /* hash value of looked up name */ 92 long cn_consume; /* chars to consume in lookup() */ 93 } ni_cnd; 94 }; 95 96 #ifdef _KERNEL 97 /* 98 * namei operations 99 */ 100 #define LOOKUP 0 /* perform name lookup only */ 101 #define CREATE 1 /* setup for file creation */ 102 #define DELETE 2 /* setup for file deletion */ 103 #define RENAME 3 /* setup for file renaming */ 104 #define OPMASK 3 /* mask for operation */ 105 /* 106 * namei operational modifier flags, stored in ni_cnd.flags 107 */ 108 #define LOCKLEAF 0x0004 /* lock inode on return */ 109 #define LOCKPARENT 0x0008 /* want parent vnode returned locked */ 110 #define WANTPARENT 0x0010 /* want parent vnode returned unlocked */ 111 #define NOCACHE 0x0020 /* name must not be left in cache */ 112 #define FOLLOW 0x0040 /* follow symbolic links */ 113 #define NOFOLLOW 0x0000 /* do not follow symbolic links (pseudo) */ 114 #define MODMASK 0x00fc /* mask of operational modifiers */ 115 /* 116 * Namei parameter descriptors. 117 * 118 * SAVENAME may be set by either the callers of namei or by VOP_LOOKUP. 119 * If the caller of namei sets the flag (for example execve wants to 120 * know the name of the program that is being executed), then it must 121 * free the buffer. If VOP_LOOKUP sets the flag, then the buffer must 122 * be freed by either the commit routine or the VOP_ABORT routine. 123 * SAVESTART is set only by the callers of namei. It implies SAVENAME 124 * plus the addition of saving the parent directory that contains the 125 * name in ni_startdir. It allows repeated calls to lookup for the 126 * name being sought. The caller is responsible for releasing the 127 * buffer and for vrele'ing ni_startdir. 128 */ 129 #define NOCROSSMOUNT 0x00100 /* do not cross mount points */ 130 #define RDONLY 0x00200 /* lookup with read-only semantics */ 131 #define HASBUF 0x00400 /* has allocated pathname buffer */ 132 #define SAVENAME 0x00800 /* save pathanme buffer */ 133 #define SAVESTART 0x01000 /* save starting directory */ 134 #define ISDOTDOT 0x02000 /* current component name is .. */ 135 #define MAKEENTRY 0x04000 /* entry is to be added to name cache */ 136 #define ISLASTCN 0x08000 /* this is last component of pathname */ 137 #define ISSYMLINK 0x10000 /* symlink needs interpretation */ 138 #define ISWHITEOUT 0x20000 /* found whiteout */ 139 #define DOWHITEOUT 0x40000 /* do whiteouts */ 140 #define REQUIREDIR 0x80000 /* must be a directory */ 141 #define PARAMASK 0xfff00 /* mask of parameter descriptors */ 142 /* 143 * Initialization of an nameidata structure. 144 */ 145 #define NDINIT(ndp, op, flags, segflg, namep, p) { \ 146 (ndp)->ni_cnd.cn_nameiop = op; \ 147 (ndp)->ni_cnd.cn_flags = flags; \ 148 (ndp)->ni_segflg = segflg; \ 149 (ndp)->ni_dirp = namep; \ 150 (ndp)->ni_cnd.cn_proc = p; \ 151 } 152 #endif 153 154 /* 155 * This structure describes the elements in the cache of recent 156 * names looked up by namei. NCHNAMLEN is sized to make structure 157 * size a power of two to optimize malloc's. Minimum reasonable 158 * size is 15. 159 */ 160 161 #define NCHNAMLEN 31 /* maximum name segment length we bother with */ 162 163 struct namecache { 164 LIST_ENTRY(namecache) nc_hash; /* hash chain */ 165 TAILQ_ENTRY(namecache) nc_lru; /* LRU chain */ 166 struct vnode *nc_dvp; /* vnode of parent of name */ 167 u_long nc_dvpid; /* capability number of nc_dvp */ 168 struct vnode *nc_vp; /* vnode the name refers to */ 169 u_long nc_vpid; /* capability number of nc_vp */ 170 char nc_nlen; /* length of name */ 171 char nc_name[NCHNAMLEN]; /* segment name */ 172 }; 173 174 #ifdef _KERNEL 175 u_long nextvnodeid; 176 int namei __P((struct nameidata *ndp)); 177 int lookup __P((struct nameidata *ndp)); 178 int relookup __P((struct vnode *dvp, struct vnode **vpp, 179 struct componentname *cnp)); 180 void cache_purge __P((struct vnode *)); 181 int cache_lookup __P((struct vnode *, struct vnode **, struct componentname *)); 182 void cache_enter __P((struct vnode *, struct vnode *, struct componentname *)); 183 void nchinit __P((void)); 184 struct mount; 185 void cache_purgevfs __P((struct mount *)); 186 187 #endif 188 189 /* 190 * Stats on usefulness of namei caches. 191 */ 192 struct nchstats { 193 long ncs_goodhits; /* hits that we can really use */ 194 long ncs_neghits; /* negative hits that we can use */ 195 long ncs_badhits; /* hits we must drop */ 196 long ncs_falsehits; /* hits with id mismatch */ 197 long ncs_miss; /* misses */ 198 long ncs_long; /* long names that ignore cache */ 199 long ncs_pass2; /* names found with passes == 2 */ 200 long ncs_2passes; /* number of times we attempt it */ 201 }; 202 #endif /* !_SYS_NAMEI_H_ */ 203