-
-/*
- * Name cache initialization, from main() when we are booting
- */
-nchinit()
-{
- register union nchash *nchp;
- register struct nch *ncp;
-
- nchhead = 0;
- nchtail = &nchhead;
-
- for (ncp = nch; ncp < &nch[nchsize]; ncp++) {
- ncp->nc_forw = ncp; /* hash chain */
- ncp->nc_back = ncp;
-
- ncp->nc_nxt = NULL; /* lru chain */
- *nchtail = ncp;
- ncp->nc_prev = nchtail;
- nchtail = &ncp->nc_nxt;
-
- /* all else is zero already */
- }
-
- for (nchp = nchash; nchp < &nchash[NCHHASH]; nchp++) {
- nchp->nch_head[0] = nchp;
- nchp->nch_head[1] = nchp;
- }
-}
-
-/*
- * Cache flush, called when filesys is umounted to
- * remove entries that would now be invalid
- *
- * The line "nxtcp = nchhead" near the end is to avoid potential problems
- * if the cache lru chain is modified while we are dumping the
- * inode. This makes the algorithm O(n^2), but do you think I care?
- */
-nchinval(dev)
- register dev_t dev;
-{
- register struct nch *ncp, *nxtcp;
-
- for (ncp = nchhead; ncp; ncp = nxtcp) {
- nxtcp = ncp->nc_nxt;
-
- if (ncp->nc_ip == NULL ||
- (ncp->nc_idev != dev && ncp->nc_dev != dev))
- continue;
-
- ncp->nc_idev = NODEV;
- ncp->nc_dev = NODEV;
- ncp->nc_ino = 0;
-
- /* remove the entry from its hash chain */
- remque(ncp);
- /* and make a dummy one */
- ncp->nc_forw = ncp;
- ncp->nc_back = ncp;
-
- /* delete this entry from LRU chain */
- *ncp->nc_prev = nxtcp;
- if (nxtcp)
- nxtcp->nc_prev = ncp->nc_prev;
- else
- nchtail = ncp->nc_prev;
-
- /* free the inode we had */
- irele(ncp->nc_ip);
- ncp->nc_ip = NULL;
-
- /* cause rescan of list, it may have altered */
- nxtcp = nchhead;
- /* put the now-free entry at head of LRU */
- ncp->nc_nxt = nxtcp;
- ncp->nc_prev = &nchhead;
- nxtcp->nc_prev = &ncp->nc_nxt;
- nchhead = ncp;
- }
-}