The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/namei.h

Version: -  FREEBSD  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-2  -  FREEBSD-11-1  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-4  -  FREEBSD-10-3  -  FREEBSD-10-2  -  FREEBSD-10-1  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-3  -  FREEBSD-9-2  -  FREEBSD-9-1  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-4  -  FREEBSD-8-3  -  FREEBSD-8-2  -  FREEBSD-8-1  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-4  -  FREEBSD-7-3  -  FREEBSD-7-2  -  FREEBSD-7-1  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-4  -  FREEBSD-6-3  -  FREEBSD-6-2  -  FREEBSD-6-1  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-5  -  FREEBSD-5-4  -  FREEBSD-5-3  -  FREEBSD-5-2  -  FREEBSD-5-1  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD5  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  xnu-1456.1.26  -  xnu-1699.24.8  -  xnu-2050.18.24  -  OPENSOLARIS  -  minix-3-1-1 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: namei.h,v 1.77 2011/04/24 18:46:24 rmind 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.23 2011/04/18 00:40:54 dholland 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  */
   70 struct pathbuf;
   71 
   72 struct pathbuf *pathbuf_create(const char *path);
   73 struct pathbuf *pathbuf_assimilate(char *path);
   74 int pathbuf_copyin(const char *userpath, struct pathbuf **ret);
   75 void pathbuf_destroy(struct pathbuf *);
   76 
   77 /* get a copy of the (current) path string */
   78 void pathbuf_copystring(const struct pathbuf *, char *buf, size_t maxlen);
   79 
   80 /* hold a reference copy of the original path string */
   81 const char *pathbuf_stringcopy_get(struct pathbuf *);
   82 void pathbuf_stringcopy_put(struct pathbuf *, const char *);
   83 
   84 // XXX remove this
   85 int pathbuf_maybe_copyin(const char *userpath, enum uio_seg seg, struct pathbuf **ret);
   86 
   87 /*
   88  * Encapsulation of namei parameters.
   89  */
   90 struct nameidata {
   91         /*
   92          * Arguments to namei/lookup.
   93          */
   94         struct pathbuf *ni_pathbuf;     /* pathname container */
   95         char *ni_pnbuf;                 /* extra pathname buffer ref (XXX) */
   96         /*
   97          * Arguments to lookup.
   98          */
   99         struct  vnode *ni_rootdir;      /* logical root directory */
  100         struct  vnode *ni_erootdir;     /* emulation root directory */
  101         /*
  102          * Results: returned from/manipulated by lookup
  103          */
  104         struct  vnode *ni_vp;           /* vnode of result */
  105         struct  vnode *ni_dvp;          /* vnode of intermediate directory */
  106         /*
  107          * Shared between namei and lookup/commit routines.
  108          */
  109         size_t          ni_pathlen;     /* remaining chars in path */
  110         const char      *ni_next;       /* next location in pathname */
  111         unsigned int    ni_loopcnt;     /* count of symlinks encountered */
  112         /*
  113          * Lookup parameters: this structure describes the subset of
  114          * information from the nameidata structure that is passed
  115          * through the VOP interface.
  116          */
  117         struct componentname {
  118                 /*
  119                  * Arguments to lookup.
  120                  */
  121                 uint32_t        cn_nameiop;     /* namei operation */
  122                 uint32_t        cn_flags;       /* flags to namei */
  123                 kauth_cred_t    cn_cred;        /* credentials */
  124                 /*
  125                  * Shared between lookup and commit routines.
  126                  */
  127                 const char      *cn_nameptr;    /* pointer to looked up name */
  128                 size_t          cn_namelen;     /* length of looked up comp */
  129                 u_long          cn_hash;        /* hash val of looked up name */
  130                 size_t          cn_consume;     /* chars to consume in lookup */
  131         } ni_cnd;
  132 };
  133 
  134 /*
  135  * namei operations
  136  */
  137 #define LOOKUP          0       /* perform name lookup only */
  138 #define CREATE          1       /* setup for file creation */
  139 #define DELETE          2       /* setup for file deletion */
  140 #define RENAME          3       /* setup for file renaming */
  141 #define OPMASK          3       /* mask for operation */
  142 /*
  143  * namei operational modifier flags, stored in ni_cnd.cn_flags
  144  */
  145 #define LOCKLEAF        0x00000004      /* lock inode on return */
  146 #define LOCKPARENT      0x00000008      /* want parent vnode returned locked */
  147 #define TRYEMULROOT     0x00000010      /* try relative to emulation root
  148                                            first */
  149 #define NOCACHE         0x00000020      /* name must not be left in cache */
  150 #define FOLLOW          0x00000040      /* follow symbolic links */
  151 #define NOFOLLOW        0x00000000      /* do not follow symbolic links
  152                                            (pseudo) */
  153 #define EMULROOTSET     0x00000080      /* emulation root already
  154                                            in ni_erootdir */
  155 #define NOCHROOT        0x01000000      /* no chroot on abs path lookups */
  156 #define MODMASK         0x010000fc      /* mask of operational modifiers */
  157 /*
  158  * Namei parameter descriptors.
  159  */
  160 #define NOCROSSMOUNT    0x0000100       /* do not cross mount points */
  161 #define RDONLY          0x0000200       /* lookup with read-only semantics */
  162 #define ISDOTDOT        0x0002000       /* current component name is .. */
  163 #define MAKEENTRY       0x0004000       /* entry is to be added to name cache */
  164 #define ISLASTCN        0x0008000       /* this is last component of pathname */
  165 #define ISWHITEOUT      0x0020000       /* found whiteout */
  166 #define DOWHITEOUT      0x0040000       /* do whiteouts */
  167 #define REQUIREDIR      0x0080000       /* must be a directory */
  168 #define CREATEDIR       0x0200000       /* trailing slashes are ok */
  169 #define INRENAME        0x0400000       /* operation is a part of ``rename'' */
  170 #define INRELOOKUP      0x0800000       /* set while inside relookup() */
  171 #define PARAMASK        0x0eee300       /* mask of parameter descriptors */
  172 
  173 /*
  174  * Initialization of an nameidata structure.
  175  */
  176 #define NDINIT(ndp, op, flags, pathbuf) { \
  177         (ndp)->ni_cnd.cn_nameiop = op; \
  178         (ndp)->ni_cnd.cn_flags = flags; \
  179         (ndp)->ni_pathbuf = pathbuf; \
  180         (ndp)->ni_cnd.cn_cred = kauth_cred_get(); \
  181 }
  182 #endif
  183 
  184 /*
  185  * This structure describes the elements in the cache of recent
  186  * names looked up by namei. NCHNAMLEN is sized to make structure
  187  * size a power of two to optimize allocations.  Minimum reasonable
  188  * size is 15.
  189  */
  190 
  191 #define NCHNAMLEN       31      /* maximum name segment length we bother with */
  192 
  193 /*
  194  * Namecache entry.  This structure is arranged so that frequently
  195  * accessed and mostly read-only data is toward the front, with
  196  * infrequently accessed data and the lock towards the rear.  The
  197  * lock is then more likely to be in a seperate cache line.
  198  */
  199 struct  namecache {
  200         LIST_ENTRY(namecache) nc_hash;  /* hash chain */
  201         LIST_ENTRY(namecache) nc_vhash; /* directory hash chain */
  202         struct  vnode *nc_dvp;          /* vnode of parent of name */
  203         struct  vnode *nc_vp;           /* vnode the name refers to */
  204         int     nc_flags;               /* copy of componentname's ISWHITEOUT */
  205         char    nc_nlen;                /* length of name */
  206         char    nc_name[NCHNAMLEN];     /* segment name */
  207         void    *nc_gcqueue;            /* queue for garbage collection */
  208         TAILQ_ENTRY(namecache) nc_lru;  /* psuedo-lru chain */
  209         LIST_ENTRY(namecache) nc_dvlist;
  210         LIST_ENTRY(namecache) nc_vlist;
  211         kmutex_t nc_lock;               /* lock on this entry */
  212         int     nc_hittime;             /* last time scored a hit */
  213 };
  214 
  215 #ifdef _KERNEL
  216 #include <sys/pool.h>
  217 
  218 struct mount;
  219 struct cpu_info;
  220 
  221 extern pool_cache_t pnbuf_cache;        /* pathname buffer cache */
  222 
  223 #define PNBUF_GET()     pool_cache_get(pnbuf_cache, PR_WAITOK)
  224 #define PNBUF_PUT(pnb)  pool_cache_put(pnbuf_cache, (pnb))
  225 
  226 /*
  227  * Typesafe flags for namei_simple.
  228  *
  229  * This encoding is not optimal but serves the important purpose of
  230  * not being type-compatible with the regular namei flags.
  231  */
  232 struct namei_simple_flags_type; /* Opaque. */
  233 typedef const struct namei_simple_flags_type *namei_simple_flags_t; /* Gross. */
  234 extern const namei_simple_flags_t
  235         NSM_NOFOLLOW_NOEMULROOT,
  236         NSM_NOFOLLOW_TRYEMULROOT,
  237         NSM_FOLLOW_NOEMULROOT,
  238         NSM_FOLLOW_TRYEMULROOT;
  239 
  240 /*
  241  * namei_simple_* - the simple cases of namei, with no struct
  242  *                  nameidata involved.
  243  *
  244  * namei_simple_kernel takes a kernel-space path as the first argument.
  245  * namei_simple_user takes a user-space path as the first argument.
  246  *
  247  * A namei call can be converted to namei_simple_* if:
  248  *    - the second arg to NDINIT is LOOKUP;
  249  *    - it does not need the parent vnode, nd.ni_dvp;
  250  *    - the only flags it uses are (NO)FOLLOW and TRYEMULROOT;
  251  *    - it does not do anything else gross with the contents of nd.
  252  */
  253 int namei_simple_kernel(const char *, namei_simple_flags_t, struct vnode **);
  254 int namei_simple_user(const char *, namei_simple_flags_t, struct vnode **);
  255 
  256 int     namei(struct nameidata *);
  257 uint32_t namei_hash(const char *, const char **);
  258 int     lookup_for_nfsd(struct nameidata *, struct vnode *, int neverfollow);
  259 int     lookup_for_nfsd_index(struct nameidata *, struct vnode *);
  260 int     relookup(struct vnode *, struct vnode **, struct componentname *, int);
  261 void    cache_purge1(struct vnode *, const struct componentname *, int);
  262 #define PURGE_PARENTS   1
  263 #define PURGE_CHILDREN  2
  264 #define cache_purge(vp) cache_purge1((vp), NULL, PURGE_PARENTS|PURGE_CHILDREN)
  265 int     cache_lookup(struct vnode *, struct vnode **, struct componentname *);
  266 int     cache_lookup_raw(struct vnode *, struct vnode **,
  267                          struct componentname *);
  268 int     cache_revlookup(struct vnode *, struct vnode **, char **, char *);
  269 void    cache_enter(struct vnode *, struct vnode *, struct componentname *);
  270 void    nchinit(void);
  271 void    nchreinit(void);
  272 void    cache_cpu_init(struct cpu_info *);
  273 void    cache_purgevfs(struct mount *);
  274 void    namecache_print(struct vnode *, void (*)(const char *, ...));
  275 
  276 #endif
  277 
  278 /*
  279  * Stats on usefulness of namei caches.
  280  * XXX: should be 64-bit counters.
  281  */
  282 struct  nchstats {
  283         long    ncs_goodhits;           /* hits that we can really use */
  284         long    ncs_neghits;            /* negative hits that we can use */
  285         long    ncs_badhits;            /* hits we must drop */
  286         long    ncs_falsehits;          /* hits with id mismatch */
  287         long    ncs_miss;               /* misses */
  288         long    ncs_long;               /* long names that ignore cache */
  289         long    ncs_pass2;              /* names found with passes == 2 */
  290         long    ncs_2passes;            /* number of times we attempt it */
  291         long    ncs_revhits;            /* reverse-cache hits */
  292         long    ncs_revmiss;            /* reverse-cache misses */
  293 };
  294 
  295 #ifdef _KERNEL
  296 extern struct nchstats nchstats;
  297 #endif
  298 /* #endif !_SYS_NAMEI_H_ (generated by gennameih.awk) */
  299 
  300 /* Definitions match above, but with NAMEI_ prefix */
  301 #define NAMEI_LOOKUP    0
  302 #define NAMEI_CREATE    1
  303 #define NAMEI_DELETE    2
  304 #define NAMEI_RENAME    3
  305 #define NAMEI_OPMASK    3
  306 #define NAMEI_LOCKLEAF  0x00000004
  307 #define NAMEI_LOCKPARENT        0x00000008
  308 #define NAMEI_TRYEMULROOT       0x00000010
  309 #define NAMEI_NOCACHE   0x00000020
  310 #define NAMEI_FOLLOW    0x00000040
  311 #define NAMEI_NOFOLLOW  0x00000000
  312 #define NAMEI_EMULROOTSET       0x00000080
  313 #define NAMEI_NOCHROOT  0x01000000
  314 #define NAMEI_MODMASK   0x010000fc
  315 #define NAMEI_NOCROSSMOUNT      0x0000100
  316 #define NAMEI_RDONLY    0x0000200
  317 #define NAMEI_ISDOTDOT  0x0002000
  318 #define NAMEI_MAKEENTRY 0x0004000
  319 #define NAMEI_ISLASTCN  0x0008000
  320 #define NAMEI_ISWHITEOUT        0x0020000
  321 #define NAMEI_DOWHITEOUT        0x0040000
  322 #define NAMEI_REQUIREDIR        0x0080000
  323 #define NAMEI_CREATEDIR 0x0200000
  324 #define NAMEI_INRENAME  0x0400000
  325 #define NAMEI_INRELOOKUP        0x0800000
  326 #define NAMEI_PARAMASK  0x0eee300
  327 
  328 #endif /* !_SYS_NAMEI_H_ */

Cache object: 61a118a6ee6ade6ee895264b51340051


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.