Fix the experimental NFS server to use vfs_busyfs() instead

of vfs_getvfs() so that the mount point is busied for the
VFS_FHTOVP() call. This is analagous to r185432 for the
regular NFS server.

Reviewed by:	kib
MFC after:	12 days
This commit is contained in:
rmacklem 2011-01-05 18:46:05 +00:00
parent fbe0884676
commit 10ecdb0a36

View File

@ -2548,8 +2548,8 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
/*
* Check for the special case of the nfsv4root_fh.
*/
mp = vfs_getvfs(&fhp->fh_fsid);
if (!mp) {
mp = vfs_busyfs(&fhp->fh_fsid);
if (mp == NULL) {
*vpp = NULL;
nd->nd_repstat = ESTALE;
if (*mpp && exp->nes_vfslocked)
@ -2575,6 +2575,7 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
nd->nd_repstat = nfsvno_fhtovp(mp, fhp, nd->nd_nam, lktype, vpp, exp,
&credanon);
vfs_unbusy(mp);
/*
* For NFSv4 without a pseudo root fs, unexported file handles
@ -2636,11 +2637,8 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
VFS_UNLOCK_GIANT(mp);
exp->nes_vfslocked = 0;
}
vfs_rel(mp);
*vpp = NULL;
*mpp = NULL;
} else {
vfs_rel(mp);
}
}
@ -2780,10 +2778,11 @@ nfsvno_getvp(fhandle_t *fhp)
struct vnode *vp;
int error;
mp = vfs_getvfs(&fhp->fh_fsid);
mp = vfs_busyfs(&fhp->fh_fsid);
if (mp == NULL)
return (NULL);
error = VFS_FHTOVP(mp, &fhp->fh_fid, &vp);
vfs_unbusy(mp);
if (error)
return (NULL);
return (vp);