Author: kib
Date: Tue Jun 30 10:07:00 2009
New Revision: 195186
URL: http://svn.freebsd.org/changeset/base/195186

Log:
  Softdep_fsync() may need to lock parent directory of the synced vnode.
  Use inlined (due to FFSV_FORCEINSMQ) version of vn_vget_ino() to prevent
  mountpoint from being unmounted and freed while no vnodes are locked.
  
  Tested by:    pho
  Approved by:  re (kensmith)
  MFC after:    1 month

Modified:
  head/sys/ufs/ffs/ffs_softdep.c

Modified: head/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- head/sys/ufs/ffs/ffs_softdep.c      Tue Jun 30 09:51:41 2009        
(r195185)
+++ head/sys/ufs/ffs/ffs_softdep.c      Tue Jun 30 10:07:00 2009        
(r195186)
@@ -5102,10 +5102,28 @@ softdep_fsync(vp)
                FREE_LOCK(&lk);
                if (ffs_vgetf(mp, parentino, LK_NOWAIT | LK_EXCLUSIVE, &pvp,
                    FFSV_FORCEINSMQ)) {
+                       error = vfs_busy(mp, MBF_NOWAIT);
+                       if (error != 0) {
+                               VOP_UNLOCK(vp, 0);
+                               error = vfs_busy(mp, 0);
+                               vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+                               if (error != 0)
+                                       return (ENOENT);
+                               if (vp->v_iflag & VI_DOOMED) {
+                                       vfs_unbusy(mp);
+                                       return (ENOENT);
+                               }
+                       }
                        VOP_UNLOCK(vp, 0);
                        error = ffs_vgetf(mp, parentino, LK_EXCLUSIVE,
                            &pvp, FFSV_FORCEINSMQ);
+                       vfs_unbusy(mp);
                        vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+                       if (vp->v_iflag & VI_DOOMED) {
+                               if (error == 0)
+                                       vput(pvp);
+                               error = ENOENT;
+                       }
                        if (error != 0)
                                return (error);
                }
_______________________________________________
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