13e12c5d1SDavid du Colombier #include "all.h" 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier Dentry* 43e12c5d1SDavid du Colombier getdir(Iobuf *p, int slot) 53e12c5d1SDavid du Colombier { 63e12c5d1SDavid du Colombier Dentry *d; 73e12c5d1SDavid du Colombier 83e12c5d1SDavid du Colombier if(!p) 93e12c5d1SDavid du Colombier return 0; 103e12c5d1SDavid du Colombier d = (Dentry*)p->iobuf + slot%DIRPERBUF; 113e12c5d1SDavid du Colombier return d; 123e12c5d1SDavid du Colombier } 133e12c5d1SDavid du Colombier 143e12c5d1SDavid du Colombier void 153e12c5d1SDavid du Colombier accessdir(Iobuf *p, Dentry *d, int f) 163e12c5d1SDavid du Colombier { 173e12c5d1SDavid du Colombier long t; 183e12c5d1SDavid du Colombier 193e12c5d1SDavid du Colombier if(p && !isro(p->dev)) { 203e12c5d1SDavid du Colombier p->flags |= Bmod; 213e12c5d1SDavid du Colombier t = time(); 223e12c5d1SDavid du Colombier if(f & (FREAD|FWRITE)) 233e12c5d1SDavid du Colombier d->atime = t; 243e12c5d1SDavid du Colombier if(f & FWRITE) { 253e12c5d1SDavid du Colombier d->mtime = t; 263e12c5d1SDavid du Colombier d->qid.version++; 273e12c5d1SDavid du Colombier } 283e12c5d1SDavid du Colombier } 293e12c5d1SDavid du Colombier } 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier void 323e12c5d1SDavid du Colombier dbufread(Iobuf *p, Dentry *d, long a) 333e12c5d1SDavid du Colombier { 343e12c5d1SDavid du Colombier USED(p, d, a); 353e12c5d1SDavid du Colombier } 363e12c5d1SDavid du Colombier 373e12c5d1SDavid du Colombier Iobuf* 383e12c5d1SDavid du Colombier dnodebuf(Iobuf *p, Dentry *d, long a, int tag) 393e12c5d1SDavid du Colombier { 403e12c5d1SDavid du Colombier Iobuf *bp; 413e12c5d1SDavid du Colombier long addr; 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier if(a < 0) { 443e12c5d1SDavid du Colombier print("dnodebuf: neg\n"); 453e12c5d1SDavid du Colombier return 0; 463e12c5d1SDavid du Colombier } 473e12c5d1SDavid du Colombier bp = 0; 483e12c5d1SDavid du Colombier if(a < NDBLOCK) { 493e12c5d1SDavid du Colombier addr = d->dblock[a]; 503e12c5d1SDavid du Colombier if(addr) 513e12c5d1SDavid du Colombier return getbuf(p->dev, addr, Bread); 523e12c5d1SDavid du Colombier if(tag) { 533e12c5d1SDavid du Colombier addr = balloc(p->dev, tag, d->qid.path); 543e12c5d1SDavid du Colombier if(addr) { 553e12c5d1SDavid du Colombier d->dblock[a] = addr; 563e12c5d1SDavid du Colombier p->flags |= Bmod|Bimm; 573e12c5d1SDavid du Colombier bp = getbuf(p->dev, addr, Bmod); 583e12c5d1SDavid du Colombier } 593e12c5d1SDavid du Colombier } 603e12c5d1SDavid du Colombier return bp; 613e12c5d1SDavid du Colombier } 623e12c5d1SDavid du Colombier a -= NDBLOCK; 633e12c5d1SDavid du Colombier if(a < INDPERBUF) { 643e12c5d1SDavid du Colombier addr = d->iblock; 653e12c5d1SDavid du Colombier if(!addr && tag) { 663e12c5d1SDavid du Colombier addr = balloc(p->dev, Tind1, d->qid.path); 673e12c5d1SDavid du Colombier d->iblock = addr; 683e12c5d1SDavid du Colombier p->flags |= Bmod|Bimm; 693e12c5d1SDavid du Colombier } 703e12c5d1SDavid du Colombier addr = indfetch(p, d, addr, a, Tind1, tag); 713e12c5d1SDavid du Colombier if(addr) 723e12c5d1SDavid du Colombier bp = getbuf(p->dev, addr, Bread); 733e12c5d1SDavid du Colombier return bp; 743e12c5d1SDavid du Colombier } 753e12c5d1SDavid du Colombier a -= INDPERBUF; 763e12c5d1SDavid du Colombier if(a < INDPERBUF2) { 773e12c5d1SDavid du Colombier addr = d->diblock; 783e12c5d1SDavid du Colombier if(!addr && tag) { 793e12c5d1SDavid du Colombier addr = balloc(p->dev, Tind2, d->qid.path); 803e12c5d1SDavid du Colombier d->diblock = addr; 813e12c5d1SDavid du Colombier p->flags |= Bmod|Bimm; 823e12c5d1SDavid du Colombier } 833e12c5d1SDavid du Colombier addr = indfetch(p, d, addr, a/INDPERBUF, Tind2, Tind1); 843e12c5d1SDavid du Colombier addr = indfetch(p, d, addr, a%INDPERBUF, Tind1, tag); 853e12c5d1SDavid du Colombier if(addr) 863e12c5d1SDavid du Colombier bp = getbuf(p->dev, addr, Bread); 873e12c5d1SDavid du Colombier return bp; 883e12c5d1SDavid du Colombier } 893e12c5d1SDavid du Colombier print("dnodebuf: trip indirect\n"); 903e12c5d1SDavid du Colombier return 0; 913e12c5d1SDavid du Colombier } 923e12c5d1SDavid du Colombier 933e12c5d1SDavid du Colombier long 943e12c5d1SDavid du Colombier indfetch(Iobuf *p, Dentry *d, long addr, long a, int itag, int tag) 953e12c5d1SDavid du Colombier { 963e12c5d1SDavid du Colombier Iobuf *bp; 973e12c5d1SDavid du Colombier 983e12c5d1SDavid du Colombier if(!addr) 993e12c5d1SDavid du Colombier return 0; 1003e12c5d1SDavid du Colombier bp = getbuf(p->dev, addr, Bread); 1013e12c5d1SDavid du Colombier if(!bp || checktag(bp, itag, d->qid.path)) { 1023e12c5d1SDavid du Colombier if(!bp) { 1033e12c5d1SDavid du Colombier print("ind fetch bp = 0\n"); 1043e12c5d1SDavid du Colombier return 0; 1053e12c5d1SDavid du Colombier } 1063e12c5d1SDavid du Colombier print("ind fetch tag\n"); 1073e12c5d1SDavid du Colombier putbuf(bp); 1083e12c5d1SDavid du Colombier return 0; 1093e12c5d1SDavid du Colombier } 1103e12c5d1SDavid du Colombier addr = ((long*)bp->iobuf)[a]; 1113e12c5d1SDavid du Colombier if(!addr && tag) { 1123e12c5d1SDavid du Colombier addr = balloc(p->dev, tag, d->qid.path); 1133e12c5d1SDavid du Colombier if(addr) { 1143e12c5d1SDavid du Colombier ((long*)bp->iobuf)[a] = addr; 115*219b2ee8SDavid du Colombier bp->flags |= Bmod; 1163e12c5d1SDavid du Colombier if(localfs || tag == Tdir) 1173e12c5d1SDavid du Colombier bp->flags |= Bimm; 1183e12c5d1SDavid du Colombier settag(bp, itag, d->qid.path); 1193e12c5d1SDavid du Colombier } 1203e12c5d1SDavid du Colombier } 1213e12c5d1SDavid du Colombier putbuf(bp); 1223e12c5d1SDavid du Colombier return addr; 1233e12c5d1SDavid du Colombier } 1243e12c5d1SDavid du Colombier 1253e12c5d1SDavid du Colombier void 1263e12c5d1SDavid du Colombier dtrunc(Iobuf *p, Dentry *d) 1273e12c5d1SDavid du Colombier { 1283e12c5d1SDavid du Colombier int i; 1293e12c5d1SDavid du Colombier 1303e12c5d1SDavid du Colombier bfree(p->dev, d->diblock, 2); 1313e12c5d1SDavid du Colombier d->diblock = 0; 1323e12c5d1SDavid du Colombier bfree(p->dev, d->iblock, 1); 1333e12c5d1SDavid du Colombier d->iblock = 0; 1343e12c5d1SDavid du Colombier for(i=NDBLOCK-1; i>=0; i--) { 1353e12c5d1SDavid du Colombier bfree(p->dev, d->dblock[i], 0); 1363e12c5d1SDavid du Colombier d->dblock[i] = 0; 1373e12c5d1SDavid du Colombier } 1383e12c5d1SDavid du Colombier d->size = 0; 1393e12c5d1SDavid du Colombier p->flags |= Bmod|Bimm; 1403e12c5d1SDavid du Colombier accessdir(p, d, FWRITE); 1413e12c5d1SDavid du Colombier } 142