diff options
author | phk <phk@FreeBSD.org> | 2005-03-16 11:20:51 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2005-03-16 11:20:51 +0000 |
commit | 98f1c9b062647e119053ac555f7eb5e353d0c465 (patch) | |
tree | 4ec08b592ae3dc7f2da72161be0120f5fe447736 | |
parent | 6552218237e46878fe727ca080ccc8a0f753e6df (diff) | |
download | FreeBSD-src-98f1c9b062647e119053ac555f7eb5e353d0c465.zip FreeBSD-src-98f1c9b062647e119053ac555f7eb5e353d0c465.tar.gz |
Add two arguments to the vfs_hash() KPI so that filesystems which do
not have unique hashes (NFS) can also use it.
-rw-r--r-- | sys/fs/cd9660/cd9660_vfsops.c | 4 | ||||
-rw-r--r-- | sys/fs/hpfs/hpfs_vfsops.c | 4 | ||||
-rw-r--r-- | sys/fs/msdosfs/msdosfs_denode.c | 5 | ||||
-rw-r--r-- | sys/fs/udf/udf_vfsops.c | 4 | ||||
-rw-r--r-- | sys/gnu/ext2fs/ext2_vfsops.c | 4 | ||||
-rw-r--r-- | sys/gnu/fs/ext2fs/ext2_vfsops.c | 4 | ||||
-rw-r--r-- | sys/isofs/cd9660/cd9660_vfsops.c | 4 | ||||
-rw-r--r-- | sys/kern/vfs_hash.c | 8 | ||||
-rw-r--r-- | sys/sys/vnode.h | 6 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vfsops.c | 4 |
10 files changed, 27 insertions, 20 deletions
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c index 0246ad5..6d15b21 100644 --- a/sys/fs/cd9660/cd9660_vfsops.c +++ b/sys/fs/cd9660/cd9660_vfsops.c @@ -661,7 +661,7 @@ cd9660_vget_internal(mp, ino, flags, vpp, relocated, isodir) struct cdev *dev; int error; - error = vfs_hash_get(mp, ino, flags, curthread, vpp); + error = vfs_hash_get(mp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); @@ -679,7 +679,7 @@ cd9660_vget_internal(mp, ino, flags, vpp, relocated, isodir) ip->i_vnode = vp; ip->i_number = ino; - error = vfs_hash_insert(vp, ino, flags, curthread, vpp); + error = vfs_hash_insert(vp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); diff --git a/sys/fs/hpfs/hpfs_vfsops.c b/sys/fs/hpfs/hpfs_vfsops.c index 38dba78..1757de9 100644 --- a/sys/fs/hpfs/hpfs_vfsops.c +++ b/sys/fs/hpfs/hpfs_vfsops.c @@ -463,7 +463,7 @@ hpfs_vget( dprintf(("hpfs_vget(0x%x): ",ino)); - error = vfs_hash_get(mp, ino, flags, curthread, vpp); + error = vfs_hash_get(mp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); @@ -513,7 +513,7 @@ hpfs_vget( hp->h_mode = hpmp->hpm_mode; hp->h_devvp = hpmp->hpm_devvp; - error = vfs_hash_insert(vp, ino, flags, curthread, vpp); + error = vfs_hash_insert(vp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c index 35e62cc..7c58245 100644 --- a/sys/fs/msdosfs/msdosfs_denode.c +++ b/sys/fs/msdosfs/msdosfs_denode.c @@ -124,7 +124,8 @@ deget(pmp, dirclust, diroffset, depp) * entry that represented the file happens to be reused while the * deleted file is still open. */ - error = vfs_hash_get(mntp, hash, LK_EXCLUSIVE, curthread, &nvp); + error = vfs_hash_get(mntp, hash, LK_EXCLUSIVE, curthread, &nvp, + NULL, NULL); if (error) return(error); if (nvp != NULL) { @@ -158,7 +159,7 @@ deget(pmp, dirclust, diroffset, depp) ldep->de_diroffset = diroffset; fc_purge(ldep, 0); /* init the fat cache for this denode */ - error = vfs_hash_insert(nvp, hash, 0, curthread, &xvp); + error = vfs_hash_insert(nvp, hash, 0, curthread, &xvp, NULL, NULL); if (error) { *depp = NULL; return (error); diff --git a/sys/fs/udf/udf_vfsops.c b/sys/fs/udf/udf_vfsops.c index 5297fc8..b5eb3cd 100644 --- a/sys/fs/udf/udf_vfsops.c +++ b/sys/fs/udf/udf_vfsops.c @@ -581,7 +581,7 @@ udf_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp) struct file_entry *fe; int error, sector, size; - error = vfs_hash_get(mp, ino, flags, curthread, vpp); + error = vfs_hash_get(mp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); @@ -601,7 +601,7 @@ udf_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp) unode->udfmp = udfmp; vp->v_data = unode; - error = vfs_hash_insert(vp, ino, flags, curthread, vpp); + error = vfs_hash_insert(vp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); diff --git a/sys/gnu/ext2fs/ext2_vfsops.c b/sys/gnu/ext2fs/ext2_vfsops.c index 8d23e11..f68f640 100644 --- a/sys/gnu/ext2fs/ext2_vfsops.c +++ b/sys/gnu/ext2fs/ext2_vfsops.c @@ -915,7 +915,7 @@ ext2_vget(mp, ino, flags, vpp) int i, error; int used_blocks; - error = vfs_hash_get(mp, ino, flags, curthread, vpp); + error = vfs_hash_get(mp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); @@ -942,7 +942,7 @@ ext2_vget(mp, ino, flags, vpp) ip->i_e2fs = fs = ump->um_e2fs; ip->i_number = ino; - error = vfs_hash_insert(vp, ino, flags, curthread, vpp); + error = vfs_hash_insert(vp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); diff --git a/sys/gnu/fs/ext2fs/ext2_vfsops.c b/sys/gnu/fs/ext2fs/ext2_vfsops.c index 8d23e11..f68f640 100644 --- a/sys/gnu/fs/ext2fs/ext2_vfsops.c +++ b/sys/gnu/fs/ext2fs/ext2_vfsops.c @@ -915,7 +915,7 @@ ext2_vget(mp, ino, flags, vpp) int i, error; int used_blocks; - error = vfs_hash_get(mp, ino, flags, curthread, vpp); + error = vfs_hash_get(mp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); @@ -942,7 +942,7 @@ ext2_vget(mp, ino, flags, vpp) ip->i_e2fs = fs = ump->um_e2fs; ip->i_number = ino; - error = vfs_hash_insert(vp, ino, flags, curthread, vpp); + error = vfs_hash_insert(vp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c index 0246ad5..6d15b21 100644 --- a/sys/isofs/cd9660/cd9660_vfsops.c +++ b/sys/isofs/cd9660/cd9660_vfsops.c @@ -661,7 +661,7 @@ cd9660_vget_internal(mp, ino, flags, vpp, relocated, isodir) struct cdev *dev; int error; - error = vfs_hash_get(mp, ino, flags, curthread, vpp); + error = vfs_hash_get(mp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); @@ -679,7 +679,7 @@ cd9660_vget_internal(mp, ino, flags, vpp, relocated, isodir) ip->i_vnode = vp; ip->i_number = ino; - error = vfs_hash_insert(vp, ino, flags, curthread, vpp); + error = vfs_hash_insert(vp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); diff --git a/sys/kern/vfs_hash.c b/sys/kern/vfs_hash.c index 8940977..3cec5c5 100644 --- a/sys/kern/vfs_hash.c +++ b/sys/kern/vfs_hash.c @@ -62,7 +62,7 @@ vfs_hash_index(struct mount *mp, u_int hash) } int -vfs_hash_get(struct mount *mp, u_int hash, int flags, struct thread *td, struct vnode **vpp) +vfs_hash_get(struct mount *mp, u_int hash, int flags, struct thread *td, struct vnode **vpp, vfs_hash_cmp_t *fn, void *arg) { struct vnode *vp; int error; @@ -74,6 +74,8 @@ vfs_hash_get(struct mount *mp, u_int hash, int flags, struct thread *td, struct continue; if (vp->v_mount != mp) continue; + if (fn != NULL && fn(vp, arg)) + continue; VI_LOCK(vp); mtx_unlock(&vfs_hash_mtx); error = vget(vp, flags | LK_INTERLOCK, td); @@ -102,7 +104,7 @@ vfs_hash_remove(struct vnode *vp) } int -vfs_hash_insert(struct vnode *vp, u_int hash, int flags, struct thread *td, struct vnode **vpp) +vfs_hash_insert(struct vnode *vp, u_int hash, int flags, struct thread *td, struct vnode **vpp, vfs_hash_cmp_t *fn, void *arg) { struct vnode *vp2; int error; @@ -117,6 +119,8 @@ vfs_hash_insert(struct vnode *vp, u_int hash, int flags, struct thread *td, stru continue; if (vp2->v_mount != vp->v_mount) continue; + if (fn != NULL && fn(vp, arg)) + continue; VI_LOCK(vp2); mtx_unlock(&vfs_hash_mtx); error = vget(vp2, flags | LK_INTERLOCK, td); diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 920df12..45e1880 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -693,8 +693,10 @@ extern struct vop_vector default_vnodeops; #define VOP_EOPNOTSUPP ((void*)(uintptr_t)vop_eopnotsupp) /* vfs_hash.c */ -int vfs_hash_get(struct mount *mp, u_int hash, int flags, struct thread *td, struct vnode **vpp); -int vfs_hash_insert(struct vnode *vp, u_int hash, int flags, struct thread *td, struct vnode **vpp); +typedef int vfs_hash_cmp_t(struct vnode *vp, void *arg); + +int vfs_hash_get(struct mount *mp, u_int hash, int flags, struct thread *td, struct vnode **vpp, vfs_hash_cmp_t *fn, void *arg); +int vfs_hash_insert(struct vnode *vp, u_int hash, int flags, struct thread *td, struct vnode **vpp, vfs_hash_cmp_t *fn, void *arg); void vfs_hash_rehash(struct vnode *vp, u_int hash); void vfs_hash_remove(struct vnode *vp); diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index b1117b6..04ae675 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -1172,7 +1172,7 @@ ffs_vget(mp, ino, flags, vpp) struct cdev *dev; int error; - error = vfs_hash_get(mp, ino, flags, curthread, vpp); + error = vfs_hash_get(mp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); @@ -1225,7 +1225,7 @@ ffs_vget(mp, ino, flags, vpp) } #endif - error = vfs_hash_insert(vp, ino, flags, curthread, vpp); + error = vfs_hash_insert(vp, ino, flags, curthread, vpp, NULL, NULL); if (error || *vpp != NULL) return (error); |