add support for kernel profiling; add sysctl_struct; eliminate trailing blanks
[unix-history] / usr / src / sys / kern / vfs_cache.c
index 9a18752..1e989e9 100644 (file)
@@ -4,17 +4,17 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)vfs_cache.c 7.13 (Berkeley) %G%
+ *     @(#)vfs_cache.c 7.16 (Berkeley) %G%
  */
 
  */
 
-#include "param.h"
-#include "systm.h"
-#include "time.h"
-#include "mount.h"
-#include "vnode.h"
-#include "namei.h"
-#include "errno.h"
-#include "malloc.h"
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/time.h>
+#include <sys/mount.h>
+#include <sys/vnode.h>
+#include <sys/namei.h>
+#include <sys/errno.h>
+#include <sys/malloc.h>
 
 /*
  * Name caching works as follows:
 
 /*
  * Name caching works as follows:
@@ -147,10 +147,13 @@ cache_lookup(dvp, vpp, cnp)
        ncp->nc_forw = NULL;
        ncp->nc_back = NULL;
        /* insert at head of LRU list (first to grab) */
        ncp->nc_forw = NULL;
        ncp->nc_back = NULL;
        /* insert at head of LRU list (first to grab) */
-       ncp->nc_nxt = nchhead;
-       ncp->nc_prev = &nchhead;
-       nchhead->nc_prev = &ncp->nc_nxt;
+       if (ncq = nchhead)
+               ncq->nc_prev = &ncp->nc_nxt;
+       else
+               nchtail = &ncp->nc_nxt;
        nchhead = ncp;
        nchhead = ncp;
+       ncp->nc_nxt = ncq;
+       ncp->nc_prev = &nchhead;
        return (0);
 }
 
        return (0);
 }
 
@@ -185,10 +188,14 @@ cache_enter(dvp, vp, cnp)
                else
                        nchtail = ncp->nc_prev;
                *ncp->nc_prev = ncq;
                else
                        nchtail = ncp->nc_prev;
                *ncp->nc_prev = ncq;
-               /* remove from old hash chain */
-               if (ncq = ncp->nc_forw)
-                       ncq->nc_back = ncp->nc_back;
-               *ncp->nc_back = ncq;
+               /* remove from old hash chain, if on one */
+               if (ncp->nc_back) {
+                       if (ncq = ncp->nc_forw)
+                               ncq->nc_back = ncp->nc_back;
+                       *ncp->nc_back = ncq;
+                       ncp->nc_forw = NULL;
+                       ncp->nc_back = NULL;
+               }
        } else
                return;
        /* grab the vnode we just found */
        } else
                return;
        /* grab the vnode we just found */
@@ -268,12 +275,14 @@ cache_purgevfs(mp)
                /* free the resources we had */
                ncp->nc_vp = NULL;
                ncp->nc_dvp = NULL;
                /* free the resources we had */
                ncp->nc_vp = NULL;
                ncp->nc_dvp = NULL;
-               /* remove entry from its hash chain */
-               if (nxtcp = ncp->nc_forw)
-                       nxtcp->nc_back = ncp->nc_back;
-               *ncp->nc_back = nxtcp;
-               ncp->nc_forw = NULL;
-               ncp->nc_back = NULL;
+               /* remove from old hash chain, if on one */
+               if (ncp->nc_back) {
+                       if (nxtcp = ncp->nc_forw)
+                               nxtcp->nc_back = ncp->nc_back;
+                       *ncp->nc_back = nxtcp;
+                       ncp->nc_forw = NULL;
+                       ncp->nc_back = NULL;
+               }
                /* delete this entry from LRU chain */
                if (nxtcp = ncp->nc_nxt)
                        nxtcp->nc_prev = ncp->nc_prev;
                /* delete this entry from LRU chain */
                if (nxtcp = ncp->nc_nxt)
                        nxtcp->nc_prev = ncp->nc_prev;
@@ -281,11 +290,13 @@ cache_purgevfs(mp)
                        nchtail = ncp->nc_prev;
                *ncp->nc_prev = nxtcp;
                /* cause rescan of list, it may have altered */
                        nchtail = ncp->nc_prev;
                *ncp->nc_prev = nxtcp;
                /* cause rescan of list, it may have altered */
-               nxtcp = nchhead;
-               /* put the now-free entry at head of LRU */
+               /* also put the now-free entry at head of LRU */
+               if (nxtcp = nchhead)
+                       nxtcp->nc_prev = &ncp->nc_nxt;
+               else
+                       nchtail = &ncp->nc_nxt;
+               nchhead = ncp;
                ncp->nc_nxt = nxtcp;
                ncp->nc_prev = &nchhead;
                ncp->nc_nxt = nxtcp;
                ncp->nc_prev = &nchhead;
-               nxtcp->nc_prev = &ncp->nc_nxt;
-               nchhead = ncp;
        }
 }
        }
 }