4 getdir(Iobuf *p, int slot)
10 d = (Dentry*)p->iobuf + slot%DIRPERBUF;
15 accessdir(Iobuf *p, Dentry *d, int f)
19 if(p && !isro(p->dev)) {
20 if(!(f & (FWRITE|FWSTAT)) && noatime)
23 if(f & (FREAD|FWRITE|FWSTAT)){
36 dbufread(Iobuf *p, Dentry *d, long a)
42 rel2abs(Iobuf *p, Dentry *d, long a, int tag, int putb)
48 print("dnodebuf: neg\n");
56 addr = balloc(dev, tag, qpath);
58 p->flags |= Bmod|Bimm;
68 addr = balloc(dev, Tind1, qpath);
70 p->flags |= Bmod|Bimm;
74 addr = indfetch(p, d, addr, a, Tind1, tag);
81 addr = balloc(dev, Tind2, qpath);
83 p->flags |= Bmod|Bimm;
87 addr = indfetch(p, d, addr, a/INDPERBUF, Tind2, Tind1);
88 addr = indfetch(p, d, addr, a%INDPERBUF, Tind1, tag);
93 print("dnodebuf: trip indirect\n");
98 dnodebuf(Iobuf *p, Dentry *d, long a, int tag)
102 addr = rel2abs(p, d, a, tag, 0);
104 return getbuf(p->dev, addr, Bread);
109 * same as dnodebuf but it calls putpuf(p)
110 * to reduce interference.
113 dnodebuf1(Iobuf *p, Dentry *d, long a, int tag)
119 addr = rel2abs(p, d, a, tag, 1);
121 return getbuf(dev, addr, Bread);
127 indfetch(Iobuf *p, Dentry *d, long addr, long a, int itag, int tag)
133 bp = getbuf(p->dev, addr, Bread);
134 if(!bp || checktag(bp, itag, d->qid.path)) {
136 print("ind fetch bp = 0\n");
139 print("ind fetch tag\n");
143 addr = ((long*)bp->iobuf)[a];
145 addr = balloc(p->dev, tag, d->qid.path);
147 ((long*)bp->iobuf)[a] = addr;
149 if(localfs || tag == Tdir)
151 settag(bp, itag, d->qid.path);
159 dtrunc(Iobuf *p, Dentry *d)
163 bfree(p->dev, d->diblock, 2);
165 bfree(p->dev, d->iblock, 1);
167 for(i=NDBLOCK-1; i>=0; i--) {
168 bfree(p->dev, d->dblock[i], 0);
172 p->flags |= Bmod|Bimm;
173 accessdir(p, d, FWRITE);