On Fri, Jun 01 2018, Klemens Nanni <[email protected]> wrote:
> On Sun, May 27, 2018 at 04:37:52PM +0200, Klemens Nanni wrote:
>> Spotted and reported on IRC by Georg Bege <[email protected]>,
>> vfs_cache(9) lacks way behind beck's "Namecache revamp" from 2009.
>>
>> This diff syncs the manual with sys/sys/namei.h and sys/kern/vfs_cache.c:
>> I went through it and checked the APIs, this seems fine to me for now
>> but since I'm not all too familiar with VFS yet, feedback is welcome.
>>
>> Maybe we want to sync descriptions in the manual a bit more with code
>> comments to reduce differences in two places describing the same thing?
> I have OKs from visa and jmc for the initial diff already; here's an
> updated one that syncs other manuals as well.
>
> Syncing descriptions and comments turned out to be much more churn than
> useful changes. One thing I stripped though is the note about too long
> names in vfs_lookup()'s comment; that bit is already mentioned around
> NAMECACHE_MAXLEN's definition.
>
> For struct vnode, I copied it as is to avoid picking around whitespace
> changes so we end up with the exact same struct in both places.
>
> There might be more.
>
> Feedback? OK?
I'm not sure I see the point of shortening the comment but no objection
either. ok jca@
>
> Index: sys/kern/vfs_cache.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/vfs_cache.c,v
> retrieving revision 1.56
> diff -u -p -r1.56 vfs_cache.c
> --- sys/kern/vfs_cache.c 27 May 2018 06:02:14 -0000 1.56
> +++ sys/kern/vfs_cache.c 1 Jun 2018 11:32:32 -0000
> @@ -128,9 +128,7 @@ cache_zap(struct namecache *ncp)
> }
>
> /*
> - * Look for a name in the cache. We don't do this if the segment name is
> - * long, simply so the cache can avoid holding long names (which would
> - * either waste space, or add greatly to the complexity).
> + * Look for a name in the cache.
> * dvp points to the directory to search. The componentname cnp holds
> * the information on the entry being sought, such as its length
> * and its name. If the lookup succeeds, vpp is set to point to the vnode
> Index: share/man/man9/VOP_LOOKUP.9
> ===================================================================
> RCS file: /cvs/src/share/man/man9/VOP_LOOKUP.9,v
> retrieving revision 1.41
> diff -u -p -r1.41 VOP_LOOKUP.9
> --- share/man/man9/VOP_LOOKUP.9 28 Apr 2018 03:13:04 -0000 1.41
> +++ share/man/man9/VOP_LOOKUP.9 1 Jun 2018 12:04:24 -0000
> @@ -327,7 +327,7 @@ struct vattr {
> uid_t va_uid; /* owner user id */
> gid_t va_gid; /* owner group id */
> long va_fsid; /* file system id */
> - long va_fileid; /* file id */
> + u_quad_t va_fileid; /* file id */
> u_quad_t va_size; /* file size in bytes */
> long va_blocksize; /* blocksize preferred for i/o */
> struct timespec va_atime; /* time of last access */
> Index: share/man/man9/vfs_cache.9
> ===================================================================
> RCS file: /cvs/src/share/man/man9/vfs_cache.9,v
> retrieving revision 1.3
> diff -u -p -r1.3 vfs_cache.9
> --- share/man/man9/vfs_cache.9 31 May 2007 19:20:01 -0000 1.3
> +++ share/man/man9/vfs_cache.9 1 Jun 2018 11:32:31 -0000
> @@ -37,15 +37,16 @@ recently looked-up file name translation
> Entries in this cache have the following definition:
> .Bd -literal
> struct namecache {
> - LIST_ENTRY(namecache) nc_hash; /* hash chain */
> - LIST_ENTRY(namecache) nc_vhash; /* (reverse) dir hash chain */
> - TAILQ_ENTRY(namecache) nc_lru; /* LRU chain */
> + 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[NCHNAMLEN]; /* segment name */
> + char nc_name[NAMECACHE_MAXLEN]; /* segment name */
> };
> .Ed
> .Pp
> @@ -55,7 +56,7 @@ Negative caching is also performed so th
> names of files that do not exist do not result in expensive lookups.
> .Pp
> File names with length longer than
> -.Dv NCHNAMLEN
> +.Dv NAMECACHE_MAXLEN
> are not cached to simplify lookups and to save space.
> Such names are rare and are generally not worth caching.
> .Pp
> @@ -169,7 +170,8 @@ API is implemented in the file
> .Xr vmstat 8 ,
> .Xr namei 9 ,
> .Xr vfs 9 ,
> -.Xr vnode 9
> +.Xr vnode 9 ,
> +.Xr VOP_LOOKUP 9
> .Sh HISTORY
> The
> .Nm
> Index: share/man/man9/vnode.9
> ===================================================================
> RCS file: /cvs/src/share/man/man9/vnode.9,v
> retrieving revision 1.28
> diff -u -p -r1.28 vnode.9
> --- share/man/man9/vnode.9 18 Jul 2011 12:03:45 -0000 1.28
> +++ share/man/man9/vnode.9 1 Jun 2018 12:15:40 -0000
> @@ -66,41 +66,45 @@ provided by the VFS to create and manage
> The definition of a vnode is as follows:
> .Bd -literal
> struct vnode {
> - struct uvm_vnode v_uvm; /* uvm(9) data */
> - int (**v_op)(void *); /* vnode operations vector */
> - enum vtype v_type; /* vnode type */
> - u_int v_flag; /* vnode flags (see below) */
> - u_int v_usecount; /* reference count of users */
> - u_int v_writecount; /* reference count of writers */
> + struct uvm_vnode *v_uvm; /* uvm data */
> + struct vops *v_op; /* vnode operations vector */
> + enum vtype v_type; /* vnode type */
> + enum vtagtype v_tag; /* type of underlying data */
> + u_int v_flag; /* vnode flags (see below) */
> + u_int v_usecount; /* reference count of users */
> + /* reference count of writers */
> + u_int v_writecount;
> /* Flags that can be read/written in interrupts */
> - u_int v_bioflag; /* flags used by intr handlers */
> - u_int v_holdcnt; /* buffer references */
> - u_int v_id; /* capability identifier */
> - struct mount *v_mount; /* ptr to vfs we are in */
> - TAILQ_ENTRY(vnode) v_freelist; /* vnode freelist */
> - LIST_ENTRY(vnode) v_mntvnodes; /* vnodes for mount point */
> - struct buflists v_cleanblkhd; /* clean blocklist head */
> - struct buflists v_dirtyblkhd; /* dirty blocklist head */
> - u_int v_numoutput; /* num of writes in progress */
> - LIST_ENTRY(vnode) v_synclist; /* vnode with dirty buffers */
> + u_int v_bioflag;
> + u_int v_holdcnt; /* buffer references */
> + u_int v_id; /* capability identifier */
> + u_int v_inflight;
> + struct mount *v_mount; /* ptr to vfs we are in */
> + TAILQ_ENTRY(vnode) v_freelist; /* vnode freelist */
> + LIST_ENTRY(vnode) v_mntvnodes; /* vnodes for mount point */
> + struct buf_rb_bufs v_bufs_tree; /* lookup of all bufs */
> + struct buflists v_cleanblkhd; /* clean blocklist head */
> + struct buflists v_dirtyblkhd; /* dirty blocklist head */
> + u_int v_numoutput; /* num of writes in progress */
> + LIST_ENTRY(vnode) v_synclist; /* vnode with dirty buffers */
> union {
> - struct mount *vu_mountedhere;/* ptr to mounted vfs (VDIR) */
> - struct socket *vu_socket; /* UNIX IPC (VSOCK) */
> - struct specinfo *vu_specinfo; /* device (VCHR, VBLK) */
> - struct fifoinfo *vu_fifoinfo; /* fifo (VFIFO) */
> + struct mount *vu_mountedhere;/* ptr to mounted vfs (VDIR) */
> + struct socket *vu_socket; /* unix ipc (VSOCK) */
> + struct specinfo *vu_specinfo; /* device (VCHR, VBLK) */
> + struct fifoinfo *vu_fifoinfo; /* fifo (VFIFO) */
> } v_un;
>
> - enum vtagtype v_tag; /* type of underlying data */
> - void *v_data; /* private data for fs */
> - struct {
> - struct simplelock vsi_lock; /* lock to protect below */
> - struct selinfo vsi_selinfo; /* identity of poller(s) */
> - } v_selectinfo;
> + /* VFS namecache */
> + struct namecache_rb_cache v_nc_tree;
> + TAILQ_HEAD(, namecache) v_cache_dst; /* cache entries to us */
> +
> + void *v_data; /* private data for fs */
> + struct selinfo v_selectinfo; /* identity of poller(s) */
> };
> -#define v_mountedhere v_un.vu_mountedhere
> -#define v_socket v_un.vu_socket
> -#define v_specinfo v_un.vu_specinfo
> -#define v_fifoinfo v_un.vu_fifoinfo
> +#define v_mountedhere v_un.vu_mountedhere
> +#define v_socket v_un.vu_socket
> +#define v_specinfo v_un.vu_specinfo
> +#define v_fifoinfo v_un.vu_fifoinfo
> .Ed
> .Ss Vnode life cycle
> When a client of the VFS requests a new vnode, the vnode allocation
>
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE