| @@ -1,292 +1,292 @@ | | | @@ -1,292 +1,292 @@ |
1 | /* $NetBSD: namei.src,v 1.21 2011/01/02 05:12:33 dholland Exp $ */ | | 1 | /* $NetBSD: namei.src,v 1.22 2011/01/07 11:25:10 pooka Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 1985, 1989, 1991, 1993 | | 4 | * Copyright (c) 1985, 1989, 1991, 1993 |
5 | * The Regents of the University of California. All rights reserved. | | 5 | * The Regents of the University of California. All rights reserved. |
6 | * | | 6 | * |
7 | * Redistribution and use in source and binary forms, with or without | | 7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions | | 8 | * modification, are permitted provided that the following conditions |
9 | * are met: | | 9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright | | 10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. | | 11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. Redistributions in binary form must reproduce the above copyright | | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the | | 13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. | | 14 | * documentation and/or other materials provided with the distribution. |
15 | * 3. Neither the name of the University nor the names of its contributors | | 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 | | 16 | * may be used to endorse or promote products derived from this software |
17 | * without specific prior written permission. | | 17 | * without specific prior written permission. |
18 | * | | 18 | * |
19 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | | 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 | | 20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | 21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | | 22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | 23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | | 24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 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 | | 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 | | 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 | | 28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
29 | * SUCH DAMAGE. | | 29 | * SUCH DAMAGE. |
30 | * | | 30 | * |
31 | * @(#)namei.h 8.5 (Berkeley) 8/20/94 | | 31 | * @(#)namei.h 8.5 (Berkeley) 8/20/94 |
32 | */ | | 32 | */ |
33 | | | 33 | |
34 | #ifndef _SYS_NAMEI_H_ | | 34 | #ifndef _SYS_NAMEI_H_ |
35 | #define _SYS_NAMEI_H_ | | 35 | #define _SYS_NAMEI_H_ |
36 | | | 36 | |
37 | #include <sys/queue.h> | | 37 | #include <sys/queue.h> |
38 | #include <sys/mutex.h> | | 38 | #include <sys/mutex.h> |
39 | | | 39 | |
40 | #ifdef _KERNEL | | 40 | #ifdef _KERNEL |
41 | #include <sys/kauth.h> | | 41 | #include <sys/kauth.h> |
42 | | | 42 | |
43 | /* | | 43 | /* |
44 | * Abstraction for a single pathname. | | 44 | * Abstraction for a single pathname. |
45 | * | | 45 | * |
46 | * This contains both the pathname string and (eventually) all | | 46 | * This contains both the pathname string and (eventually) all |
47 | * metadata that determines how the path is to be interpreted. | | 47 | * metadata that determines how the path is to be interpreted. |
48 | * It is an opaque structure; the implementation is in vfs_lookup.c. | | 48 | * It is an opaque structure; the implementation is in vfs_lookup.c. |
49 | * | | 49 | * |
50 | * To call namei, first set up a pathbuf with pathbuf_create or | | 50 | * To call namei, first set up a pathbuf with pathbuf_create or |
51 | * pathbuf_copyin, then do NDINIT(), then call namei, then AFTER THE | | 51 | * pathbuf_copyin, then do NDINIT(), then call namei, then AFTER THE |
52 | * STRUCT NAMEIDATA IS DEAD, call pathbuf_destroy. Don't destroy the | | 52 | * STRUCT NAMEIDATA IS DEAD, call pathbuf_destroy. Don't destroy the |
53 | * pathbuf before you've finished using the nameidata, or mysterious | | 53 | * pathbuf before you've finished using the nameidata, or mysterious |
54 | * bad things may happen. | | 54 | * bad things may happen. |
55 | * | | 55 | * |
56 | * pathbuf_assimilate is like pathbuf_create but assumes ownership of | | 56 | * pathbuf_assimilate is like pathbuf_create but assumes ownership of |
57 | * the string buffer passed in, which MUST BE of size PATH_MAX and | | 57 | * the string buffer passed in, which MUST BE of size PATH_MAX and |
58 | * have been allocated with PNBUF_GET(). This should only be used when | | 58 | * have been allocated with PNBUF_GET(). This should only be used when |
59 | * absolutely necessary; e.g. nfsd uses it for loading paths from | | 59 | * absolutely necessary; e.g. nfsd uses it for loading paths from |
60 | * mbufs. | | 60 | * mbufs. |
61 | */ | | 61 | */ |
62 | struct pathbuf; | | 62 | struct pathbuf; |
63 | | | 63 | |
64 | struct pathbuf *pathbuf_create(const char *path); | | 64 | struct pathbuf *pathbuf_create(const char *path); |
65 | struct pathbuf *pathbuf_assimilate(char *path); | | 65 | struct pathbuf *pathbuf_assimilate(char *path); |
66 | int pathbuf_copyin(const char *userpath, struct pathbuf **ret); | | 66 | int pathbuf_copyin(const char *userpath, struct pathbuf **ret); |
67 | void pathbuf_destroy(struct pathbuf *); | | 67 | void pathbuf_destroy(struct pathbuf *); |
68 | | | 68 | |
69 | /* get a copy of the (current) path string */ | | 69 | /* get a copy of the (current) path string */ |
70 | void pathbuf_copystring(const struct pathbuf *, char *buf, size_t maxlen); | | 70 | void pathbuf_copystring(const struct pathbuf *, char *buf, size_t maxlen); |
71 | | | 71 | |
72 | /* hold a reference copy of the original path string */ | | 72 | /* hold a reference copy of the original path string */ |
73 | const char *pathbuf_stringcopy_get(struct pathbuf *); | | 73 | const char *pathbuf_stringcopy_get(struct pathbuf *); |
74 | void pathbuf_stringcopy_put(struct pathbuf *, const char *); | | 74 | void pathbuf_stringcopy_put(struct pathbuf *, const char *); |
75 | | | 75 | |
76 | // XXX remove this | | 76 | // XXX remove this |
77 | int pathbuf_maybe_copyin(const char *userpath, enum uio_seg seg, struct pathbuf **ret); | | 77 | int pathbuf_maybe_copyin(const char *userpath, enum uio_seg seg, struct pathbuf **ret); |
78 | | | 78 | |
79 | /* | | 79 | /* |
80 | * Encapsulation of namei parameters. | | 80 | * Encapsulation of namei parameters. |
81 | */ | | 81 | */ |
82 | struct nameidata { | | 82 | struct nameidata { |
83 | /* | | 83 | /* |
84 | * Arguments to namei/lookup. | | 84 | * Arguments to namei/lookup. |
85 | */ | | 85 | */ |
86 | struct pathbuf *ni_pathbuf; /* pathname container */ | | 86 | struct pathbuf *ni_pathbuf; /* pathname container */ |
87 | char *ni_pnbuf; /* extra pathname buffer ref (XXX) */ | | 87 | char *ni_pnbuf; /* extra pathname buffer ref (XXX) */ |
88 | /* | | 88 | /* |
89 | * Arguments to lookup. | | 89 | * Arguments to lookup. |
90 | */ | | 90 | */ |
91 | struct vnode *ni_rootdir; /* logical root directory */ | | 91 | struct vnode *ni_rootdir; /* logical root directory */ |
92 | struct vnode *ni_erootdir; /* emulation root directory */ | | 92 | struct vnode *ni_erootdir; /* emulation root directory */ |
93 | /* | | 93 | /* |
94 | * Results: returned from/manipulated by lookup | | 94 | * Results: returned from/manipulated by lookup |
95 | */ | | 95 | */ |
96 | struct vnode *ni_vp; /* vnode of result */ | | 96 | struct vnode *ni_vp; /* vnode of result */ |
97 | struct vnode *ni_dvp; /* vnode of intermediate directory */ | | 97 | struct vnode *ni_dvp; /* vnode of intermediate directory */ |
98 | /* | | 98 | /* |
99 | * Shared between namei and lookup/commit routines. | | 99 | * Shared between namei and lookup/commit routines. |
100 | */ | | 100 | */ |
101 | size_t ni_pathlen; /* remaining chars in path */ | | 101 | size_t ni_pathlen; /* remaining chars in path */ |
102 | const char *ni_next; /* next location in pathname */ | | 102 | const char *ni_next; /* next location in pathname */ |
103 | unsigned int ni_loopcnt; /* count of symlinks encountered */ | | 103 | unsigned int ni_loopcnt; /* count of symlinks encountered */ |
104 | /* | | 104 | /* |
105 | * Lookup parameters: this structure describes the subset of | | 105 | * Lookup parameters: this structure describes the subset of |
106 | * information from the nameidata structure that is passed | | 106 | * information from the nameidata structure that is passed |
107 | * through the VOP interface. | | 107 | * through the VOP interface. |
108 | */ | | 108 | */ |
109 | struct componentname { | | 109 | struct componentname { |
110 | /* | | 110 | /* |
111 | * Arguments to lookup. | | 111 | * Arguments to lookup. |
112 | */ | | 112 | */ |
113 | uint32_t cn_nameiop; /* namei operation */ | | 113 | uint32_t cn_nameiop; /* namei operation */ |
114 | uint32_t cn_flags; /* flags to namei */ | | 114 | uint32_t cn_flags; /* flags to namei */ |
115 | kauth_cred_t cn_cred; /* credentials */ | | 115 | kauth_cred_t cn_cred; /* credentials */ |
116 | /* | | 116 | /* |
117 | * Shared between lookup and commit routines. | | 117 | * Shared between lookup and commit routines. |
118 | */ | | 118 | */ |
119 | const char *cn_nameptr; /* pointer to looked up name */ | | 119 | const char *cn_nameptr; /* pointer to looked up name */ |
120 | size_t cn_namelen; /* length of looked up comp */ | | 120 | size_t cn_namelen; /* length of looked up comp */ |
121 | u_long cn_hash; /* hash val of looked up name */ | | 121 | u_long cn_hash; /* hash val of looked up name */ |
122 | size_t cn_consume; /* chars to consume in lookup */ | | 122 | size_t cn_consume; /* chars to consume in lookup */ |
123 | } ni_cnd; | | 123 | } ni_cnd; |
124 | }; | | 124 | }; |
125 | | | 125 | |
126 | /* | | 126 | /* |
127 | * namei operations | | 127 | * namei operations |
128 | */ | | 128 | */ |
129 | NAMEIFL LOOKUP 0 /* perform name lookup only */ | | 129 | NAMEIFL LOOKUP 0 /* perform name lookup only */ |
130 | NAMEIFL CREATE 1 /* setup for file creation */ | | 130 | NAMEIFL CREATE 1 /* setup for file creation */ |
131 | NAMEIFL DELETE 2 /* setup for file deletion */ | | 131 | NAMEIFL DELETE 2 /* setup for file deletion */ |
132 | NAMEIFL RENAME 3 /* setup for file renaming */ | | 132 | NAMEIFL RENAME 3 /* setup for file renaming */ |
133 | NAMEIFL OPMASK 3 /* mask for operation */ | | 133 | NAMEIFL OPMASK 3 /* mask for operation */ |
134 | /* | | 134 | /* |
135 | * namei operational modifier flags, stored in ni_cnd.cn_flags | | 135 | * namei operational modifier flags, stored in ni_cnd.cn_flags |
136 | */ | | 136 | */ |
137 | NAMEIFL LOCKLEAF 0x00000004 /* lock inode on return */ | | 137 | NAMEIFL LOCKLEAF 0x00000004 /* lock inode on return */ |
138 | NAMEIFL LOCKPARENT 0x00000008 /* want parent vnode returned locked */ | | 138 | NAMEIFL LOCKPARENT 0x00000008 /* want parent vnode returned locked */ |
139 | NAMEIFL TRYEMULROOT 0x00000010 /* try relative to emulation root | | 139 | NAMEIFL TRYEMULROOT 0x00000010 /* try relative to emulation root |
140 | first */ | | 140 | first */ |
141 | NAMEIFL NOCACHE 0x00000020 /* name must not be left in cache */ | | 141 | NAMEIFL NOCACHE 0x00000020 /* name must not be left in cache */ |
142 | NAMEIFL FOLLOW 0x00000040 /* follow symbolic links */ | | 142 | NAMEIFL FOLLOW 0x00000040 /* follow symbolic links */ |
143 | NAMEIFL NOFOLLOW 0x00000000 /* do not follow symbolic links | | 143 | NAMEIFL NOFOLLOW 0x00000000 /* do not follow symbolic links |
144 | (pseudo) */ | | 144 | (pseudo) */ |
145 | NAMEIFL EMULROOTSET 0x00000080 /* emulation root already | | 145 | NAMEIFL EMULROOTSET 0x00000080 /* emulation root already |
146 | in ni_erootdir */ | | 146 | in ni_erootdir */ |
147 | NAMEIFL NOCHROOT 0x01000000 /* no chroot on abs path lookups */ | | 147 | NAMEIFL NOCHROOT 0x01000000 /* no chroot on abs path lookups */ |
148 | NAMEIFL MODMASK 0x010000fc /* mask of operational modifiers */ | | 148 | NAMEIFL MODMASK 0x010000fc /* mask of operational modifiers */ |
149 | /* | | 149 | /* |
150 | * Namei parameter descriptors. | | 150 | * Namei parameter descriptors. |
151 | */ | | 151 | */ |
152 | NAMEIFL NOCROSSMOUNT 0x0000100 /* do not cross mount points */ | | 152 | NAMEIFL NOCROSSMOUNT 0x0000100 /* do not cross mount points */ |
153 | NAMEIFL RDONLY 0x0000200 /* lookup with read-only semantics */ | | 153 | NAMEIFL RDONLY 0x0000200 /* lookup with read-only semantics */ |
154 | NAMEIFL ISDOTDOT 0x0002000 /* current component name is .. */ | | 154 | NAMEIFL ISDOTDOT 0x0002000 /* current component name is .. */ |
155 | NAMEIFL MAKEENTRY 0x0004000 /* entry is to be added to name cache */ | | 155 | NAMEIFL MAKEENTRY 0x0004000 /* entry is to be added to name cache */ |
156 | NAMEIFL ISLASTCN 0x0008000 /* this is last component of pathname */ | | 156 | NAMEIFL ISLASTCN 0x0008000 /* this is last component of pathname */ |
157 | NAMEIFL ISSYMLINK 0x0010000 /* symlink needs interpretation */ | | 157 | NAMEIFL ISSYMLINK 0x0010000 /* symlink needs interpretation */ |
158 | NAMEIFL ISWHITEOUT 0x0020000 /* found whiteout */ | | 158 | NAMEIFL ISWHITEOUT 0x0020000 /* found whiteout */ |
159 | NAMEIFL DOWHITEOUT 0x0040000 /* do whiteouts */ | | 159 | NAMEIFL DOWHITEOUT 0x0040000 /* do whiteouts */ |
160 | NAMEIFL REQUIREDIR 0x0080000 /* must be a directory */ | | 160 | NAMEIFL REQUIREDIR 0x0080000 /* must be a directory */ |
161 | NAMEIFL CREATEDIR 0x0200000 /* trailing slashes are ok */ | | 161 | NAMEIFL CREATEDIR 0x0200000 /* trailing slashes are ok */ |
162 | NAMEIFL INRENAME 0x0400000 /* operation is a part of ``rename'' */ | | 162 | NAMEIFL INRENAME 0x0400000 /* operation is a part of ``rename'' */ |
163 | NAMEIFL INRELOOKUP 0x0800000 /* set while inside relookup() */ | | 163 | NAMEIFL INRELOOKUP 0x0800000 /* set while inside relookup() */ |
164 | NAMEIFL PARAMASK 0x0efef00 /* mask of parameter descriptors */ | | 164 | NAMEIFL PARAMASK 0x0efe300 /* mask of parameter descriptors */ |
165 | | | 165 | |
166 | /* | | 166 | /* |
167 | * Initialization of an nameidata structure. | | 167 | * Initialization of an nameidata structure. |
168 | */ | | 168 | */ |
169 | #define NDINIT(ndp, op, flags, pathbuf) { \ | | 169 | #define NDINIT(ndp, op, flags, pathbuf) { \ |
170 | (ndp)->ni_cnd.cn_nameiop = op; \ | | 170 | (ndp)->ni_cnd.cn_nameiop = op; \ |
171 | (ndp)->ni_cnd.cn_flags = flags; \ | | 171 | (ndp)->ni_cnd.cn_flags = flags; \ |
172 | (ndp)->ni_pathbuf = pathbuf; \ | | 172 | (ndp)->ni_pathbuf = pathbuf; \ |
173 | (ndp)->ni_cnd.cn_cred = kauth_cred_get(); \ | | 173 | (ndp)->ni_cnd.cn_cred = kauth_cred_get(); \ |
174 | } | | 174 | } |
175 | #endif | | 175 | #endif |
176 | | | 176 | |
177 | /* | | 177 | /* |
178 | * This structure describes the elements in the cache of recent | | 178 | * This structure describes the elements in the cache of recent |
179 | * names looked up by namei. NCHNAMLEN is sized to make structure | | 179 | * names looked up by namei. NCHNAMLEN is sized to make structure |
180 | * size a power of two to optimize malloc's. Minimum reasonable | | 180 | * size a power of two to optimize malloc's. Minimum reasonable |
181 | * size is 15. | | 181 | * size is 15. |
182 | */ | | 182 | */ |
183 | | | 183 | |
184 | #define NCHNAMLEN 31 /* maximum name segment length we bother with */ | | 184 | #define NCHNAMLEN 31 /* maximum name segment length we bother with */ |
185 | | | 185 | |
186 | /* | | 186 | /* |
187 | * Namecache entry. This structure is arranged so that frequently | | 187 | * Namecache entry. This structure is arranged so that frequently |
188 | * accessed and mostly read-only data is toward the front, with | | 188 | * accessed and mostly read-only data is toward the front, with |
189 | * infrequently accessed data and the lock towards the rear. The | | 189 | * infrequently accessed data and the lock towards the rear. The |
190 | * lock is then more likely to be in a seperate cache line. | | 190 | * lock is then more likely to be in a seperate cache line. |
191 | */ | | 191 | */ |
192 | struct namecache { | | 192 | struct namecache { |
193 | LIST_ENTRY(namecache) nc_hash; /* hash chain */ | | 193 | LIST_ENTRY(namecache) nc_hash; /* hash chain */ |
194 | LIST_ENTRY(namecache) nc_vhash; /* directory hash chain */ | | 194 | LIST_ENTRY(namecache) nc_vhash; /* directory hash chain */ |
195 | struct vnode *nc_dvp; /* vnode of parent of name */ | | 195 | struct vnode *nc_dvp; /* vnode of parent of name */ |
196 | struct vnode *nc_vp; /* vnode the name refers to */ | | 196 | struct vnode *nc_vp; /* vnode the name refers to */ |
197 | int nc_flags; /* copy of componentname's ISWHITEOUT */ | | 197 | int nc_flags; /* copy of componentname's ISWHITEOUT */ |
198 | char nc_nlen; /* length of name */ | | 198 | char nc_nlen; /* length of name */ |
199 | char nc_name[NCHNAMLEN]; /* segment name */ | | 199 | char nc_name[NCHNAMLEN]; /* segment name */ |
200 | void *nc_gcqueue; /* queue for garbage collection */ | | 200 | void *nc_gcqueue; /* queue for garbage collection */ |
201 | TAILQ_ENTRY(namecache) nc_lru; /* psuedo-lru chain */ | | 201 | TAILQ_ENTRY(namecache) nc_lru; /* psuedo-lru chain */ |
202 | LIST_ENTRY(namecache) nc_dvlist; | | 202 | LIST_ENTRY(namecache) nc_dvlist; |
203 | LIST_ENTRY(namecache) nc_vlist; | | 203 | LIST_ENTRY(namecache) nc_vlist; |
204 | kmutex_t nc_lock; /* lock on this entry */ | | 204 | kmutex_t nc_lock; /* lock on this entry */ |
205 | int nc_hittime; /* last time scored a hit */ | | 205 | int nc_hittime; /* last time scored a hit */ |
206 | }; | | 206 | }; |
207 | | | 207 | |
208 | #ifdef _KERNEL | | 208 | #ifdef _KERNEL |
209 | #include <sys/mallocvar.h> | | 209 | #include <sys/mallocvar.h> |
210 | #include <sys/pool.h> | | 210 | #include <sys/pool.h> |
211 | | | 211 | |
212 | struct mount; | | 212 | struct mount; |
213 | struct cpu_info; | | 213 | struct cpu_info; |
214 | | | 214 | |
215 | extern pool_cache_t pnbuf_cache; /* pathname buffer cache */ | | 215 | extern pool_cache_t pnbuf_cache; /* pathname buffer cache */ |
216 | | | 216 | |
217 | #define PNBUF_GET() pool_cache_get(pnbuf_cache, PR_WAITOK) | | 217 | #define PNBUF_GET() pool_cache_get(pnbuf_cache, PR_WAITOK) |
218 | #define PNBUF_PUT(pnb) pool_cache_put(pnbuf_cache, (pnb)) | | 218 | #define PNBUF_PUT(pnb) pool_cache_put(pnbuf_cache, (pnb)) |
219 | | | 219 | |
220 | /* | | 220 | /* |
221 | * Typesafe flags for namei_simple. | | 221 | * Typesafe flags for namei_simple. |
222 | * | | 222 | * |
223 | * This encoding is not optimal but serves the important purpose of | | 223 | * This encoding is not optimal but serves the important purpose of |
224 | * not being type-compatible with the regular namei flags. | | 224 | * not being type-compatible with the regular namei flags. |
225 | */ | | 225 | */ |
226 | struct namei_simple_flags_type; /* Opaque. */ | | 226 | struct namei_simple_flags_type; /* Opaque. */ |
227 | typedef const struct namei_simple_flags_type *namei_simple_flags_t; /* Gross. */ | | 227 | typedef const struct namei_simple_flags_type *namei_simple_flags_t; /* Gross. */ |
228 | extern const namei_simple_flags_t | | 228 | extern const namei_simple_flags_t |
229 | NSM_NOFOLLOW_NOEMULROOT, | | 229 | NSM_NOFOLLOW_NOEMULROOT, |
230 | NSM_NOFOLLOW_TRYEMULROOT, | | 230 | NSM_NOFOLLOW_TRYEMULROOT, |
231 | NSM_FOLLOW_NOEMULROOT, | | 231 | NSM_FOLLOW_NOEMULROOT, |
232 | NSM_FOLLOW_TRYEMULROOT; | | 232 | NSM_FOLLOW_TRYEMULROOT; |
233 | | | 233 | |
234 | /* | | 234 | /* |
235 | * namei_simple_* - the simple cases of namei, with no struct | | 235 | * namei_simple_* - the simple cases of namei, with no struct |
236 | * nameidata involved. | | 236 | * nameidata involved. |
237 | * | | 237 | * |
238 | * namei_simple_kernel takes a kernel-space path as the first argument. | | 238 | * namei_simple_kernel takes a kernel-space path as the first argument. |
239 | * namei_simple_user takes a user-space path as the first argument. | | 239 | * namei_simple_user takes a user-space path as the first argument. |
240 | * | | 240 | * |
241 | * A namei call can be converted to namei_simple_* if: | | 241 | * A namei call can be converted to namei_simple_* if: |
242 | * - the second arg to NDINIT is LOOKUP; | | 242 | * - the second arg to NDINIT is LOOKUP; |
243 | * - it does not need the parent vnode, nd.ni_dvp; | | 243 | * - it does not need the parent vnode, nd.ni_dvp; |
244 | * - the only flags it uses are (NO)FOLLOW and TRYEMULROOT; | | 244 | * - the only flags it uses are (NO)FOLLOW and TRYEMULROOT; |
245 | * - it does not do anything else gross with the contents of nd. | | 245 | * - it does not do anything else gross with the contents of nd. |
246 | */ | | 246 | */ |
247 | int namei_simple_kernel(const char *, namei_simple_flags_t, struct vnode **); | | 247 | int namei_simple_kernel(const char *, namei_simple_flags_t, struct vnode **); |
248 | int namei_simple_user(const char *, namei_simple_flags_t, struct vnode **); | | 248 | int namei_simple_user(const char *, namei_simple_flags_t, struct vnode **); |
249 | | | 249 | |
250 | int namei(struct nameidata *); | | 250 | int namei(struct nameidata *); |
251 | uint32_t namei_hash(const char *, const char **); | | 251 | uint32_t namei_hash(const char *, const char **); |
252 | int lookup_for_nfsd(struct nameidata *, struct vnode *, int neverfollow); | | 252 | int lookup_for_nfsd(struct nameidata *, struct vnode *, int neverfollow); |
253 | int lookup_for_nfsd_index(struct nameidata *, struct vnode *); | | 253 | int lookup_for_nfsd_index(struct nameidata *, struct vnode *); |
254 | int relookup(struct vnode *, struct vnode **, struct componentname *, int); | | 254 | int relookup(struct vnode *, struct vnode **, struct componentname *, int); |
255 | void cache_purge1(struct vnode *, const struct componentname *, int); | | 255 | void cache_purge1(struct vnode *, const struct componentname *, int); |
256 | #define PURGE_PARENTS 1 | | 256 | #define PURGE_PARENTS 1 |
257 | #define PURGE_CHILDREN 2 | | 257 | #define PURGE_CHILDREN 2 |
258 | #define cache_purge(vp) cache_purge1((vp), NULL, PURGE_PARENTS|PURGE_CHILDREN) | | 258 | #define cache_purge(vp) cache_purge1((vp), NULL, PURGE_PARENTS|PURGE_CHILDREN) |
259 | int cache_lookup(struct vnode *, struct vnode **, struct componentname *); | | 259 | int cache_lookup(struct vnode *, struct vnode **, struct componentname *); |
260 | int cache_lookup_raw(struct vnode *, struct vnode **, | | 260 | int cache_lookup_raw(struct vnode *, struct vnode **, |
261 | struct componentname *); | | 261 | struct componentname *); |
262 | int cache_revlookup(struct vnode *, struct vnode **, char **, char *); | | 262 | int cache_revlookup(struct vnode *, struct vnode **, char **, char *); |
263 | void cache_enter(struct vnode *, struct vnode *, struct componentname *); | | 263 | void cache_enter(struct vnode *, struct vnode *, struct componentname *); |
264 | void nchinit(void); | | 264 | void nchinit(void); |
265 | void nchreinit(void); | | 265 | void nchreinit(void); |
266 | void cache_cpu_init(struct cpu_info *); | | 266 | void cache_cpu_init(struct cpu_info *); |
267 | void cache_purgevfs(struct mount *); | | 267 | void cache_purgevfs(struct mount *); |
268 | void namecache_print(struct vnode *, void (*)(const char *, ...)); | | 268 | void namecache_print(struct vnode *, void (*)(const char *, ...)); |
269 | | | 269 | |
270 | #endif | | 270 | #endif |
271 | | | 271 | |
272 | /* | | 272 | /* |
273 | * Stats on usefulness of namei caches. | | 273 | * Stats on usefulness of namei caches. |
274 | * XXX: should be 64-bit counters. | | 274 | * XXX: should be 64-bit counters. |
275 | */ | | 275 | */ |
276 | struct nchstats { | | 276 | struct nchstats { |
277 | long ncs_goodhits; /* hits that we can really use */ | | 277 | long ncs_goodhits; /* hits that we can really use */ |
278 | long ncs_neghits; /* negative hits that we can use */ | | 278 | long ncs_neghits; /* negative hits that we can use */ |
279 | long ncs_badhits; /* hits we must drop */ | | 279 | long ncs_badhits; /* hits we must drop */ |
280 | long ncs_falsehits; /* hits with id mismatch */ | | 280 | long ncs_falsehits; /* hits with id mismatch */ |
281 | long ncs_miss; /* misses */ | | 281 | long ncs_miss; /* misses */ |
282 | long ncs_long; /* long names that ignore cache */ | | 282 | long ncs_long; /* long names that ignore cache */ |
283 | long ncs_pass2; /* names found with passes == 2 */ | | 283 | long ncs_pass2; /* names found with passes == 2 */ |
284 | long ncs_2passes; /* number of times we attempt it */ | | 284 | long ncs_2passes; /* number of times we attempt it */ |
285 | long ncs_revhits; /* reverse-cache hits */ | | 285 | long ncs_revhits; /* reverse-cache hits */ |
286 | long ncs_revmiss; /* reverse-cache misses */ | | 286 | long ncs_revmiss; /* reverse-cache misses */ |
287 | }; | | 287 | }; |
288 | | | 288 | |
289 | #ifdef _KERNEL | | 289 | #ifdef _KERNEL |
290 | extern struct nchstats nchstats; | | 290 | extern struct nchstats nchstats; |
291 | #endif | | 291 | #endif |
292 | /* #endif !_SYS_NAMEI_H_ (generated by gennameih.awk) */ | | 292 | /* #endif !_SYS_NAMEI_H_ (generated by gennameih.awk) */ |