Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
NAMEI(9)		    Kernel Developer's Manual			NAMEI(9)

NAME
     namei,  NDINIT,  NDINIT_AT, NDFREE_PNBUF -- pathname translation and lookup
     operations

SYNOPSIS
     #include <sys/param.h>
     #include <sys/fcntl.h>
     #include <sys/namei.h>

     int
     namei(struct nameidata *ndp);

     void
     NDINIT(struct nameidata *ndp, enum nameiop op, u_int64_t flags,
	 enum uio_seg segflg, const char *namep);

     void
     NDINIT_AT(struct nameidata *ndp, enum nameiop op, u_int64_t flags,
	 enum uio_seg segflg, const char *namep, int dirfd);

     void
     NDFREE_PNBUF(struct nameidata *ndp);

DESCRIPTION
     The namei facility allows the client to perform  pathname	translation  and
     lookup  operations.  The namei functions will increment the reference count
     for the vnode in question.  The reference count has to be decremented after
     use of the vnode, by using either vrele(9) or vput(9), depending on whether
     the LOCKLEAF flag was specified or not.

     The NDINIT() macro is used to initialize namei components.   It  takes  the
     following arguments:

     ndp     A pointer to the struct nameidata to initialize.

     op      The operation which namei() will perform.	The following operations
	     are  valid:  LOOKUP,  CREATE, DELETE, and RENAME.	The latter three
	     are just setup for those effects; just calling namei() will not re-
	     sult in VOP_RENAME() being called.

     flags   Operation flags, described in the next section.  Several  of  these
	     can be effective at the same time.

     segflg  UIO segment indicator.  This indicates if the name of the object is
	     in  userspace  (UIO_USERSPACE)  or  in  the  kernel  address  space
	     (UIO_SYSSPACE).

     namep   Pointer to the component's pathname buffer (the file  or  directory
	     name that will be looked up).

     The NDINIT_AT() macro is similar to NDINIT(), but takes one extra argument:

     dirfd   File  descriptor  referencing  a  directory,  or  the special value
	     AT_FDCWD meaning the calling thread's  current  working  directory.
	     Lookups will be performed relative to this directory.

     The  NDFREE_PNBUF()  macro is used to free the pathname buffer.  It must be
     called exactly once for each successful namei() call.  It takes the follow-
     ing argument:

     ndp     A pointer to a struct nameidata  that  was  used  in  a  successful
	     namei() call.

NAMEI OPERATION FLAGS
     The  namei() function takes the following set of "operation flags" that in-
     fluence its operation:

     NC_NOMAKEENTRY   An alias for NOCACHE.

     NC_KEEPPOSENTRY  Keep the positive-caching entry in cache.   This	flag  is
		      typically  combined with NOCACHE to not cache a new entry,
		      but keep existing one, or with MAKEENTRY.

     NOCACHE	      Avoid namei() creating this entry in the namecache  if  it
		      is  not  already	present.  Normally, namei() will add en-
		      tries to the name cache if they are not already there.

     LOCKLEAF	      Lock vnode on return with LK_EXCLUSIVE  unless  LOCKSHARED
		      is  also set.  VOP_UNLOCK(9) should be used to release the
		      lock (or vput(9) which is equivalent  to	calling  VOP_UN-
		      LOCK(9) followed by vrele(9), all in one).

     LOCKPARENT       This flag lets the namei() function return the parent (di-
		      rectory) vnode, ni_dvp in locked state, unless it is iden-
		      tical  to ni_vp, in which case ni_dvp is not locked per se
		      (but may be locked due to LOCKLEAF).  If	a  lock  is  en-
		      forced,  it  should  be  released using vput(9) or VOP_UN-
		      LOCK(9) and vrele(9).

     WANTPARENT       This flag allows the namei() function to return the parent
		      (directory) vnode in an unlocked state.  The parent  vnode
		      must be released separately by using vrele(9).

     FAILIFEXISTS     Makes  the  namei operation fail if the target exists.  It
		      requires that the LOCKPARENT flag is set and  LOCKLEAF  is
		      not.

     FOLLOW	      With  this  flag, namei() will follow the symbolic link if
		      the last part of the path  supplied  is  a  symbolic  link
		      (i.e., it will return a vnode for whatever the link points
		      at, instead for the link itself).

     EMPTYPATH	      For  namei  call	initialized  with NDINIT_AT(), allow the
		      namep path to be empty.  In this case, the dirfd file  de-
		      scriptor	may reference a file of arbitrary type, not nec-
		      essary a directory, and lookup returns the vnode for  this
		      file.

     LOCKSHARED       Lock  vnode  on return with LK_SHARED, if permitted by the
		      file system that owns the vnode.	The file system must ex-
		      plicitly permit  this  by  setting  MNTK_LOOKUP_SHARED  in
		      mp->mnt_kern_flag    during    mount    and   by	 calling
		      VN_LOCK_ASHARE() when allocating the vnode.   If	LOCKLEAF
		      is specified but shared locking is not permitted, then the
		      vnode  will  be returned with LK_EXCLUSIVE.  VOP_UNLOCK(9)
		      should be used to release the lock (or  vput(9)  which  is
		      equivalent  to calling VOP_UNLOCK(9) followed by vrele(9),
		      all in one).

     NOFOLLOW	      Do not follow symbolic links (pseudo).  This flag  is  not
		      looked  for  by  the  actual code, which looks for FOLLOW.
		      NOFOLLOW is used to indicate to  the  source  code  reader
		      that symlinks are intentionally not followed.

     RBENEATH	      Requires	that  namei  did  not cross the dirfd directory.
		      The flag is used to implement O_RESOLVE_BENEATH  flag  for
		      openat(2).

     NAMEILOOKUP      The component is embedded in a namei lookup structure, and
		      the  vfs_lookup_nameidata() function can be used to obtain
		      that structure.  This can be useful in  VOP_LOOKUP(9)  im-
		      plementations which need to obtain extra lookup metadata.

