summaryrefslogtreecommitdiff
path: root/static/netbsd/man9/namecache.9
diff options
context:
space:
mode:
Diffstat (limited to 'static/netbsd/man9/namecache.9')
-rw-r--r--static/netbsd/man9/namecache.9262
1 files changed, 262 insertions, 0 deletions
diff --git a/static/netbsd/man9/namecache.9 b/static/netbsd/man9/namecache.9
new file mode 100644
index 00000000..7abed5aa
--- /dev/null
+++ b/static/netbsd/man9/namecache.9
@@ -0,0 +1,262 @@
+.\" $NetBSD: namecache.9,v 1.21 2017/04/19 11:33:01 abhinav Exp $
+.\"
+.\" Copyright (c) 2001 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Gregory McGarry.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd February 7, 2014
+.Dt NAMECACHE 9
+.Os
+.Sh NAME
+.Nm namecache ,
+.Nm cache_lookup ,
+.Nm cache_revlookup ,
+.Nm cache_enter ,
+.Nm cache_purge ,
+.Nm cache_purgevfs ,
+.Nm namecache_print
+.Nd name lookup cache
+.Sh SYNOPSIS
+.In sys/namei.h
+.In sys/proc.h
+.In sys/uio.h
+.In sys/vnode.h
+.Ft int
+.Fn cache_lookup "struct vnode *dvp" "const char *name" "size_t namelen" \
+"uint32_t nameiop" "uint32_t nameiflags" "int *iswhiteout" "struct vnode **vpp"
+.Ft int
+.Fn cache_revlookup "struct vnode *vp" "struct vnode *dvp" \
+"char **bpp" "char *bufp"
+.Ft void
+.Fn cache_enter "struct vnode *dvp" "struct vnode *vp" \
+"const char *name" "size_t namelen" "uint32_t nameiflags"
+.Ft void
+.Fn cache_purge "struct vnode *vp"
+.Ft void
+.Fn cache_purgevfs "struct mount *mp"
+.Ft void
+.Fn namecache_print "struct vnode *vp" "void (*func)(const char *, ...)"
+.Sh DESCRIPTION
+The name lookup cache is the mechanism to allow the file system type
+dependent algorithms to quickly resolve a file's vnode from its
+pathname.
+The name lookup cache is generally accessed through the higher-level
+.Xr namei 9
+interface.
+.Pp
+The name of the file is used to look up an entry associated with the
+file in the name lookup cache.
+If no entry is found, one is created for it.
+If an entry is found, the information obtained from the cache lookup
+contains information about the file which is useful to the file system
+type dependent functions.
+.Pp
+The name lookup cache is managed by a least recently used (LRU)
+algorithm so frequently used names will hang around.
+The cache itself is a hash table called
+.Va nchashtbl ,
+containing
+.Em namecache
+entries that are allocated dynamically from a kernel memory pool.
+Each entry has the following structure:
+.Bd -literal
+#define NCHNAMLEN 31 /* maximum name segment length */
+struct namecache {
+ LIST_ENTRY(namecache) nc_hash; /* hash chain */
+ TAILQ_ENTRY(namecache) nc_lru; /* LRU chain */
+ LIST_ENTRY(namecache) nc_vhash; /* directory hash chain */
+ LIST_ENTRY(namecache) nc_dvlist;
+ struct vnode *nc_dvp; /* vnode of parent of name */
+ LIST_ENTRY(namecache) nc_vlist;
+ struct vnode *nc_vp; /* vnode the name refers to */
+ int nc_flags; /* copy of componentname's ISWHITEOUT */
+ char nc_nlen; /* length of name */
+ char nc_name[NCHNAMLEN]; /* segment name */
+};
+.Ed
+.Pp
+For simplicity (and economy of storage), names longer than a maximum
+length of NCHNAMLEN are not cached; they occur infrequently in any
+case, and are almost never of interest.
+.Pp
+Each
+.Em namecache
+entry can appear on two hash chains in addition to
+.Va nchashtbl :
+.Em ncvhashtbl
+(the name cache directory hash chain), and
+.Em nclruhead
+(the name cache LRU chain).
+The hash chains are indexed by a hash value obtained from the file's
+name and the address of its parent directory vnode.
+.Pp
+Functions which access to the name cache pass arguments in the
+partially initialised
+.Em componentname
+structure.
+See
+.Xr vnodeops 9
+for details on this structure.
+.Sh FUNCTIONS
+.Bl -tag -width abcd
+.It Fn cache_lookup "dvp" "name" "namelen" "nameiop" "nameiflags" \
+"iswhiteout" "vpp"
+Look for a name in the cache.
+.Fn cache_lookup
+is called with
+.Fa dvp
+pointing to the vnode of the directory to search.
+The
+.Fa name
+and
+.Fa namelen
+arguments specify the name to look for.
+The
+.Fa nameiop
+and
+.Fa nameiflags
+should be taken from the
+.Fa cn_nameiop
+and
+.Fa cn_flags
+fields of struct componentname.
+.Pp
+The lookup can produce either a cache miss or a cache hit, and a cache
+hit can either be a positive hit, where the name looked up refers to
+some existing object, or a negative hit, where the name looked up is
+known to refer to
+.Em no
+existing object.
+(The lookup cannot fail, in the sense of generating an error condition
+that requires aborting the operation in progress.)
+.Pp
+On a cache miss,
+.Fn cache_lookup
+returns zero
+.Pq false .
+On a positive hit, the unlocked vnode for the object found is stored in
+.Fa vpp ,
+and a nonzero
+.Pq true
+value is returned.
+On a negative hit,
+.Fa vpp
+is set to contain a null pointer and a nonzero value is returned.
+Usually a negative hit will prompt the caller to fail with
+.Er ENOENT .
+.Pp
+The
+.Fa iswhiteout
+argument is a pointer to an integer result that will be set to nonzero if
+the entry represents a whiteout, and zero if it does not.
+This pointer may be
+.Dv NULL
+if the caller does not support whiteouts.
+According to the current scheme for handling whiteouts, if
+.Fn cache_lookup
+sets
+.Fa iswhiteout
+the caller should add
+.Dv ISWHITEOUT
+to the
+.Fa cn_flags
+field of its struct componentname.
+.It Fn cache_revlookup "vp" "dvp" "bpp" "bufp"
+Scan cache looking for name of directory entry pointing at
+.Fa vp
+and fill in
+.Fa dvpp .
+If
+.Fa bufp
+is
+.Pf non- Dv NULL ,
+also place the name in the buffer which starts at
+.Fa bufp ,
+immediately before
+.Fa bpp ,
+and move bpp backwards to point at the start of it.
+If the lookup succeeds, the vnode is referenced.
+Returns 0 on success, -1 on cache miss, positive errno on failure.
+.It Fn cache_enter "dvp" "vp" "name" "namelen" "nameiflags"
+Add an entry to the cache.
+The
+.Fa name
+and
+.Fa namelen
+arguments specify the name to add to the cache.
+The
+.Fa dvp
+argument specifies the directory the name appears in.
+The
+.Fa vp
+argument specifies the object to enter in the cache.
+The
+.Fa nameiflags
+argument should come from the
+.Fa cn_flags
+member of struct componentname.
+.Pp
+If
+.Fa vp
+is
+.Dv NULL ,
+a negative cache entry is created, specifying that the entry
+does not exist in the file system.
+.It Fn cache_purge "vp"
+Flush the cache of a particular vnode
+.Fa vp .
+.Fn cache_purge
+is called when a vnode is renamed to hide entries that would now be
+invalid.
+.It Fn cache_purgevfs "mp"
+Flush cache of a whole file system
+.Fa mp .
+.Fn cache_purgevfs
+is called when file system is unmounted to remove entries that would
+now be invalid.
+.It Fn namecache_print "vp" "func"
+Print all entries of the name cache.
+.Fa func
+is the
+.Xr printf 9
+format.
+.Fn namecache_print
+is only defined if the kernel option DDB is compiled into the kernel.
+.El
+.Sh CODE REFERENCES
+The name lookup cache is implemented within the file
+.Pa sys/kern/vfs_cache.c .
+.Sh SEE ALSO
+.Xr intro 9 ,
+.Xr namei 9 ,
+.Xr vfs 9 ,
+.Xr vnode 9
+.Sh HISTORY
+The name lookup cache first appeared in
+.Bx 4.2 .
+.Sh AUTHORS
+The original name lookup cache was written by
+.An Robert Elz .