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/kern/vfs_vnops.c | |
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/kern/vfs_vnops.c')
-rw-r--r-- | sys/kern/vfs_vnops.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index bef2804..f670646 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -1307,9 +1307,11 @@ vn_vget_ino(struct vnode *vp, ino_t ino, int lkflags, struct vnode **rvp) ("vn_vget_ino: vp not locked")); error = vfs_busy(mp, MBF_NOWAIT); if (error != 0) { + vfs_ref(mp); VOP_UNLOCK(vp, 0); error = vfs_busy(mp, 0); vn_lock(vp, ltype | LK_RETRY); + vfs_rel(mp); if (error != 0) return (ENOENT); if (vp->v_iflag & VI_DOOMED) { |