summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1997-08-26 07:32:51 +0000
committerphk <phk@FreeBSD.org>1997-08-26 07:32:51 +0000
commitfddfc9d5bb4c35d88417fa80a062219876186593 (patch)
tree7f29931e5661e3731f6b972dc3a9508534617833 /sys
parentf320b3a30651cae7b34067561adb48f2b6f57621 (diff)
downloadFreeBSD-src-fddfc9d5bb4c35d88417fa80a062219876186593.zip
FreeBSD-src-fddfc9d5bb4c35d88417fa80a062219876186593.tar.gz
Uncut&paste cache_lookup().
This unifies several times in theory indentical 50 lines of code. The filesystems have a new method: vop_cachedlookup, which is the meat of the lookup, and use vfs_cache_lookup() for their vop_lookup method. vfs_cache_lookup() will check the namecache and pass on to the vop_cachedlookup method in case of a miss. It's still the task of the individual filesystems to populate the namecache with cache_enter(). Filesystems that do not use the namecache will just provide the vop_lookup method as usual.
Diffstat (limited to 'sys')
-rw-r--r--sys/fs/cd9660/cd9660_lookup.c56
-rw-r--r--sys/fs/cd9660/cd9660_node.h4
-rw-r--r--sys/fs/cd9660/cd9660_vnops.c5
-rw-r--r--sys/fs/msdosfs/denode.h4
-rw-r--r--sys/fs/msdosfs/msdosfs_lookup.c59
-rw-r--r--sys/fs/msdosfs/msdosfs_vnops.c5
-rw-r--r--sys/gnu/ext2fs/ext2_extern.h2
-rw-r--r--sys/gnu/ext2fs/ext2_lookup.c50
-rw-r--r--sys/gnu/ext2fs/ext2_vnops.c3
-rw-r--r--sys/gnu/fs/ext2fs/ext2_extern.h2
-rw-r--r--sys/gnu/fs/ext2fs/ext2_lookup.c50
-rw-r--r--sys/gnu/fs/ext2fs/ext2_vnops.c3
-rw-r--r--sys/isofs/cd9660/cd9660_lookup.c56
-rw-r--r--sys/isofs/cd9660/cd9660_node.h4
-rw-r--r--sys/isofs/cd9660/cd9660_vnops.c5
-rw-r--r--sys/kern/vfs_cache.c85
-rw-r--r--sys/msdosfs/denode.h4
-rw-r--r--sys/msdosfs/msdosfs_lookup.c59
-rw-r--r--sys/msdosfs/msdosfs_vnops.c5
-rw-r--r--sys/nfs/nfs_vnops.c58
-rw-r--r--sys/nfsclient/nfs_vnops.c58
-rw-r--r--sys/sys/vnode.h3
-rw-r--r--sys/ufs/ffs/ffs_vnops.c5
-rw-r--r--sys/ufs/ufs/ufs_extern.h4
-rw-r--r--sys/ufs/ufs/ufs_lookup.c55
25 files changed, 139 insertions, 505 deletions
diff --git a/sys/fs/cd9660/cd9660_lookup.c b/sys/fs/cd9660/cd9660_lookup.c
index 94fe78e..57393df 100644
--- a/sys/fs/cd9660/cd9660_lookup.c
+++ b/sys/fs/cd9660/cd9660_lookup.c
@@ -38,7 +38,7 @@
* from: @(#)ufs_lookup.c 7.33 (Berkeley) 5/19/91
*
* @(#)cd9660_lookup.c 8.2 (Berkeley) 1/23/94
- * $Id: cd9660_lookup.c,v 1.15 1997/03/08 16:09:38 bde Exp $
+ * $Id: cd9660_lookup.c,v 1.16 1997/08/02 14:31:18 bde Exp $
*/
#include <sys/param.h>
@@ -89,7 +89,7 @@
*/
int
cd9660_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnode *a_dvp;
struct vnode **a_vpp;
struct componentname *a_cnp;
@@ -146,59 +146,7 @@ cd9660_lookup(ap)
/*
* We now have a segment name to search for, and a directory to search.
- *
- * Before tediously performing a linear scan of the directory,
- * check the name cache to see if the directory/name pair
- * we are looking for is known already.
*/
- if ((error = cache_lookup(vdp, vpp, cnp))) {
- u_long vpid; /* capability number of vnode */
-
- if (error == ENOENT)
- return (error);
-#ifdef PARANOID
- if ((vdp->v_flag & VROOT) && (flags & ISDOTDOT))
- panic("cd9660_lookup: .. through root");
-#endif
- /*
- * Get the next vnode in the path.
- * See comment below starting `Step through' for
- * an explaination of the locking protocol.
- */
- pdp = vdp;
- dp = VTOI(*vpp);
- vdp = *vpp;
- vpid = vdp->v_id;
- if (pdp == vdp) {
- VREF(vdp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(pdp, 0, p);
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- } else {
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- /*
- * Check that the capability number did not change
- * while we were waiting for the lock.
- */
- if (!error) {
- if (vpid == vdp->v_id)
- return (0);
- vput(vdp);
- if (lockparent && pdp != vdp && (flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- if (error = vn_lock(pdp, LK_EXCLUSIVE, p))
- return (error);
- vdp = pdp;
- dp = VTOI(pdp);
- *vpp = NULL;
- }
len = cnp->cn_namelen;
name = cnp->cn_nameptr;
diff --git a/sys/fs/cd9660/cd9660_node.h b/sys/fs/cd9660/cd9660_node.h
index bd010f4..a1ab0b1 100644
--- a/sys/fs/cd9660/cd9660_node.h
+++ b/sys/fs/cd9660/cd9660_node.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_node.h 8.6 (Berkeley) 5/14/95
- * $Id: cd9660_node.h,v 1.10 1997/02/22 09:38:49 peter Exp $
+ * $Id: cd9660_node.h,v 1.11 1997/04/14 18:15:45 phk Exp $
*/
/*
@@ -95,7 +95,7 @@ struct iso_node {
/*
* Prototypes for ISOFS vnode operations
*/
-int cd9660_lookup __P((struct vop_lookup_args *));
+int cd9660_lookup __P((struct vop_cachedlookup_args *));
int cd9660_inactive __P((struct vop_inactive_args *));
int cd9660_reclaim __P((struct vop_reclaim_args *));
int cd9660_bmap __P((struct vop_bmap_args *));
diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c
index e6f7dee..6a14c87 100644
--- a/sys/fs/cd9660/cd9660_vnops.c
+++ b/sys/fs/cd9660/cd9660_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vnops.c 8.19 (Berkeley) 5/27/95
- * $Id: cd9660_vnops.c,v 1.35 1997/04/15 08:05:08 bde Exp $
+ * $Id: cd9660_vnops.c,v 1.36 1997/08/25 10:26:18 kato Exp $
*/
#include <sys/param.h>
@@ -1031,7 +1031,8 @@ vop_t **cd9660_vnodeop_p;
struct vnodeopv_entry_desc cd9660_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)cd9660_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup }, /* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)cd9660_lookup }, /* lookup */
{ &vop_create_desc, (vop_t *)cd9660_create }, /* create */
{ &vop_mknod_desc, (vop_t *)cd9660_mknod }, /* mknod */
{ &vop_open_desc, (vop_t *)cd9660_open }, /* open */
diff --git a/sys/fs/msdosfs/denode.h b/sys/fs/msdosfs/denode.h
index a03c802..335e4d0 100644
--- a/sys/fs/msdosfs/denode.h
+++ b/sys/fs/msdosfs/denode.h
@@ -1,4 +1,4 @@
-/* $Id: denode.h,v 1.11 1997/02/22 09:40:44 peter Exp $ */
+/* $Id: denode.h,v 1.12 1997/02/26 14:23:09 bde Exp $ */
/* $NetBSD: denode.h,v 1.8 1994/08/21 18:43:49 ws Exp $ */
/*-
@@ -226,7 +226,7 @@ struct defid {
extern vop_t **msdosfs_vnodeop_p;
-int msdosfs_lookup __P((struct vop_lookup_args *));
+int msdosfs_lookup __P((struct vop_cachedlookup_args *));
int msdosfs_inactive __P((struct vop_inactive_args *));
int msdosfs_reclaim __P((struct vop_reclaim_args *));
diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c
index 9bc576c..9e7b095 100644
--- a/sys/fs/msdosfs/msdosfs_lookup.c
+++ b/sys/fs/msdosfs/msdosfs_lookup.c
@@ -1,4 +1,4 @@
-/* $Id: msdosfs_lookup.c,v 1.10 1997/02/22 09:40:47 peter Exp $ */
+/* $Id: msdosfs_lookup.c,v 1.11 1997/02/26 14:23:13 bde Exp $ */
/* $NetBSD: msdosfs_lookup.c,v 1.14 1994/08/21 18:44:07 ws Exp $ */
/*-
@@ -82,7 +82,7 @@ static int markdeleted __P((struct msdosfsmount *pmp, u_long dirclust,
*/
int
msdosfs_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnode *a_dvp;
struct vnode **a_vpp;
struct componentname *a_cnp;
@@ -141,61 +141,6 @@ msdosfs_lookup(ap)
return ENOTDIR;
/*
- * See if the component of the pathname we are looking for is in
- * the directory cache. If so then do a few things and return.
- */
- error = cache_lookup(vdp, vpp, cnp);
- if (error) {
- int vpid;
-
- if (error == ENOENT)
- return error;
- pdp = vdp;
- vdp = *vpp;
- dp = VTODE(vdp);
- vpid = vdp->v_id;
- if (pdp == vdp) {
- VREF(vdp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(pdp, 0, p);
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- } else {
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
-
- if (!error) {
- if (vpid == vdp->v_id) {
-#ifdef MSDOSFS_DEBUG
- printf("msdosfs_lookup(): cache hit, vnode %08x, file %s\n",
- vdp, dp->de_Name);
-#endif
-#ifdef PC98
- /*
- * 1024 byte/sector support
- */
- if (pmp->pm_BytesPerSec == 1024)
- vdp->v_flag |= 0x10000;
-#endif
- return 0;
- }
- vput(vdp);
- if (lockparent && pdp != vdp && (flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- if (error)
- return error;
- vdp = pdp;
- dp = VTODE(vdp);
- *vpp = NULL;
- }
-
- /*
* If they are going after the . or .. entry in the root directory,
* they won't find it. DOS filesystems don't have them in the root
* directory. So, we fake it. deget() is in on this scam too.
diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c
index 76401b6..e1884c8 100644
--- a/sys/fs/msdosfs/msdosfs_vnops.c
+++ b/sys/fs/msdosfs/msdosfs_vnops.c
@@ -1,4 +1,4 @@
-/* $Id: msdosfs_vnops.c,v 1.41 1997/04/10 14:56:49 bde Exp $ */
+/* $Id: msdosfs_vnops.c,v 1.42 1997/05/17 18:32:40 phk Exp $ */
/* $NetBSD: msdosfs_vnops.c,v 1.20 1994/08/21 18:44:13 ws Exp $ */
/*-
@@ -1987,7 +1987,8 @@ msdosfs_pathconf(ap)
vop_t **msdosfs_vnodeop_p;
static struct vnodeopv_entry_desc msdosfs_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)msdosfs_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup }, /* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)msdosfs_lookup }, /* lookup */
{ &vop_create_desc, (vop_t *)msdosfs_create }, /* create */
{ &vop_mknod_desc, (vop_t *)msdosfs_mknod }, /* mknod */
{ &vop_open_desc, (vop_t *)msdosfs_open }, /* open */
diff --git a/sys/gnu/ext2fs/ext2_extern.h b/sys/gnu/ext2fs/ext2_extern.h
index f00cd1e..277106b 100644
--- a/sys/gnu/ext2fs/ext2_extern.h
+++ b/sys/gnu/ext2fs/ext2_extern.h
@@ -78,7 +78,7 @@ int ext2_truncate __P((struct vop_truncate_args *));
int ext2_update __P((struct vop_update_args *));
int ext2_valloc __P((struct vop_valloc_args *));
int ext2_vfree __P((struct vop_vfree_args *));
-int ext2_lookup __P((struct vop_lookup_args *));
+int ext2_lookup __P((struct vop_cachedlookup_args *));
int ext2_readdir __P((struct vop_readdir_args *));
void ext2_print_dinode __P((struct dinode *));
void ext2_print_inode __P((struct inode *));
diff --git a/sys/gnu/ext2fs/ext2_lookup.c b/sys/gnu/ext2fs/ext2_lookup.c
index 6d769f9..431a52b 100644
--- a/sys/gnu/ext2fs/ext2_lookup.c
+++ b/sys/gnu/ext2fs/ext2_lookup.c
@@ -268,7 +268,7 @@ printf("ext2_readdir called uio->uio_offset %d uio->uio_resid %d count %d \n",
*/
int
ext2_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnode *a_dvp;
struct vnode **a_vpp;
struct componentname *a_cnp;
@@ -321,55 +321,7 @@ ext2_lookup(ap)
/*
* We now have a segment name to search for, and a directory to search.
- *
- * Before tediously performing a linear scan of the directory,
- * check the name cache to see if the directory/name pair
- * we are looking for is known already.
*/
- if (error = cache_lookup(vdp, vpp, cnp)) {
- int vpid; /* capability number of vnode */
-
- if (error == ENOENT)
- return (error);
- /*
- * Get the next vnode in the path.
- * See comment below starting `Step through' for
- * an explaination of the locking protocol.
- */
- pdp = vdp;
- dp = VTOI(*vpp);
- vdp = *vpp;
- vpid = vdp->v_id;
- if (pdp == vdp) { /* lookup on "." */
- VREF(vdp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(pdp, 0, p);
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- } else {
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- /*
- * Check that the capability number did not change
- * while we were waiting for the lock.
- */
- if (!error) {
- if (vpid == vdp->v_id)
- return (0);
- vput(vdp);
- if (lockparent && pdp != vdp && (flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- if (error = vn_lock(pdp, LK_EXCLUSIVE, p))
- return (error);
- vdp = pdp;
- dp = VTOI(pdp);
- *vpp = NULL;
- }
/*
* Suppress search for slots unless creating
diff --git a/sys/gnu/ext2fs/ext2_vnops.c b/sys/gnu/ext2fs/ext2_vnops.c
index 1465efd..a5b6c56 100644
--- a/sys/gnu/ext2fs/ext2_vnops.c
+++ b/sys/gnu/ext2fs/ext2_vnops.c
@@ -84,7 +84,8 @@ static int ext2_write __P((struct vop_write_args *));
vop_t **ext2_vnodeop_p;
static struct vnodeopv_entry_desc ext2_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)ext2_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup }, /* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)ext2_lookup }, /* lookup */
{ &vop_create_desc, (vop_t *)ufs_create }, /* create */
{ &vop_mknod_desc, (vop_t *)ufs_mknod }, /* mknod */
{ &vop_open_desc, (vop_t *)ufs_open }, /* open */
diff --git a/sys/gnu/fs/ext2fs/ext2_extern.h b/sys/gnu/fs/ext2fs/ext2_extern.h
index f00cd1e..277106b 100644
--- a/sys/gnu/fs/ext2fs/ext2_extern.h
+++ b/sys/gnu/fs/ext2fs/ext2_extern.h
@@ -78,7 +78,7 @@ int ext2_truncate __P((struct vop_truncate_args *));
int ext2_update __P((struct vop_update_args *));
int ext2_valloc __P((struct vop_valloc_args *));
int ext2_vfree __P((struct vop_vfree_args *));
-int ext2_lookup __P((struct vop_lookup_args *));
+int ext2_lookup __P((struct vop_cachedlookup_args *));
int ext2_readdir __P((struct vop_readdir_args *));
void ext2_print_dinode __P((struct dinode *));
void ext2_print_inode __P((struct inode *));
diff --git a/sys/gnu/fs/ext2fs/ext2_lookup.c b/sys/gnu/fs/ext2fs/ext2_lookup.c
index 6d769f9..431a52b 100644
--- a/sys/gnu/fs/ext2fs/ext2_lookup.c
+++ b/sys/gnu/fs/ext2fs/ext2_lookup.c
@@ -268,7 +268,7 @@ printf("ext2_readdir called uio->uio_offset %d uio->uio_resid %d count %d \n",
*/
int
ext2_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnode *a_dvp;
struct vnode **a_vpp;
struct componentname *a_cnp;
@@ -321,55 +321,7 @@ ext2_lookup(ap)
/*
* We now have a segment name to search for, and a directory to search.
- *
- * Before tediously performing a linear scan of the directory,
- * check the name cache to see if the directory/name pair
- * we are looking for is known already.
*/
- if (error = cache_lookup(vdp, vpp, cnp)) {
- int vpid; /* capability number of vnode */
-
- if (error == ENOENT)
- return (error);
- /*
- * Get the next vnode in the path.
- * See comment below starting `Step through' for
- * an explaination of the locking protocol.
- */
- pdp = vdp;
- dp = VTOI(*vpp);
- vdp = *vpp;
- vpid = vdp->v_id;
- if (pdp == vdp) { /* lookup on "." */
- VREF(vdp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(pdp, 0, p);
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- } else {
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- /*
- * Check that the capability number did not change
- * while we were waiting for the lock.
- */
- if (!error) {
- if (vpid == vdp->v_id)
- return (0);
- vput(vdp);
- if (lockparent && pdp != vdp && (flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- if (error = vn_lock(pdp, LK_EXCLUSIVE, p))
- return (error);
- vdp = pdp;
- dp = VTOI(pdp);
- *vpp = NULL;
- }
/*
* Suppress search for slots unless creating
diff --git a/sys/gnu/fs/ext2fs/ext2_vnops.c b/sys/gnu/fs/ext2fs/ext2_vnops.c
index 1465efd..a5b6c56 100644
--- a/sys/gnu/fs/ext2fs/ext2_vnops.c
+++ b/sys/gnu/fs/ext2fs/ext2_vnops.c
@@ -84,7 +84,8 @@ static int ext2_write __P((struct vop_write_args *));
vop_t **ext2_vnodeop_p;
static struct vnodeopv_entry_desc ext2_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)ext2_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup }, /* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)ext2_lookup }, /* lookup */
{ &vop_create_desc, (vop_t *)ufs_create }, /* create */
{ &vop_mknod_desc, (vop_t *)ufs_mknod }, /* mknod */
{ &vop_open_desc, (vop_t *)ufs_open }, /* open */
diff --git a/sys/isofs/cd9660/cd9660_lookup.c b/sys/isofs/cd9660/cd9660_lookup.c
index 94fe78e..57393df 100644
--- a/sys/isofs/cd9660/cd9660_lookup.c
+++ b/sys/isofs/cd9660/cd9660_lookup.c
@@ -38,7 +38,7 @@
* from: @(#)ufs_lookup.c 7.33 (Berkeley) 5/19/91
*
* @(#)cd9660_lookup.c 8.2 (Berkeley) 1/23/94
- * $Id: cd9660_lookup.c,v 1.15 1997/03/08 16:09:38 bde Exp $
+ * $Id: cd9660_lookup.c,v 1.16 1997/08/02 14:31:18 bde Exp $
*/
#include <sys/param.h>
@@ -89,7 +89,7 @@
*/
int
cd9660_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnode *a_dvp;
struct vnode **a_vpp;
struct componentname *a_cnp;
@@ -146,59 +146,7 @@ cd9660_lookup(ap)
/*
* We now have a segment name to search for, and a directory to search.
- *
- * Before tediously performing a linear scan of the directory,
- * check the name cache to see if the directory/name pair
- * we are looking for is known already.
*/
- if ((error = cache_lookup(vdp, vpp, cnp))) {
- u_long vpid; /* capability number of vnode */
-
- if (error == ENOENT)
- return (error);
-#ifdef PARANOID
- if ((vdp->v_flag & VROOT) && (flags & ISDOTDOT))
- panic("cd9660_lookup: .. through root");
-#endif
- /*
- * Get the next vnode in the path.
- * See comment below starting `Step through' for
- * an explaination of the locking protocol.
- */
- pdp = vdp;
- dp = VTOI(*vpp);
- vdp = *vpp;
- vpid = vdp->v_id;
- if (pdp == vdp) {
- VREF(vdp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(pdp, 0, p);
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- } else {
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- /*
- * Check that the capability number did not change
- * while we were waiting for the lock.
- */
- if (!error) {
- if (vpid == vdp->v_id)
- return (0);
- vput(vdp);
- if (lockparent && pdp != vdp && (flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- if (error = vn_lock(pdp, LK_EXCLUSIVE, p))
- return (error);
- vdp = pdp;
- dp = VTOI(pdp);
- *vpp = NULL;
- }
len = cnp->cn_namelen;
name = cnp->cn_nameptr;
diff --git a/sys/isofs/cd9660/cd9660_node.h b/sys/isofs/cd9660/cd9660_node.h
index bd010f4..a1ab0b1 100644
--- a/sys/isofs/cd9660/cd9660_node.h
+++ b/sys/isofs/cd9660/cd9660_node.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_node.h 8.6 (Berkeley) 5/14/95
- * $Id: cd9660_node.h,v 1.10 1997/02/22 09:38:49 peter Exp $
+ * $Id: cd9660_node.h,v 1.11 1997/04/14 18:15:45 phk Exp $
*/
/*
@@ -95,7 +95,7 @@ struct iso_node {
/*
* Prototypes for ISOFS vnode operations
*/
-int cd9660_lookup __P((struct vop_lookup_args *));
+int cd9660_lookup __P((struct vop_cachedlookup_args *));
int cd9660_inactive __P((struct vop_inactive_args *));
int cd9660_reclaim __P((struct vop_reclaim_args *));
int cd9660_bmap __P((struct vop_bmap_args *));
diff --git a/sys/isofs/cd9660/cd9660_vnops.c b/sys/isofs/cd9660/cd9660_vnops.c
index e6f7dee..6a14c87 100644
--- a/sys/isofs/cd9660/cd9660_vnops.c
+++ b/sys/isofs/cd9660/cd9660_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vnops.c 8.19 (Berkeley) 5/27/95
- * $Id: cd9660_vnops.c,v 1.35 1997/04/15 08:05:08 bde Exp $
+ * $Id: cd9660_vnops.c,v 1.36 1997/08/25 10:26:18 kato Exp $
*/
#include <sys/param.h>
@@ -1031,7 +1031,8 @@ vop_t **cd9660_vnodeop_p;
struct vnodeopv_entry_desc cd9660_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)cd9660_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup }, /* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)cd9660_lookup }, /* lookup */
{ &vop_create_desc, (vop_t *)cd9660_create }, /* create */
{ &vop_mknod_desc, (vop_t *)cd9660_mknod }, /* mknod */
{ &vop_open_desc, (vop_t *)cd9660_open }, /* open */
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index 0e55914..a1f94f4 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_cache.c 8.5 (Berkeley) 3/22/95
- * $Id: vfs_cache.c,v 1.25 1997/05/04 09:17:28 phk Exp $
+ * $Id: vfs_cache.c,v 1.26 1997/08/04 07:31:36 phk Exp $
*/
#include <sys/param.h>
@@ -336,3 +336,86 @@ cache_purgevfs(mp)
}
}
}
+
+/*
+ * Perform canonical checks and cache lookup and pass on to filesystem
+ * through the vop_cachedlookup only if needed.
+ */
+
+int
+vfs_cache_lookup(ap)
+ struct vop_lookup_args /* {
+ struct vnode *a_dvp;
+ struct vnode **a_vpp;
+ struct componentname *a_cnp;
+ } */ *ap;
+{
+ struct vnode *vdp;
+ struct vnode *pdp;
+ int lockparent;
+ int error;
+ struct vnode **vpp = ap->a_vpp;
+ struct componentname *cnp = ap->a_cnp;
+ struct ucred *cred = cnp->cn_cred;
+ int flags = cnp->cn_flags;
+ struct proc *p = cnp->cn_proc;
+ u_long vpid; /* capability number of vnode */
+
+ *vpp = NULL;
+ vdp = ap->a_dvp;
+ lockparent = flags & LOCKPARENT;
+
+ if (vdp->v_type != VDIR)
+ return (ENOTDIR);
+
+ if ((flags & ISLASTCN) && (vdp->v_mount->mnt_flag & MNT_RDONLY) &&
+ (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME))
+ return (EROFS);
+
+ error = VOP_ACCESS(vdp, VEXEC, cred, cnp->cn_proc);
+
+ if (error)
+ return (error);
+
+ error = cache_lookup(vdp, vpp, cnp);
+
+ if (!error)
+ return (VCALL(vdp, VOFFSET(vop_cachedlookup),
+ (struct vop_cachedlookup_args *)ap));
+
+ if (error == ENOENT)
+ return (error);
+
+ pdp = vdp;
+ vdp = *vpp;
+ vpid = vdp->v_id;
+ if (pdp == vdp) { /* lookup on "." */
+ VREF(vdp);
+ error = 0;
+ } else if (flags & ISDOTDOT) {
+ VOP_UNLOCK(pdp, 0, p);
+ error = vget(vdp, LK_EXCLUSIVE, p);
+ if (!error && lockparent && (flags & ISLASTCN))
+ error = vn_lock(pdp, LK_EXCLUSIVE, p);
+ } else {
+ error = vget(vdp, LK_EXCLUSIVE, p);
+ if (!lockparent || error || !(flags & ISLASTCN))
+ VOP_UNLOCK(pdp, 0, p);
+ }
+ /*
+ * Check that the capability number did not change
+ * while we were waiting for the lock.
+ */
+ if (!error) {
+ if (vpid == vdp->v_id)
+ return (0);
+ vput(vdp);
+ if (lockparent && pdp != vdp && (flags & ISLASTCN))
+ VOP_UNLOCK(pdp, 0, p);
+ }
+ error = vn_lock(pdp, LK_EXCLUSIVE, p);
+ if (error)
+ return (error);
+ return (VCALL(vdp, VOFFSET(vop_cachedlookup),
+ (struct vop_cachedlookup_args *)ap));
+}
diff --git a/sys/msdosfs/denode.h b/sys/msdosfs/denode.h
index a03c802..335e4d0 100644
--- a/sys/msdosfs/denode.h
+++ b/sys/msdosfs/denode.h
@@ -1,4 +1,4 @@
-/* $Id: denode.h,v 1.11 1997/02/22 09:40:44 peter Exp $ */
+/* $Id: denode.h,v 1.12 1997/02/26 14:23:09 bde Exp $ */
/* $NetBSD: denode.h,v 1.8 1994/08/21 18:43:49 ws Exp $ */
/*-
@@ -226,7 +226,7 @@ struct defid {
extern vop_t **msdosfs_vnodeop_p;
-int msdosfs_lookup __P((struct vop_lookup_args *));
+int msdosfs_lookup __P((struct vop_cachedlookup_args *));
int msdosfs_inactive __P((struct vop_inactive_args *));
int msdosfs_reclaim __P((struct vop_reclaim_args *));
diff --git a/sys/msdosfs/msdosfs_lookup.c b/sys/msdosfs/msdosfs_lookup.c
index 9bc576c..9e7b095 100644
--- a/sys/msdosfs/msdosfs_lookup.c
+++ b/sys/msdosfs/msdosfs_lookup.c
@@ -1,4 +1,4 @@
-/* $Id: msdosfs_lookup.c,v 1.10 1997/02/22 09:40:47 peter Exp $ */
+/* $Id: msdosfs_lookup.c,v 1.11 1997/02/26 14:23:13 bde Exp $ */
/* $NetBSD: msdosfs_lookup.c,v 1.14 1994/08/21 18:44:07 ws Exp $ */
/*-
@@ -82,7 +82,7 @@ static int markdeleted __P((struct msdosfsmount *pmp, u_long dirclust,
*/
int
msdosfs_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnode *a_dvp;
struct vnode **a_vpp;
struct componentname *a_cnp;
@@ -141,61 +141,6 @@ msdosfs_lookup(ap)
return ENOTDIR;
/*
- * See if the component of the pathname we are looking for is in
- * the directory cache. If so then do a few things and return.
- */
- error = cache_lookup(vdp, vpp, cnp);
- if (error) {
- int vpid;
-
- if (error == ENOENT)
- return error;
- pdp = vdp;
- vdp = *vpp;
- dp = VTODE(vdp);
- vpid = vdp->v_id;
- if (pdp == vdp) {
- VREF(vdp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(pdp, 0, p);
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- } else {
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
-
- if (!error) {
- if (vpid == vdp->v_id) {
-#ifdef MSDOSFS_DEBUG
- printf("msdosfs_lookup(): cache hit, vnode %08x, file %s\n",
- vdp, dp->de_Name);
-#endif
-#ifdef PC98
- /*
- * 1024 byte/sector support
- */
- if (pmp->pm_BytesPerSec == 1024)
- vdp->v_flag |= 0x10000;
-#endif
- return 0;
- }
- vput(vdp);
- if (lockparent && pdp != vdp && (flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- if (error)
- return error;
- vdp = pdp;
- dp = VTODE(vdp);
- *vpp = NULL;
- }
-
- /*
* If they are going after the . or .. entry in the root directory,
* they won't find it. DOS filesystems don't have them in the root
* directory. So, we fake it. deget() is in on this scam too.
diff --git a/sys/msdosfs/msdosfs_vnops.c b/sys/msdosfs/msdosfs_vnops.c
index 76401b6..e1884c8 100644
--- a/sys/msdosfs/msdosfs_vnops.c
+++ b/sys/msdosfs/msdosfs_vnops.c
@@ -1,4 +1,4 @@
-/* $Id: msdosfs_vnops.c,v 1.41 1997/04/10 14:56:49 bde Exp $ */
+/* $Id: msdosfs_vnops.c,v 1.42 1997/05/17 18:32:40 phk Exp $ */
/* $NetBSD: msdosfs_vnops.c,v 1.20 1994/08/21 18:44:13 ws Exp $ */
/*-
@@ -1987,7 +1987,8 @@ msdosfs_pathconf(ap)
vop_t **msdosfs_vnodeop_p;
static struct vnodeopv_entry_desc msdosfs_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)msdosfs_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup }, /* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)msdosfs_lookup }, /* lookup */
{ &vop_create_desc, (vop_t *)msdosfs_create }, /* create */
{ &vop_mknod_desc, (vop_t *)msdosfs_mknod }, /* mknod */
{ &vop_open_desc, (vop_t *)msdosfs_open }, /* open */
diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c
index 0dff531..8ef10dd 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_vnops.c 8.16 (Berkeley) 5/27/95
- * $Id: nfs_vnops.c,v 1.54 1997/06/16 00:23:40 dyson Exp $
+ * $Id: nfs_vnops.c,v 1.55 1997/06/25 08:32:33 dfr Exp $
*/
@@ -102,7 +102,7 @@ static int nfs_ioctl __P((struct vop_ioctl_args *));
static int nfs_select __P((struct vop_select_args *));
static int nfs_flush __P((struct vnode *,struct ucred *,int,struct proc *,int));
static int nfs_setattrrpc __P((struct vnode *,struct vattr *,struct ucred *,struct proc *));
-static int nfs_lookup __P((struct vop_lookup_args *));
+static int nfs_lookup __P((struct vop_cachedlookup_args *));
static int nfs_create __P((struct vop_create_args *));
static int nfs_mknod __P((struct vop_mknod_args *));
static int nfs_open __P((struct vop_open_args *));
@@ -141,7 +141,8 @@ static int nfs_update __P((struct vop_update_args *));
vop_t **nfsv2_vnodeop_p;
static struct vnodeopv_entry_desc nfsv2_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)nfs_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup }, /* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)nfs_lookup }, /* lookup */
{ &vop_create_desc, (vop_t *)nfs_create }, /* create */
{ &vop_mknod_desc, (vop_t *)nfs_mknod }, /* mknod */
{ &vop_open_desc, (vop_t *)nfs_open }, /* open */
@@ -837,7 +838,7 @@ nfs_setattrrpc(vp, vap, cred, procp)
*/
static int
nfs_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnodeop_desc *a_desc;
struct vnode *a_dvp;
struct vnode **a_vpp;
@@ -872,55 +873,6 @@ nfs_lookup(ap)
wantparent = flags & (LOCKPARENT|WANTPARENT);
nmp = VFSTONFS(dvp->v_mount);
np = VTONFS(dvp);
- if ((error = cache_lookup(dvp, vpp, cnp)) && error != ENOENT) {
- struct vattr vattr;
- int vpid;
-
- if (error = VOP_ACCESS(dvp, VEXEC, cnp->cn_cred, p)) {
- *vpp = NULLVP;
- return (error);
- }
-
- newvp = *vpp;
- vpid = newvp->v_id;
- /*
- * See the comment starting `Step through' in ufs/ufs_lookup.c
- * for an explanation of the locking protocol
- */
- if (dvp == newvp) {
- VREF(newvp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(dvp, 0, p);
- error = vget(newvp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(dvp, LK_EXCLUSIVE, p);
- } else {
- error = vget(newvp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(dvp, 0, p);
- }
- if (!error) {
- if (vpid == newvp->v_id) {
- if (!VOP_GETATTR(newvp, &vattr, cnp->cn_cred, p)
- && vattr.va_ctime.tv_sec == VTONFS(newvp)->n_ctime) {
- nfsstats.lookupcache_hits++;
- if (cnp->cn_nameiop != LOOKUP &&
- (flags & ISLASTCN))
- cnp->cn_flags |= SAVENAME;
- return (0);
- }
- cache_purge(newvp);
- }
- vput(newvp);
- if (lockparent && dvp != newvp && (flags & ISLASTCN))
- VOP_UNLOCK(dvp, 0, p);
- }
- error = vn_lock(dvp, LK_EXCLUSIVE, p);
- *vpp = NULLVP;
- if (error)
- return (error);
- }
error = 0;
newvp = NULLVP;
nfsstats.lookupcache_misses++;
diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c
index 0dff531..8ef10dd 100644
--- a/sys/nfsclient/nfs_vnops.c
+++ b/sys/nfsclient/nfs_vnops.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_vnops.c 8.16 (Berkeley) 5/27/95
- * $Id: nfs_vnops.c,v 1.54 1997/06/16 00:23:40 dyson Exp $
+ * $Id: nfs_vnops.c,v 1.55 1997/06/25 08:32:33 dfr Exp $
*/
@@ -102,7 +102,7 @@ static int nfs_ioctl __P((struct vop_ioctl_args *));
static int nfs_select __P((struct vop_select_args *));
static int nfs_flush __P((struct vnode *,struct ucred *,int,struct proc *,int));
static int nfs_setattrrpc __P((struct vnode *,struct vattr *,struct ucred *,struct proc *));
-static int nfs_lookup __P((struct vop_lookup_args *));
+static int nfs_lookup __P((struct vop_cachedlookup_args *));
static int nfs_create __P((struct vop_create_args *));
static int nfs_mknod __P((struct vop_mknod_args *));
static int nfs_open __P((struct vop_open_args *));
@@ -141,7 +141,8 @@ static int nfs_update __P((struct vop_update_args *));
vop_t **nfsv2_vnodeop_p;
static struct vnodeopv_entry_desc nfsv2_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)nfs_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup }, /* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)nfs_lookup }, /* lookup */
{ &vop_create_desc, (vop_t *)nfs_create }, /* create */
{ &vop_mknod_desc, (vop_t *)nfs_mknod }, /* mknod */
{ &vop_open_desc, (vop_t *)nfs_open }, /* open */
@@ -837,7 +838,7 @@ nfs_setattrrpc(vp, vap, cred, procp)
*/
static int
nfs_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnodeop_desc *a_desc;
struct vnode *a_dvp;
struct vnode **a_vpp;
@@ -872,55 +873,6 @@ nfs_lookup(ap)
wantparent = flags & (LOCKPARENT|WANTPARENT);
nmp = VFSTONFS(dvp->v_mount);
np = VTONFS(dvp);
- if ((error = cache_lookup(dvp, vpp, cnp)) && error != ENOENT) {
- struct vattr vattr;
- int vpid;
-
- if (error = VOP_ACCESS(dvp, VEXEC, cnp->cn_cred, p)) {
- *vpp = NULLVP;
- return (error);
- }
-
- newvp = *vpp;
- vpid = newvp->v_id;
- /*
- * See the comment starting `Step through' in ufs/ufs_lookup.c
- * for an explanation of the locking protocol
- */
- if (dvp == newvp) {
- VREF(newvp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(dvp, 0, p);
- error = vget(newvp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(dvp, LK_EXCLUSIVE, p);
- } else {
- error = vget(newvp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(dvp, 0, p);
- }
- if (!error) {
- if (vpid == newvp->v_id) {
- if (!VOP_GETATTR(newvp, &vattr, cnp->cn_cred, p)
- && vattr.va_ctime.tv_sec == VTONFS(newvp)->n_ctime) {
- nfsstats.lookupcache_hits++;
- if (cnp->cn_nameiop != LOOKUP &&
- (flags & ISLASTCN))
- cnp->cn_flags |= SAVENAME;
- return (0);
- }
- cache_purge(newvp);
- }
- vput(newvp);
- if (lockparent && dvp != newvp && (flags & ISLASTCN))
- VOP_UNLOCK(dvp, 0, p);
- }
- error = vn_lock(dvp, LK_EXCLUSIVE, p);
- *vpp = NULLVP;
- if (error)
- return (error);
- }
error = 0;
newvp = NULLVP;
nfsstats.lookupcache_misses++;
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 4d1b362..4c5225d 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)vnode.h 8.7 (Berkeley) 2/4/94
- * $Id: vnode.h,v 1.44 1997/05/04 09:17:38 phk Exp $
+ * $Id: vnode.h,v 1.45 1997/08/18 03:29:08 fsmp Exp $
*/
#ifndef _SYS_VNODE_H_
@@ -502,6 +502,7 @@ int vn_rdwr __P((enum uio_rw rw, struct vnode *vp, caddr_t base,
int len, off_t offset, enum uio_seg segflg, int ioflg,
struct ucred *cred, int *aresid, struct proc *p));
int vn_stat __P((struct vnode *vp, struct stat *sb, struct proc *p));
+int vfs_cache_lookup __P((struct vop_lookup_args *ap));
int vfs_object_create __P((struct vnode *vp, struct proc *p,
struct ucred *cred, int waslocked));
int vn_writechk __P((struct vnode *vp));
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
index 341a428..35274bf 100644
--- a/sys/ufs/ffs/ffs_vnops.c
+++ b/sys/ufs/ffs/ffs_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_vnops.c 8.15 (Berkeley) 5/14/95
- * $Id: ffs_vnops.c,v 1.25 1997/03/22 06:53:30 bde Exp $
+ * $Id: ffs_vnops.c,v 1.26 1997/08/25 08:18:23 kato Exp $
*/
#include <sys/param.h>
@@ -78,7 +78,8 @@ static int ffs_write __P((struct vop_write_args *));
vop_t **ffs_vnodeop_p;
static struct vnodeopv_entry_desc ffs_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *)vn_default_error },
- { &vop_lookup_desc, (vop_t *)ufs_lookup }, /* lookup */
+ { &vop_lookup_desc, (vop_t *)vfs_cache_lookup },/* lookup */
+ { &vop_cachedlookup_desc, (vop_t *)ufs_lookup },/* cachedlookup */
{ &vop_create_desc, (vop_t *)ufs_create }, /* create */
{ &vop_whiteout_desc, (vop_t *)ufs_whiteout }, /* whiteout */
{ &vop_mknod_desc, (vop_t *)ufs_mknod }, /* mknod */
diff --git a/sys/ufs/ufs/ufs_extern.h b/sys/ufs/ufs/ufs_extern.h
index e1f38af..690e31c 100644
--- a/sys/ufs/ufs/ufs_extern.h
+++ b/sys/ufs/ufs/ufs_extern.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ufs_extern.h 8.10 (Berkeley) 5/14/95
- * $Id: ufs_extern.h,v 1.14 1997/02/22 09:47:46 peter Exp $
+ * $Id: ufs_extern.h,v 1.15 1997/08/16 19:16:26 wollman Exp $
*/
#ifndef _UFS_UFS_EXTERN_H_
@@ -93,7 +93,7 @@ int ufs_islocked __P((struct vop_islocked_args *));
#endif
int ufs_link __P((struct vop_link_args *));
int ufs_lock __P((struct vop_lock_args *));
-int ufs_lookup __P((struct vop_lookup_args *));
+int ufs_lookup __P((struct vop_cachedlookup_args *));
int ufs_makeinode __P((int mode, struct vnode *, struct vnode **, struct componentname *));
int ufs_mkdir __P((struct vop_mkdir_args *));
int ufs_mknod __P((struct vop_mknod_args *));
diff --git a/sys/ufs/ufs/ufs_lookup.c b/sys/ufs/ufs/ufs_lookup.c
index c5ccbbe..3d32aa8 100644
--- a/sys/ufs/ufs/ufs_lookup.c
+++ b/sys/ufs/ufs/ufs_lookup.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)ufs_lookup.c 8.15 (Berkeley) 6/16/95
- * $Id: ufs_lookup.c,v 1.13 1997/03/09 06:10:33 mpp Exp $
+ * $Id: ufs_lookup.c,v 1.14 1997/03/31 12:02:49 peter Exp $
*/
#include <sys/param.h>
@@ -97,7 +97,7 @@ int dirchk = 0;
*/
int
ufs_lookup(ap)
- struct vop_lookup_args /* {
+ struct vop_cachedlookup_args /* {
struct vnode *a_dvp;
struct vnode **a_vpp;
struct componentname *a_cnp;
@@ -153,57 +153,6 @@ ufs_lookup(ap)
/*
* We now have a segment name to search for, and a directory to search.
*
- * Before tediously performing a linear scan of the directory,
- * check the name cache to see if the directory/name pair
- * we are looking for is known already.
- */
- error = cache_lookup(vdp, vpp, cnp);
- if (error) {
- int vpid; /* capability number of vnode */
-
- if (error == ENOENT)
- return (error);
- /*
- * Get the next vnode in the path.
- * See comment below starting `Step through' for
- * an explaination of the locking protocol.
- */
- pdp = vdp;
- dp = VTOI(*vpp);
- vdp = *vpp;
- vpid = vdp->v_id;
- if (pdp == vdp) { /* lookup on "." */
- VREF(vdp);
- error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(pdp, 0, p);
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(pdp, LK_EXCLUSIVE, p);
- } else {
- error = vget(vdp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- /*
- * Check that the capability number did not change
- * while we were waiting for the lock.
- */
- if (!error) {
- if (vpid == vdp->v_id)
- return (0);
- vput(vdp);
- if (lockparent && pdp != vdp && (flags & ISLASTCN))
- VOP_UNLOCK(pdp, 0, p);
- }
- if (error = vn_lock(pdp, LK_EXCLUSIVE, p))
- return (error);
- vdp = pdp;
- dp = VTOI(pdp);
- *vpp = NULL;
- }
-
- /*
* Suppress search for slots unless creating
* file and at end of pathname, in which case
* we watch for a place to put the new file in
OpenPOWER on IntegriCloud