aboutsummaryrefslogtreecommitdiff
path: root/sys/nfsserver
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2008-11-29 13:34:59 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2008-11-29 13:34:59 +0000
commit6179164448a3dc27396dfbda8f7dd0a0799b9c62 (patch)
tree74a7c36a02638c961fd484be28f826c1acdb6a3a /sys/nfsserver
parent0c6a80e78d40ea8ec308e885e60e5558f772f9fb (diff)
Notes
Diffstat (limited to 'sys/nfsserver')
-rw-r--r--sys/nfsserver/nfs_srvsubs.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c
index bc6202149b49..49c6c1608dc1 100644
--- a/sys/nfsserver/nfs_srvsubs.c
+++ b/sys/nfsserver/nfs_srvsubs.c
@@ -1119,14 +1119,16 @@ nfsrv_fhtovp(fhandle_t *fhp, int lockflag, struct vnode **vpp, int *vfslockedp,
fhp = &nfs_pub.np_handle;
}
- mp = vfs_getvfs(&fhp->fh_fsid);
+ mp = vfs_busyfs(&fhp->fh_fsid);
if (!mp)
return (ESTALE);
vfslocked = VFS_LOCK_GIANT(mp);
error = VFS_CHECKEXP(mp, nam, &exflags, &credanon,
&numsecflavors, &secflavors);
- if (error)
+ if (error) {
+ vfs_unbusy(mp);
goto out;
+ }
if (numsecflavors == 0) {
/*
* This can happen if the system is running with an
@@ -1159,10 +1161,12 @@ nfsrv_fhtovp(fhandle_t *fhp, int lockflag, struct vnode **vpp, int *vfslockedp,
}
if (!mountreq) {
error = NFSERR_AUTHERR | AUTH_TOOWEAK;
+ vfs_unbusy(mp);
goto out;
}
}
error = VFS_FHTOVP(mp, &fhp->fh_fid, vpp);
+ vfs_unbusy(mp);
if (error)
goto out;
#ifdef MNT_EXNORESPORT
@@ -1196,7 +1200,6 @@ nfsrv_fhtovp(fhandle_t *fhp, int lockflag, struct vnode **vpp, int *vfslockedp,
if (!lockflag)
VOP_UNLOCK(*vpp, 0);
out:
- vfs_rel(mp);
if (error) {
VFS_UNLOCK_GIANT(vfslocked);
} else