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) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to