PARAMETERS DESCRIPTORS FLAGS
     These flags are used for several purposes.  Some of them affects the global
     namei  operation,	some  provide information for processing of the specific
     path element, for instance, by the VOP_LOOKUP  implementation  of	the  in-
     volved filesystem.

     RDONLY	     Specifies	that  the lookup should act as if the final node
		     is located on read-only mount.  The flag is typically  used
		     by file servers, e.g. NFS, to handle read-only exports.

     ISRESTARTED     The namei was restarted with NDRESTART().	This is used in-
		     ternally  for  double-root  lookups used by ABI subsystems,
		     after the lookup with native root failed.	 The  components
		     are  reset  to  the original values, and lookup is repeated
		     with different root, once.

     IGNOREWHITEOUT  Ignore whiteouts, e.g. when  checking  if	a  directory  is
		     empty.

     ISWHITEOUT      The result of lookup is whiteout.

     DOWHITEOUT      Handle  whiteouts,  the  instruction  for	the VOP_LOOKUP()
		     filesystem methods.

     WILLBEDIR	     The lookup is done for creating a new entry  that	will  be
		     directory.   It  allows  the  trailing  slash  in	the path
		     string.

     ISOPEN	     The caller is the code that opens a file.	This  allows  to
		     weaken  the  lock	mode  of  the return vnode, if the mount
		     point indicates extended shared lock support.

     NOCROSSMOUNT    Do not cross mount points during lookup.

		     For ".." lookup leading to mount root, returns the root vn-
		     ode of the mount  instead	of  the  covered  vnode  of  the
		     filesystem where the mount was placed.

		     For  other lookups passing over mount, do not jump into the
		     mounted filesystem.  This allows to descend into  the  file
		     hierarchy otherwise shadowed by the mount point.

     NOMACCHECK      Do not perform MAC checks during lookup.

     AUDITVNODE1     Audit  the  looked up vnode information, use the first slot
		     for audit information.

     AUDITVNODE2     Same as AUDITVNODE1 but use the second slot.

     NOCAPCHECK      Do not perform capability checks.	If the	calling  process
		     is in capability mode, lookup is denied outright.

     OPENREAD	     The lookup was for open and file will be opened for read.

     OPENWRITE	     The lookup was for open and file will be opened for write.

     WANTIOCTLCAPS   Leave  ioctl  caps  for the caller.  See the description of
		     namei results.

     OPENNAMED	     Opening a named attribute (directory).

     NOEXECCHECK     Do not perform check for allowed execution on the	starting
		     directory.   It is used to implement the POSIX-required se-
		     mantic for openat(2) lookups that must use the  permissions
		     from  time  the directory was opened, and not when used for
		     lookup.

     MAKEENTRY	     Looked-up entry is to be added to name cache.

     ISSYMLINK	     Current component is symlink, and it needs the  interpreta-
		     tion according to the FOLLOW or NOFOLLOW flags.

     ISLASTCN	     This  is  last  component	of pathname.  It is handled spe-
		     cially, many flags augment its processing.

     ISDOTDOT	     Current component name is "..".  Usually implies a need  to
		     specially handle the vnode locking for instantiation of the
		     target  vnode.   The generic vn_vget_ino_gen() function and
		     its more specialized variant vn_vget_ino() might be useful.

     TRAILINGSLASH   Path ended in a slash.

     CREATENAMED     Create a named attribute dir.

