VFS messaging/interfacing work stage 7d/99: More firming up of stage 7.
[dragonfly.git] / sys / vfs / nfs / nfs_node.c
index 85e8940..5db7af3 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_node.c  8.6 (Berkeley) 5/22/95
  * $FreeBSD: src/sys/nfs/nfs_node.c,v 1.36.2.3 2002/01/05 22:25:04 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_node.c,v 1.10 2004/04/19 16:33:49 cpressey Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_node.c,v 1.16 2004/10/05 03:24:31 dillon Exp $
  */
 
 
@@ -137,7 +137,8 @@ loop:
         */
        np = zalloc(nfsnode_zone);
                
-       error = getnewvnode(VT_NFS, mntp, nfsv2_vnodeop_p, &nvp);
+       error = getnewvnode(VT_NFS, mntp, mntp->mnt_vn_ops, &nvp,
+                               0, LK_NOPAUSE);
        if (error) {
                if (nfs_node_hash_lock < 0)
                        wakeup(&nfs_node_hash_lock);
@@ -172,7 +173,6 @@ loop:
        bcopy((caddr_t)fhp, (caddr_t)np->n_fhp, fhsize);
        np->n_fhsize = fhsize;
        lockinit(&np->n_rslock, rsflags, "nfrslk", 0, LK_NOPAUSE);
-       lockinit(&np->n_lock, 0, "nfsnlk", 0, LK_NOPAUSE);
        *npp = np;
 
        if (nfs_node_hash_lock < 0)
@@ -189,6 +189,9 @@ loop:
 
 /*
  * nfs_inactive(struct vnode *a_vp, struct thread *a_td)
+ *
+ * NOTE: the passed vnode is locked but not referenced.  On return the
+ * vnode must be unlocked and not referenced.
  */
 int
 nfs_inactive(struct vop_inactive_args *ap)
@@ -201,25 +204,22 @@ nfs_inactive(struct vop_inactive_args *ap)
                vprint("nfs_inactive: pushing active", ap->a_vp);
        if (ap->a_vp->v_type != VDIR) {
                sp = np->n_sillyrename;
-               np->n_sillyrename = (struct sillyrename *)0;
-       } else
-               sp = (struct sillyrename *)0;
+               np->n_sillyrename = NULL;
+       } else {
+               sp = NULL;
+       }
        if (sp) {
                /*
                 * We need a reference to keep the vnode from being
                 * recycled by getnewvnode while we do the I/O
-                * associated with discarding the buffers unless we
-                * are being forcibly unmounted in which case we already
-                * have our own reference.
+                * associated with discarding the buffers.  The vnode
+                * is already locked.
                 */
-               if (ap->a_vp->v_usecount > 0)
-                       (void) nfs_vinvalbuf(ap->a_vp, 0, ap->a_td, 1);
-               else if (vget(ap->a_vp, NULL, 0, ap->a_td))
-                       panic("nfs_inactive: lost vnode");
-               else {
-                       (void) nfs_vinvalbuf(ap->a_vp, 0, ap->a_td, 1);
-                       vrele(ap->a_vp);
-               }
+               vref(ap->a_vp);
+               nfs_vinvalbuf(ap->a_vp, 0, ap->a_td, 1);
+               vrele_noinactive(ap->a_vp);
+               KKASSERT(ap->a_vp->v_usecount == 0);
+
                /*
                 * Remove the silly file that was rename'd earlier
                 */
@@ -229,7 +229,7 @@ nfs_inactive(struct vop_inactive_args *ap)
                FREE((caddr_t)sp, M_NFSREQ);
        }
        np->n_flag &= (NMODIFIED | NFLUSHINPROG | NFLUSHWANT | NQNFSEVICTED |
-               NQNFSNONCACHE | NQNFSWRITE);
+                      NQNFSNONCACHE | NQNFSWRITE);
        VOP_UNLOCK(ap->a_vp, NULL, 0, ap->a_td);
        return (0);
 }
@@ -285,9 +285,9 @@ nfs_reclaim(struct vop_reclaim_args *ap)
                np->n_wucred = NULL;
        }
 
-       cache_purge(vp);
-       zfree(nfsnode_zone, vp->v_data);
-       vp->v_data = (void *)0;
+       cache_inval_vp(vp, CINV_SELF);
+       vp->v_data = NULL;
+       zfree(nfsnode_zone, np);
        return (0);
 }