svn commit: r195294 - in head/sys: fs/cd9660 kern nfsclient ufs/ffs

Konstantin Belousov kib at FreeBSD.org
Thu Jul 2 18:02:57 UTC 2009


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) {


More information about the svn-src-head mailing list