+cacheino(dp, inumber)
+ register struct dinode *dp;
+ ino_t inumber;
+{
+ register struct inoinfo *inp;
+ struct inoinfo **inpp;
+ unsigned int blks;
+
+ if (inphead == NULL) {
+ hashsize = sblock.fs_cstotal.cs_ndir;
+ inphead = (struct inoinfo **)malloc(hashsize * sizeof(daddr_t));
+ if (inphead == NULL)
+ return;
+ bzero((char *)inphead, hashsize * sizeof(daddr_t));
+ }
+ blks = howmany(dp->di_size, sblock.fs_bsize);
+ if (blks > NDADDR)
+ blks = NDADDR + NIADDR;
+ inp = (struct inoinfo *)
+ malloc(sizeof(*inp) + (blks - 1) * sizeof(daddr_t));
+ if (inp == NULL)
+ return;
+ inpp = &inphead[inumber % hashsize];
+ inp->i_next = *inpp;
+ *inpp = inp;
+ inp->i_number = inumber;
+ inp->i_size = dp->di_size;
+ inp->i_numblks = blks * sizeof(daddr_t);
+ bcopy((char *)&dp->di_db[0], (char *)&inp->i_blks[0], inp->i_numblks);
+}
+
+struct dinode *
+getcacheino(inumber)
+ ino_t inumber;
+{
+ register struct inoinfo *inp;
+ static struct dinode dino;
+ register struct dinode *dp = &dino;
+
+ for (inp = inphead[inumber % hashsize]; inp; inp = inp->i_next) {
+ if (inp->i_number != inumber)
+ continue;
+ dp->di_size = inp->i_size;
+ bcopy((char *)&inp->i_blks[0], (char *)&dp->di_db[0],
+ inp->i_numblks);
+ return (dp);
+ }
+ return (ginode(inumber));
+}
+
+inocleanup()
+{
+ register struct inoinfo *inp, **inpp;
+ struct inoinfo *inpnext;
+
+ if (inphead == NULL)
+ return;
+ for (inpp = &inphead[hashsize - 1]; inpp >= inphead; inpp--) {
+ for (inp = *inpp; inp; inp = inpnext) {
+ inpnext = inp->i_next;
+ free(inp);
+ }
+ }
+ free(inphead);
+ inphead = NULL;
+}
+