diff options
author | kib <kib@FreeBSD.org> | 2009-07-02 18:02:55 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2009-07-02 18:02:55 +0000 |
commit | 350f96b4bfb4f448e5d1daefbab2238552c76cf9 (patch) | |
tree | 1d1f89470a093cacfe161f84e5ec9c2a86b5abab /sys/nfsclient | |
parent | 9055b3da210645c5201faab9905fe4b81baab9a8 (diff) | |
download | FreeBSD-src-350f96b4bfb4f448e5d1daefbab2238552c76cf9.zip FreeBSD-src-350f96b4bfb4f448e5d1daefbab2238552c76cf9.tar.gz |
In vn_vget_ino() and their inline equivalents, mnt_ref() the mount point
around the sequence that drop vnode lock and then busies the mount point.
Not having vlocked node or direct reference to the mp allows for the
forced unmount to proceed, making mp unmounted or reused.
Tested by: pho
Reviewed by: jeff
Approved by: re (kensmith)
MFC after: 2 weeks
Diffstat (limited to 'sys/nfsclient')
-rw-r--r-- | sys/nfsclient/nfs_vnops.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index 060ac54..07a7904 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -1043,9 +1043,11 @@ nfs_lookup(struct vop_lookup_args *ap) ltype = VOP_ISLOCKED(dvp); error = vfs_busy(mp, MBF_NOWAIT); if (error != 0) { + vfs_ref(mp); VOP_UNLOCK(dvp, 0); error = vfs_busy(mp, 0); vn_lock(dvp, ltype | LK_RETRY); + vfs_rel(mp); if (error == 0 && (dvp->v_iflag & VI_DOOMED)) { vfs_unbusy(mp); error = ENOENT; |