date and time created 90/02/07 19:18:39 by mckusick
[unix-history] / usr / src / sys / nfs / nfs_node.c
index dcac47c..b8511e5 100644 (file)
@@ -17,7 +17,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)nfs_node.c  7.13 (Berkeley) %G%
+ *     @(#)nfs_node.c  7.20 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -136,8 +136,9 @@ loop:
        /*
         * Insert the nfsnode in the hash queue for its new file handle
         */
        /*
         * Insert the nfsnode in the hash queue for its new file handle
         */
-       np->n_flag = NLOCKED;
+       np->n_flag = 0;
        insque(np, nh);
        insque(np, nh);
+       nfs_lock(vp);
        bcopy((caddr_t)fhp, (caddr_t)&np->n_fh, NFSX_FH);
        np->n_attrstamp = 0;
        np->n_sillyrename = (struct sillyrename *)0;
        bcopy((caddr_t)fhp, (caddr_t)&np->n_fh, NFSX_FH);
        np->n_attrstamp = 0;
        np->n_sillyrename = (struct sillyrename *)0;
@@ -157,9 +158,8 @@ nfs_inactive(vp)
        extern int prtactive;
 
        np = VTONFS(vp);
        extern int prtactive;
 
        np = VTONFS(vp);
-       if (prtactive && vp->v_count != 0)
-               printf("nfs_inactive: pushing active fileid %d fsid 0x%x\n",
-                       np->n_vattr.va_fileid, np->n_vattr.va_fsid);
+       if (prtactive && vp->v_usecount != 0)
+               vprint("nfs_inactive: pushing active", vp);
        nfs_lock(vp);
        sp = np->n_sillyrename;
        np->n_sillyrename = (struct sillyrename *)0;
        nfs_lock(vp);
        sp = np->n_sillyrename;
        np->n_sillyrename = (struct sillyrename *)0;
@@ -211,16 +211,17 @@ nfs_reclaim(vp)
        extern int prtactive;
 
        /*
        extern int prtactive;
 
        /*
-        * Flush out any associated bio buffers that might be lying about
+        * Flush out any bio buffer or cmap references
         */
         */
-       if (vp->v_type == VREG && (np->n_flag & NBUFFERED)) {
-               nfs_lock(np);
-               nfs_blkflush(vp, (daddr_t)0, np->n_size, TRUE);
-               nfs_unlock(np);
+       if (vp->v_type == VREG) {
+               nfs_lock(vp);
+               vinvalbuf(vp, TRUE);
+               nfs_unlock(vp);
+               if (np->n_flag & NPAGEDON)
+                       mpurge(vp);
        }
        }
-       if (prtactive && vp->v_count != 0)
-               printf("nfs_reclaim: pushing active fileid %d fsid 0x%x\n",
-                       np->n_vattr.va_fileid, np->n_vattr.va_fsid);
+       if (prtactive && vp->v_usecount != 0)
+               vprint("nfs_reclaim: pushing active", vp);
        /*
         * Remove the nfsnode from its hash chain.
         */
        /*
         * Remove the nfsnode from its hash chain.
         */
@@ -228,6 +229,7 @@ nfs_reclaim(vp)
        np->n_forw = np;
        np->n_back = np;
        cache_purge(vp);
        np->n_forw = np;
        np->n_back = np;
        cache_purge(vp);
+       np->n_flag = 0;
        return (0);
 }
 
        return (0);
 }
 
@@ -241,8 +243,14 @@ nfs_lock(vp)
 
        while (np->n_flag & NLOCKED) {
                np->n_flag |= NWANT;
 
        while (np->n_flag & NLOCKED) {
                np->n_flag |= NWANT;
-               sleep((caddr_t)np, PINOD);
+               if (np->n_lockholder == u.u_procp->p_pid)
+                       panic("locking against myself");
+               np->n_lockwaiter = u.u_procp->p_pid;
+               (void) sleep((caddr_t)np, PINOD);
        }
        }
+       np->n_lockwaiter = 0;
+       np->n_lockholder = u.u_procp->p_pid;
+       u.u_spare[0]++;
        np->n_flag |= NLOCKED;
 }
 
        np->n_flag |= NLOCKED;
 }
 
@@ -254,6 +262,10 @@ nfs_unlock(vp)
 {
        register struct nfsnode *np = VTONFS(vp);
 
 {
        register struct nfsnode *np = VTONFS(vp);
 
+       if ((np->n_flag & NLOCKED) == 0)
+               vprint("nfs_unlock: unlocked nfsnode", vp);
+       np->n_lockholder = 0;
+       u.u_spare[0]--;
        np->n_flag &= ~NLOCKED;
        if (np->n_flag & NWANT) {
                np->n_flag &= ~NWANT;
        np->n_flag &= ~NLOCKED;
        if (np->n_flag & NWANT) {
                np->n_flag &= ~NWANT;
@@ -261,6 +273,18 @@ nfs_unlock(vp)
        }
 }
 
        }
 }
 
+/*
+ * Check for a locked nfsnode
+ */
+nfs_islocked(vp)
+       struct vnode *vp;
+{
+
+       if (VTONFS(vp)->n_flag & NLOCKED)
+               return (1);
+       return (0);
+}
+
 /*
  * Unlock and vrele()
  * since I can't decide if dirs. should be locked, I will check for
 /*
  * Unlock and vrele()
  * since I can't decide if dirs. should be locked, I will check for