summaryrefslogtreecommitdiffstats
path: root/sys/gnu
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/gnu
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/gnu')
-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
6 files changed, 8 insertions, 102 deletions
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 */
OpenPOWER on IntegriCloud