summaryrefslogtreecommitdiffstats
path: root/sys/fs
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/fs
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/fs')
-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
6 files changed, 14 insertions, 119 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 */
OpenPOWER on IntegriCloud