Author: kib
Date: Wed Mar  7 07:59:30 2012
New Revision: 232643
URL: http://svn.freebsd.org/changeset/base/232643

Log:
  MFC r232299:
  Move the code to destroy half-contructed nullfs vnode into helper
  function null_destroy_proto() from null_insmntque_dtr(). Also
  apply null_destroy_proto() in null_nodeget() when we raced and a vnode
  is found in the hash, so the currently allocated protonode shall be
  destroyed.
  
  Lock the vnode interlock around reassigning the v_vnlock.
  
  MFC r232383:
  Do not expose unlocked unconstructed nullfs vnode on mount list.
  Lock the native nullfs vnode lock before switching the locks.

Modified:
  stable/9/sys/fs/nullfs/null_subr.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/fs/nullfs/null_subr.c
==============================================================================
--- stable/9/sys/fs/nullfs/null_subr.c  Wed Mar  7 07:55:35 2012        
(r232642)
+++ stable/9/sys/fs/nullfs/null_subr.c  Wed Mar  7 07:59:30 2012        
(r232643)
@@ -169,17 +169,26 @@ null_hashins(mp, xp)
 }
 
 static void
-null_insmntque_dtr(struct vnode *vp, void *xp)
+null_destroy_proto(struct vnode *vp, void *xp)
 {
 
-       vput(((struct null_node *)xp)->null_lowervp);
+       lockmgr(&vp->v_lock, LK_EXCLUSIVE, NULL);
+       VI_LOCK(vp);
        vp->v_data = NULL;
        vp->v_vnlock = &vp->v_lock;
-       free(xp, M_NULLFSNODE);
        vp->v_op = &dead_vnodeops;
-       (void) vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+       VI_UNLOCK(vp);
        vgone(vp);
        vput(vp);
+       free(xp, M_NULLFSNODE);
+}
+
+static void
+null_insmntque_dtr(struct vnode *vp, void *xp)
+{
+
+       vput(((struct null_node *)xp)->null_lowervp);
+       null_destroy_proto(vp, xp);
 }
 
 /*
@@ -247,9 +256,7 @@ null_nodeget(mp, lowervp, vpp)
        *vpp = null_hashins(mp, xp);
        if (*vpp != NULL) {
                vrele(lowervp);
-               vp->v_vnlock = &vp->v_lock;
-               xp->null_lowervp = NULL;
-               vrele(vp);
+               null_destroy_proto(vp, xp);
                return (0);
        }
        *vpp = vp;
_______________________________________________
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