xref: /plan9-contrib/sys/src/cmd/disk/kfs/dentry.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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