Date: Thu, 2 Jul 2009 18:02:55 +0000 (UTC) From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r195294 - in head/sys: fs/cd9660 kern nfsclient ufs/ffs Message-ID: <200907021802.n62I2tR1051178@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kib Date: Thu Jul 2 18:02:55 2009 New Revision: 195294 URL: http://svn.freebsd.org/changeset/base/195294 Log: 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 Modified: head/sys/fs/cd9660/cd9660_lookup.c head/sys/kern/vfs_vnops.c head/sys/nfsclient/nfs_vnops.c head/sys/ufs/ffs/ffs_softdep.c Modified: head/sys/fs/cd9660/cd9660_lookup.c ============================================================================== --- head/sys/fs/cd9660/cd9660_lookup.c Thu Jul 2 16:41:46 2009 (r195293) +++ head/sys/fs/cd9660/cd9660_lookup.c Thu Jul 2 18:02:55 2009 (r195294) @@ -376,9 +376,11 @@ found: ltype = VOP_ISLOCKED(pdp); error = vfs_busy(mp, MBF_NOWAIT); if (error != 0) { + vfs_ref(mp); VOP_UNLOCK(pdp, 0); error = vfs_busy(mp, 0); vn_lock(pdp, ltype | LK_RETRY); + vfs_rel(mp); if (error) return (ENOENT); if (pdp->v_iflag & VI_DOOMED) { Modified: head/sys/kern/vfs_vnops.c ============================================================================== --- head/sys/kern/vfs_vnops.c Thu Jul 2 16:41:46 2009 (r195293) +++ head/sys/kern/vfs_vnops.c Thu Jul 2 18:02:55 2009 (r195294) @@ -1307,9 +1307,11 @@ vn_vget_ino(struct vnode *vp, ino_t ino, ("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) { Modified: head/sys/nfsclient/nfs_vnops.c ============================================================================== --- head/sys/nfsclient/nfs_vnops.c Thu Jul 2 16:41:46 2009 (r195293) +++ head/sys/nfsclient/nfs_vnops.c Thu Jul 2 18:02:55 2009 (r195294) @@ -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; Modified: head/sys/ufs/ffs/ffs_softdep.c ============================================================================== --- head/sys/ufs/ffs/ffs_softdep.c Thu Jul 2 16:41:46 2009 (r195293) +++ head/sys/ufs/ffs/ffs_softdep.c Thu Jul 2 18:02:55 2009 (r195294) @@ -5104,9 +5104,11 @@ softdep_fsync(vp) FFSV_FORCEINSMQ)) { error = vfs_busy(mp, MBF_NOWAIT); if (error != 0) { + vfs_ref(mp); VOP_UNLOCK(vp, 0); error = vfs_busy(mp, 0); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + vfs_rel(mp); if (error != 0) return (ENOENT); if (vp->v_iflag & VI_DOOMED) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907021802.n62I2tR1051178>