Skip site navigation (1)Skip section navigation (2)
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>