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