ALLOCATED ELEMENTS
     The nameidata structure is composed of the following fields:

     ni_startdir      In the normal case, this is either the  current  directory
		      or  the  root.   It  is  the current directory if the name
		      passed in does not start with `/' and  we  have  not  gone
		      through  any  symlinks with an absolute path, and the root
		      otherwise.

		      In this case, it is only used by vfs_lookup(), and  should
		      not be considered valid after a call to namei().

     ni_dvp	      Vnode  pointer  to directory of the object on which lookup
		      is performed.  This is available on successful  return  if
		      LOCKPARENT   or  WANTPARENT  is  set.   It  is  locked  if
		      LOCKPARENT is set.

     ni_vp	      Vnode pointer to the  resulting  object,	NULL  otherwise.
		      The  v_usecount  field  of  this vnode is incremented.  If
		      LOCKLEAF is set, it is also locked.

     ni_cnd.cn_pnbuf  The pathname buffer contains the location of the	file  or
		      directory  that  will be used by the namei operations.  It
		      is managed by the uma(9) zone allocation interface.

RESULTS
     The struct namei member ni_resflags returns the following flags giving some
     details of the succesfull operation:

     NIRES_ABS	      The path passed was absolute.

     NIRES_STRICTREL  Restricted lookup result.  Only relative lookups were done
		      to resolve the path to vnode.

     NIRES_EMPTYPATH  The EMPTYPATH flag was provided and used.  In  particular,
		      the passed path was empty.

     If  the  WANTIOCTLCAPS flag was specified, on return the ni_filecaps member
     of the struct namei contains the capabilities of the file	descriptor  used
     as the lookup starting point (dirfd).

RETURN VALUES
     If successful, namei() will return 0, otherwise it will return an error.

FILES
     src/sys/kern/vfs_lookup.c

EXAMPLES
     Assuming the path variable contains a pointer to userspace path string, the
     following	example looks up the file named by it, and performs required er-
     ror and resource handling:

	     char *path;
	     struct nameidata nd;
	     int error;

	     NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE,
		 path);
	     if ((error = namei(&nd)) != 0)
		     return (error);
	     NDFREE_PNBUF(&nd);
	     ... use nd.ni_vp vnode

ERRORS
     Errors which namei() may return:

     [ENOTDIR]		A component of the specified pathname is not a directory
			when a directory is expected.

     [ENAMETOOLONG]	A component of a pathname exceeded 255 characters, or an
			entire pathname exceeded 1023 characters.

     [ENOENT]		A component of the specified pathname does not exist, or
			the pathname is an empty string.

     [EACCES]		An attempt is made to access a file in a  way  forbidden
			by its file access permissions.

     [ELOOP]		Too  many symbolic links were encountered in translating
			the pathname.

     [EISDIR]		An attempt is made to open a directory with  write  mode
			specified.

     [EINVAL]		The  last  component  of  the  pathname  specified for a
			DELETE or RENAME operation is `.'.

     [EROFS]		An attempt is made to modify a file or	directory  on  a
			read-only file system.

SEE ALSO
     uio(9), uma(9), VFS(9), vnode(9), vput(9), vref(9), vrele(9)

AUTHORS
     This  manual  page  was  written  by Eivind Eklund <eivind@FreeBSD.org> and
     later significantly revised by Hiten M. Pandya <hmp@FreeBSD.org>.

BUGS
     The LOCKPARENT flag does not  always  result  in  the  parent  vnode  being
     locked.  This results in complications when the LOCKPARENT is used.  In or-
     der  to  solve  this  for	the cases where both LOCKPARENT and LOCKLEAF are
     used, it is necessary to resort to recursive locking.

FreeBSD ports 15.quarterly     September 30, 2025			NAMEI(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=namei&sektion=9&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help