X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/e851b29e255be098317af7b3f97041b210839b1d..8e005a4581fff1a8f490cae499fe12b09b86c37c:/sys/vfs/nfs/nfs_node.c diff --git a/sys/vfs/nfs/nfs_node.c b/sys/vfs/nfs/nfs_node.c index 85e8940176..5db7af3225 100644 --- a/sys/vfs/nfs/nfs_node.c +++ b/sys/vfs/nfs/nfs_node.c @@ -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); }