10 #define HIOB (NIOBUF/3)
12 static Iobuf* hiob[HIOB]; /* hash buckets */
13 static Iobuf iobuf[NIOBUF]; /* buffer headers */
18 getbuf(Xfs *dev, long addr)
20 Iobuf *p, *h, **l, **f;
23 for(p = *l; p; p = p->hash) {
24 if(p->addr == addr && p->dev == dev) {
29 /* Find a non-busy buffer from the tail */
30 for(p = iotail; p && (p->busy > 0); p = p->prev)
33 panic("all buffers busy");
39 if( xread(dev, p, addr) < 0)
41 /* Delete from hash chain */
42 f = &hiob[p->addr%HIOB];
46 for(h = *f; h ; h = h->hash)
68 /* Link onto head for lru */
75 p->prev->next = p->next;
76 p->next->prev = p->prev;
96 for(p=&iobuf[0] ; p<&iobuf[NIOBUF]; p++)
107 for(p=&iobuf[0]; p<&iobuf[NIOBUF]; p++)
111 /* Blow hash chains */
112 memset(hiob, 0, sizeof(hiob));
120 iotail = iobuf+NIOBUF-1;
122 for(p = iobuf; p <= iotail; p++) {
126 p->iobuf = (char *)malloc(EXT2_MAX_BLOCK_SIZE);
135 xread(Xfs *dev, Iobuf *p, long addr)
137 /*chat("xread %d,%d...", dev->dev, addr);*/
139 seek(dev->dev, (vlong)addr*dev->block_size, 0);
140 if(read(dev->dev, p->iobuf, dev->block_size) != dev->block_size){
141 chat("xread %d, block=%d failed ...", dev->dev, addr);
145 /*chat("xread ok...");*/
156 /*chat("xwrite %d,%d...", dev->dev, addr);*/
158 seek(dev->dev, (vlong)addr*dev->block_size, 0);
159 if(write(dev->dev, p->iobuf, dev->block_size) != dev->block_size){
160 chat("xwrite %d, block=%d failed ...", dev->dev, addr);
164 /*chat("xwrite ok...");*/
171 for(p = iotail; p ; p = p->prev)
173 mchat("\nHi ERROR buf(%x, %d, %d)\n", p, p->addr, p->busy);