Author: kib
Date: Tue Jan  3 21:09:07 2012
New Revision: 229431
URL: http://svn.freebsd.org/changeset/base/229431

Log:
  Do the vput() for the lowervp in the null_nodeget() for error case too.
  Several callers of null_nodeget() did the cleanup itself, but several
  missed it, most prominent being null_bypass(). Remove the cleanup from
  the callers, now null_nodeget() handles lowervp free itself.
  
  Reported and tested by:       pho
  MFC after:    1 week

Modified:
  head/sys/fs/nullfs/null_subr.c
  head/sys/fs/nullfs/null_vfsops.c
  head/sys/fs/nullfs/null_vnops.c

Modified: head/sys/fs/nullfs/null_subr.c
==============================================================================
--- head/sys/fs/nullfs/null_subr.c      Tue Jan  3 21:04:54 2012        
(r229430)
+++ head/sys/fs/nullfs/null_subr.c      Tue Jan  3 21:09:07 2012        
(r229431)
@@ -171,6 +171,8 @@ null_hashins(mp, xp)
 static void
 null_insmntque_dtr(struct vnode *vp, void *xp)
 {
+
+       vput(((struct null_node *)xp)->null_lowervp);
        vp->v_data = NULL;
        vp->v_vnlock = &vp->v_lock;
        free(xp, M_NULLFSNODE);
@@ -226,6 +228,7 @@ null_nodeget(mp, lowervp, vpp)
 
        error = getnewvnode("null", mp, &null_vnodeops, &vp);
        if (error) {
+               vput(lowervp);
                free(xp, M_NULLFSNODE);
                return (error);
        }

Modified: head/sys/fs/nullfs/null_vfsops.c
==============================================================================
--- head/sys/fs/nullfs/null_vfsops.c    Tue Jan  3 21:04:54 2012        
(r229430)
+++ head/sys/fs/nullfs/null_vfsops.c    Tue Jan  3 21:09:07 2012        
(r229431)
@@ -157,8 +157,7 @@ nullfs_mount(struct mount *mp)
         * Make sure the node alias worked
         */
        if (error) {
-               vrele(lowerrootvp);
-               free(xmp, M_NULLFSMNT); /* XXX */
+               free(xmp, M_NULLFSMNT);
                return (error);
        }
 

Modified: head/sys/fs/nullfs/null_vnops.c
==============================================================================
--- head/sys/fs/nullfs/null_vnops.c     Tue Jan  3 21:04:54 2012        
(r229430)
+++ head/sys/fs/nullfs/null_vnops.c     Tue Jan  3 21:09:07 2012        
(r229431)
@@ -365,9 +365,7 @@ null_lookup(struct vop_lookup_args *ap)
                        vrele(lvp);
                } else {
                        error = null_nodeget(dvp->v_mount, lvp, &vp);
-                       if (error)
-                               vput(lvp);
-                       else
+                       if (error == 0)
                                *ap->a_vpp = vp;
                }
        }
@@ -809,9 +807,7 @@ null_vptocnp(struct vop_vptocnp_args *ap
                NULLVPTOLOWERVP(*dvp);
 #endif
                VOP_UNLOCK(*dvp, 0); /* keep reference on *dvp */
-       } else
-               vput(ldvp);
-
+       }
        vn_lock(vp, locked | LK_RETRY);
        return (error);
 }
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to