1 /* $NetBSD: namei.h,v 1.37 2004/06/27 08:50:44 yamt 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. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 * @(#)namei.h 8.5 (Berkeley) 8/20/94 32 */ 33 34 #ifndef _SYS_NAMEI_H_ 35 #define _SYS_NAMEI_H_ 36 37 #include <sys/queue.h> 38 39 /* 40 * Encapsulation of namei parameters. 41 */ 42 struct nameidata { 43 /* 44 * Arguments to namei/lookup. 45 */ 46 const char *ni_dirp; /* pathname pointer */ 47 enum uio_seg ni_segflg; /* location of pathname */ 48 /* u_long ni_nameiop; namei operation */ 49 /* u_long ni_flags; flags to namei */ 50 /* struct proc *ni_proc; process requesting lookup */ 51 /* 52 * Arguments to lookup. 53 */ 54 /* struct ucred *ni_cred; credentials */ 55 struct vnode *ni_startdir; /* starting directory */ 56 struct vnode *ni_rootdir; /* logical root directory */ 57 /* 58 * Results: returned from/manipulated by lookup 59 */ 60 struct vnode *ni_vp; /* vnode of result */ 61 struct vnode *ni_dvp; /* vnode of intermediate directory */ 62 /* 63 * Shared between namei and lookup/commit routines. 64 */ 65 size_t ni_pathlen; /* remaining chars in path */ 66 const char *ni_next; /* next location in pathname */ 67 u_long ni_loopcnt; /* count of symlinks encountered */ 68 /* 69 * Lookup parameters: this structure describes the subset of 70 * information from the nameidata structure that is passed 71 * through the VOP interface. 72 */ 73 struct componentname { 74 /* 75 * Arguments to lookup. 76 */ 77 u_long cn_nameiop; /* namei operation */ 78 u_long cn_flags; /* flags to namei */ 79 struct proc *cn_proc; /* process requesting lookup */ 80 struct ucred *cn_cred; /* credentials */ 81 /* 82 * Shared between lookup and commit routines. 83 */ 84 char *cn_pnbuf; /* pathname buffer */ 85 const char *cn_nameptr; /* pointer to looked up name */ 86 long cn_namelen; /* length of looked up component */ 87 u_long cn_hash; /* hash value of looked up name */ 88 long cn_consume; /* chars to consume in lookup() */ 89 } ni_cnd; 90 }; 91 92 #ifdef _KERNEL 93 /* 94 * namei operations 95 */ 96 #define LOOKUP 0 /* perform name lookup only */ 97 #define CREATE 1 /* setup for file creation */ 98 #define DELETE 2 /* setup for file deletion */ 99 #define RENAME 3 /* setup for file renaming */ 100 #define OPMASK 3 /* mask for operation */ 101 /* 102 * namei operational modifier flags, stored in ni_cnd.cn_flags 103 */ 104 #define LOCKLEAF 0x0004 /* lock inode on return */ 105 #define LOCKPARENT 0x0008 /* want parent vnode returned locked */ 106 #define WANTPARENT 0x0010 /* want parent vnode returned unlocked */ 107 #define NOCACHE 0x0020 /* name must not be left in cache */ 108 #define FOLLOW 0x0040 /* follow symbolic links */ 109 #define NOFOLLOW 0x0000 /* do not follow symbolic links (pseudo) */ 110 #define MODMASK 0x00fc /* mask of operational modifiers */ 111 /* 112 * Namei parameter descriptors. 113 * 114 * SAVENAME may be set by either the callers of namei or by VOP_LOOKUP. 115 * If the caller of namei sets the flag (for example execve wants to 116 * know the name of the program that is being executed), then it must 117 * free the buffer. If VOP_LOOKUP sets the flag, then the buffer must 118 * be freed by either the commit routine or the VOP_ABORT routine. 119 * SAVESTART is set only by the callers of namei. It implies SAVENAME 120 * plus the addition of saving the parent directory that contains the 121 * name in ni_startdir. It allows repeated calls to lookup for the 122 * name being sought. The caller is responsible for releasing the 123 * buffer and for vrele'ing ni_startdir. 124 */ 125 #define NOCROSSMOUNT 0x0000100 /* do not cross mount points */ 126 #define RDONLY 0x0000200 /* lookup with read-only semantics */ 127 #define HASBUF 0x0000400 /* has allocated pathname buffer */ 128 #define SAVENAME 0x0000800 /* save pathname buffer */ 129 #define SAVESTART 0x0001000 /* save starting directory */ 130 #define ISDOTDOT 0x0002000 /* current component name is .. */ 131 #define MAKEENTRY 0x0004000 /* entry is to be added to name cache */ 132 #define ISLASTCN 0x0008000 /* this is last component of pathname */ 133 #define ISSYMLINK 0x0010000 /* symlink needs interpretation */ 134 #define ISWHITEOUT 0x0020000 /* found whiteout */ 135 #define DOWHITEOUT 0x0040000 /* do whiteouts */ 136 #define REQUIREDIR 0x0080000 /* must be a directory */ 137 #define PDIRUNLOCK 0x0100000 /* vfs_lookup() unlocked parent dir */ 138 #define CREATEDIR 0x0200000 /* creating entry is a directory */ 139 #define PARAMASK 0x03fff00 /* mask of parameter descriptors */ 140 /* 141 * Initialization of an nameidata structure. 142 */ 143 #define NDINIT(ndp, op, flags, segflg, namep, p) { \ 144 (ndp)->ni_cnd.cn_nameiop = op; \ 145 (ndp)->ni_cnd.cn_flags = flags; \ 146 (ndp)->ni_segflg = segflg; \ 147 (ndp)->ni_dirp = namep; \ 148 (ndp)->ni_cnd.cn_proc = p; \ 149 (ndp)->ni_cnd.cn_cred = p->p_ucred; \ 150 } 151 #endif 152 153 /* 154 * This structure describes the elements in the cache of recent 155 * names looked up by namei. NCHNAMLEN is sized to make structure 156 * size a power of two to optimize malloc's. Minimum reasonable 157 * size is 15. 158 */ 159 160 #define NCHNAMLEN 31 /* maximum name segment length we bother with */ 161 162 struct namecache { 163 LIST_ENTRY(namecache) nc_hash; /* hash chain */ 164 TAILQ_ENTRY(namecache) nc_lru; /* LRU chain */ 165 LIST_ENTRY(namecache) nc_vhash; /* directory hash chain */ 166 LIST_ENTRY(namecache) nc_dvlist; 167 struct vnode *nc_dvp; /* vnode of parent of name */ 168 LIST_ENTRY(namecache) nc_vlist; 169 struct vnode *nc_vp; /* vnode the name refers to */ 170 int nc_flags; /* copy of componentname's ISWHITEOUT */ 171 char nc_nlen; /* length of name */ 172 char nc_name[NCHNAMLEN]; /* segment name */ 173 }; 174 175 #ifdef _KERNEL 176 #include <sys/mallocvar.h> 177 #include <sys/pool.h> 178 179 extern struct pool pnbuf_pool; /* pathname buffer pool */ 180 extern struct pool_cache pnbuf_cache; /* pathname buffer cache */ 181 182 MALLOC_DECLARE(M_NAMEI); 183 184 #define PNBUF_GET() pool_cache_get(&pnbuf_cache, PR_WAITOK) 185 #define PNBUF_PUT(pnb) pool_cache_put(&pnbuf_cache, (pnb)) 186 187 int namei __P((struct nameidata *)); 188 uint32_t namei_hash __P((const char *, const char **)); 189 int lookup __P((struct nameidata *)); 190 int relookup __P((struct vnode *, struct vnode **, struct componentname *)); 191 void cache_purge1 __P((struct vnode *, const struct componentname *, int)); 192 #define PURGE_PARENTS 1 193 #define PURGE_CHILDREN 2 194 #define cache_purge(vp) cache_purge1((vp), NULL, PURGE_PARENTS|PURGE_CHILDREN) 195 int cache_lookup __P((struct vnode *, struct vnode **, struct componentname *)); 196 int cache_lookup_raw __P((struct vnode *, struct vnode **, 197 struct componentname *)); 198 int cache_revlookup __P((struct vnode *, struct vnode **, char **, char *)); 199 void cache_enter __P((struct vnode *, struct vnode *, struct componentname *)); 200 void nchinit __P((void)); 201 void nchreinit __P((void)); 202 struct mount; 203 void cache_purgevfs __P((struct mount *)); 204 void namecache_print(struct vnode *, void (*)(const char *, ...)); 205 #endif 206 207 /* 208 * Stats on usefulness of namei caches. 209 */ 210 struct nchstats { 211 long ncs_goodhits; /* hits that we can really use */ 212 long ncs_neghits; /* negative hits that we can use */ 213 long ncs_badhits; /* hits we must drop */ 214 long ncs_falsehits; /* hits with id mismatch */ 215 long ncs_miss; /* misses */ 216 long ncs_long; /* long names that ignore cache */ 217 long ncs_pass2; /* names found with passes == 2 */ 218 long ncs_2passes; /* number of times we attempt it */ 219 long ncs_revhits; /* reverse-cache hits */ 220 long ncs_revmiss; /* reverse-cache misses */ 221 }; 222 223 #ifdef _KERNEL 224 extern struct nchstats nchstats; 225 #endif 226 #endif /* !_SYS_NAMEI_H_ */ 227