summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2005-03-16 11:20:51 +0000
committerphk <phk@FreeBSD.org>2005-03-16 11:20:51 +0000
commit98f1c9b062647e119053ac555f7eb5e353d0c465 (patch)
tree4ec08b592ae3dc7f2da72161be0120f5fe447736 /sys
parent6552218237e46878fe727ca080ccc8a0f753e6df (diff)
downloadFreeBSD-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.
Diffstat (limited to 'sys')
-rw-r--r--sys/fs/cd9660/cd9660_vfsops.c4
-rw-r--r--sys/fs/hpfs/hpfs_vfsops.c4
-rw-r--r--sys/fs/msdosfs/msdosfs_denode.c5
-rw-r--r--sys/fs/udf/udf_vfsops.c4
-rw-r--r--sys/gnu/ext2fs/ext2_vfsops.c4
-rw-r--r--sys/gnu/fs/ext2fs/ext2_vfsops.c4
-rw-r--r--sys/isofs/cd9660/cd9660_vfsops.c4
-rw-r--r--sys/kern/vfs_hash.c8
-rw-r--r--sys/sys/vnode.h6
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c4
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);
OpenPOWER on IntegriCloud