mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-04 12:52:15 +00:00
Add two arguments to the vfs_hash() KPI so that filesystems which do
not have unique hashes (NFS) can also use it.
This commit is contained in:
parent
9ed94841d9
commit
51f5ce0c8c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=143692
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user