From owner-freebsd-fs Fri Apr 25 09:55:31 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.5/8.8.5) id JAA26833 for fs-outgoing; Fri, 25 Apr 1997 09:55:31 -0700 (PDT) Received: from critter.dk.tfs.com ([140.145.230.252]) by hub.freebsd.org (8.8.5/8.8.5) with ESMTP id JAA26828 for ; Fri, 25 Apr 1997 09:55:28 -0700 (PDT) Received: from critter (localhost [127.0.0.1]) by critter.dk.tfs.com (8.8.5/8.8.5) with ESMTP id SAA00254 for ; Fri, 25 Apr 1997 18:54:01 +0200 (CEST) To: fs@freebsd.org Subject: oops... From: Poul-Henning Kamp Date: Fri, 25 Apr 1997 18:54:00 +0200 Message-ID: <252.861987240@critter> Sender: owner-fs@freebsd.org X-Loop: FreeBSD.org Precedence: bulk I just found a .rej file :-( Here is the patch again, this time with all the bits. Sorry! Poul-Henning Index: kern/vfs_cache.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_cache.c,v retrieving revision 1.24 diff -u -r1.24 vfs_cache.c --- vfs_cache.c 1997/03/08 15:22:14 1.24 +++ vfs_cache.c 1997/04/25 16:44:16 @@ -78,7 +78,13 @@ (&nchashtbl[((dvp)->v_id + (cnp)->cn_hash) % nchash]) static LIST_HEAD(nchashhead, namecache) *nchashtbl; /* Hash Table */ static u_long nchash; /* size of hash table */ + static u_long numcache; /* number of cache entries allocated */ +SYSCTL_INT(_debug, OID_AUTO, vfscachesize, CTLFLAG_RD, &numcache, 0, ""); + +static u_long cachelimit; +SYSCTL_INT(_debug, OID_AUTO, vfscachelimit, CTLFLAG_RW, &cachelimit, 0, ""); + static TAILQ_HEAD(, namecache) nclruhead; /* LRU chain */ struct nchstats nchstats; /* cache effectiveness statistics */ @@ -151,6 +157,18 @@ return (0); } + if (cnp->cn_namelen == 2 && + cnp->cn_nameptr[0] == '.' && cnp->cn_nameptr[1] == '.') { + if (dvp->v_dd->v_id != dvp->v_ddid) + return (0); + if ((cnp->cn_flags & MAKEENTRY) == 0) { + dvp->v_dd = dvp; + return (0); + } + *vpp = dvp->v_dd; + return (-1); + } + ncpp = NCHHASH(dvp, cnp); for (ncp = ncpp->lh_first; ncp != 0; ncp = nnp) { nnp = ncp->nc_hash.le_next; @@ -230,12 +248,21 @@ return; } + if (cnp->cn_namelen == 2 && + cnp->cn_nameptr[0] == '.' && cnp->cn_nameptr[1] == '.') { + if (!vp) + return; + dvp->v_dd = vp; + dvp->v_ddid = vp->v_id; + return; + } + /* * We allocate a new entry if we are less than the maximum * allowed and the one at the front of the LRU list is in use. * Otherwise we use the one at the front of the LRU list. */ - if (numcache < desiredvnodes && + if (numcache < (cachelimit ? cachelimit : desiredvnodes) && ((ncp = nclruhead.tqh_first) == NULL || ncp->nc_hash.le_prev != 0)) { /* Add one more entry */ @@ -304,6 +331,7 @@ struct nchashhead *ncpp; static u_long nextvnodeid; + vp->v_ddid = 0; vp->v_id = ++nextvnodeid; if (nextvnodeid != 0) return; Index: kern/vfs_subr.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_subr.c,v retrieving revision 1.82 diff -u -r1.82 vfs_subr.c --- vfs_subr.c 1997/04/04 17:46:16 1.82 +++ vfs_subr.c 1997/04/25 16:04:31 @@ -361,6 +361,7 @@ vp = (struct vnode *) malloc((u_long) sizeof *vp, M_VNODE, M_WAITOK); bzero((char *) vp, sizeof *vp); + vp->v_dd = vp; /* Always point to some vnode */ numvnodes++; } else { for (vp = vnode_free_list.tqh_first; Index: sys/vnode.h =================================================================== RCS file: /home/ncvs/src/sys/sys/vnode.h,v retrieving revision 1.43 diff -u -r1.43 vnode.h --- vnode.h 1997/04/04 17:43:32 1.43 +++ vnode.h 1997/04/25 15:55:55 @@ -110,6 +110,8 @@ struct lock *v_vnlock; /* used for non-locking fs's */ enum vtagtype v_tag; /* type of underlying data */ void *v_data; /* private data for fs */ + struct vnode *v_dd; /* ".." vnode */ + u_long v_ddid; /* ".." vnode.v_id */ }; #define v_mountedhere v_un.vu_mountedhere #define v_socket v_un.vu_socket -- Poul-Henning Kamp | phk@FreeBSD.ORG FreeBSD Core-team. http://www.freebsd.org/~phk | phk@login.dknet.dk Private mailbox. whois: [PHK] | phk@tfs.com TRW Financial Systems, Inc. Future will arrive by its own means, progress not so.