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	refer-
       ence 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	opera-
	       tions  are valid: LOOKUP, CREATE, DELETE, and RENAME.  The lat-
	       ter three are  just  setup  for	those  effects;	 just  calling
	       namei() will not	result 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  ob-
	       ject  is	 in userspace (UIO_USERSPACE) or in the	kernel address
	       space (UIO_SYSSPACE).

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

       The NDINIT_AT() macro is	similar	to NDINIT(), but takes one extra argu-
       ment:

       dirfd   File  descriptor	 referencing a directory, or the special value
	       AT_FDCWD	meaning	the calling thread's  current  working	direc-
	       tory.  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
       following 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
       influence 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
			entries	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_UNLOCK(9)	followed  by  vrele(9),	all in
			one).

       LOCKPARENT	This flag lets the namei() function return the	parent
			(directory)  vnode,  ni_dvp in locked state, unless it
			is identical to	ni_vp, in which	 case  ni_dvp  is  not
			locked per se (but may be locked due to	LOCKLEAF).  If
			a  lock	 is  enforced,	it  should  be	released using
			vput(9)	or VOP_UNLOCK(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
			descriptor may reference a file	of arbitrary type, not
			necessary  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	explicitly    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  fol-
			lowed.

       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) implementations which need to obtain ex-
			tra 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 involved filesystem.

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

       ISRESTARTED     The namei was restarted with NDRESTART().  This is used
		       internally  for double-root lookups used	by ABI subsys-
		       tems, 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
		       vnode 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  out-
		       right.

       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	 semantic  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	inter-
		       pretation 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	direc-
			tory  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	opera-
			tions.	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 particu-
			lar, the passed	path was empty.

       If the WANTIOCTLCAPS flag was specified,	on return the ni_filecaps mem-
       ber  of the struct namei	contains the capabilities of the file descrip-
       tor used	as the lookup starting point (dirfd).

RETURN VALUES
       If successful, namei() will return 0, otherwise it will return  an  er-
       ror.

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 re-
       quired error 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  di-
			  rectory 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  ex-
			  ist, or the pathname is an empty string.

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

       [ELOOP]		  Too  many  symbolic links were encountered in	trans-
			  lating 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
       order  to  solve	 this for the cases where both LOCKPARENT and LOCKLEAF
       are used, it is necessary to resort to recursive	locking.

FreeBSD	15.0		      September	30, 2025		      NAMEI(9)

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

home | help