| VFS_CACHE(9) | Kernel Developer's Manual | VFS_CACHE(9) |
vfs_cache,
cache_enter, cache_lookup,
cache_purge, cache_purgevfs,
cache_revlookup — name
lookup cache
#include
<sys/vnode.h>
#include <sys/namei.h>
int
cache_lookup(struct
vnode *dvp, struct vnode
**vpp, struct
componentname *cnp);
void
cache_enter(struct
vnode *dvp, struct vnode
*vp, struct componentname
*cnp);
void
cache_purge(struct
vnode *vp);
void
cache_purgevfs(struct
mount *mp);
int
cache_revlookup(struct
vnode *vp, struct vnode
**dvpp, char **bpp,
char *bufp);
In order to speed up file name look-up operations (see VOP_LOOKUP(9)), the kernel provides an interface for maintaining a cache of the most recently looked-up file name translations. Entries in this cache have the following definition:
struct namecache {
TAILQ_ENTRY(namecache) nc_lru; /* Regular Entry LRU chain */
TAILQ_ENTRY(namecache) nc_neg; /* Negative Entry LRU chain */
RBT_ENTRY(namecache) n_rbcache; /* Namecache rb tree from vnode */
TAILQ_ENTRY(namecache) nc_me; /* ncp's referring to me */
struct vnode *nc_dvp; /* vnode of parent of name */
u_long nc_dvpid; /* capability number of nc_dvp */
struct vnode *nc_vp; /* vnode the name refers to */
u_long nc_vpid; /* capability number of nc_vp */
char nc_nlen; /* length of name */
char nc_name[NAMECACHE_MAXLEN]; /* segment name */
};
The cache is indexed by a hash value based on the file's base name and its encompassing directory's vnode generation number. Negative caching is also performed so that frequently accessed path names of files that do not exist do not result in expensive lookups.
File names with length longer than
NAMECACHE_MAXLEN are not cached to simplify lookups
and to save space. Such names are rare and are generally not worth
caching.
The vfs_cache API contains the following
routines:
cache_lookup(dvp,
vpp, cnp)DELETE or the NOCACHE flag
was set for the call to namei(9).
Upon success, a pointer to a locked vnode is stored in
vpp and a zero value is returned. If locking the
vnode fails, the vnode will remain unlocked, *vpp
will be set to NULL, and the corresponding error
will be returned. If the cache entry is negative cached, meaning the
name is no longer valid, ENOENT is returned.
Otherwise, the cache lookup has failed and a -1 value is returned.
cache_enter(dvp,
vp, cnp)cache_purge(vp)cache_purgevfs(mp)cache_revlookup(vp,
dvpp, bpp,
bufp)NULL, the name
will be written to the end of the space between this pointer and the value
in bpp, and bpp will be
updated on return to point to the start of the copied name.
On success, *dvpp will be set to point
to the encompassing directory and zero will be returned. If the cache
misses, dvpp will be set to
NULL and -1 will be returned. Otherwise, failure
has occurred, dvpp will be set to
NULL, and an appropriate error code will be
returned.
The vfs_cache API is implemented in the
file sys/kern/vfs_cache.c.
The vfs_cache API first appeared in
4.2BSD.
| June 4, 2018 | Debian |