xref: /plan9/sys/src/cmd/disk/kfs/dentry.c (revision 229d2d344532463b8438213e6bf550fed5babd4a)
13e12c5d1SDavid du Colombier #include	"all.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier Dentry*
getdir(Iobuf * p,int slot)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
accessdir(Iobuf * p,Dentry * d,int f)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)) {
20*229d2d34SDavid du Colombier 		if(!(f & (FWRITE|FWSTAT)) && noatime)
219a747e4fSDavid du Colombier 			return;
227dd7cddfSDavid du Colombier 		t = time(nil);
23*229d2d34SDavid du Colombier 		if(f & (FREAD|FWRITE|FWSTAT)){
243e12c5d1SDavid du Colombier 			d->atime = t;
259a747e4fSDavid du Colombier 			p->flags |= Bmod;
269a747e4fSDavid du Colombier 		}
273e12c5d1SDavid du Colombier 		if(f & FWRITE) {
283e12c5d1SDavid du Colombier 			d->mtime = t;
299a747e4fSDavid du Colombier 			d->qid.version++;
309a747e4fSDavid du Colombier 			p->flags |= Bmod;
313e12c5d1SDavid du Colombier 		}
323e12c5d1SDavid du Colombier 	}
333e12c5d1SDavid du Colombier }
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier void
dbufread(Iobuf * p,Dentry * d,long a)363e12c5d1SDavid du Colombier dbufread(Iobuf *p, Dentry *d, long a)
373e12c5d1SDavid du Colombier {
383e12c5d1SDavid du Colombier 	USED(p, d, a);
393e12c5d1SDavid du Colombier }
403e12c5d1SDavid du Colombier 
419a747e4fSDavid du Colombier long
rel2abs(Iobuf * p,Dentry * d,long a,int tag,int putb)429a747e4fSDavid du Colombier rel2abs(Iobuf *p, Dentry *d, long a, int tag, int putb)
433e12c5d1SDavid du Colombier {
449a747e4fSDavid du Colombier 	long addr, qpath;
459a747e4fSDavid du Colombier 	Device dev;
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier 	if(a < 0) {
483e12c5d1SDavid du Colombier 		print("dnodebuf: neg\n");
493e12c5d1SDavid du Colombier 		return 0;
503e12c5d1SDavid du Colombier 	}
519a747e4fSDavid du Colombier 	qpath = d->qid.path;
529a747e4fSDavid du Colombier 	dev = p->dev;
533e12c5d1SDavid du Colombier 	if(a < NDBLOCK) {
543e12c5d1SDavid du Colombier 		addr = d->dblock[a];
559a747e4fSDavid du Colombier 		if(!addr && tag) {
569a747e4fSDavid du Colombier 			addr = balloc(dev, tag, qpath);
573e12c5d1SDavid du Colombier 			d->dblock[a] = addr;
583e12c5d1SDavid du Colombier 			p->flags |= Bmod|Bimm;
593e12c5d1SDavid du Colombier 		}
609a747e4fSDavid du Colombier 		if(putb)
619a747e4fSDavid du Colombier 			putbuf(p);
629a747e4fSDavid du Colombier 		return addr;
633e12c5d1SDavid du Colombier 	}
643e12c5d1SDavid du Colombier 	a -= NDBLOCK;
653e12c5d1SDavid du Colombier 	if(a < INDPERBUF) {
663e12c5d1SDavid du Colombier 		addr = d->iblock;
673e12c5d1SDavid du Colombier 		if(!addr && tag) {
689a747e4fSDavid du Colombier 			addr = balloc(dev, Tind1, qpath);
693e12c5d1SDavid du Colombier 			d->iblock = addr;
703e12c5d1SDavid du Colombier 			p->flags |= Bmod|Bimm;
713e12c5d1SDavid du Colombier 		}
729a747e4fSDavid du Colombier 		if(putb)
739a747e4fSDavid du Colombier 			putbuf(p);
743e12c5d1SDavid du Colombier 		addr = indfetch(p, d, addr, a, Tind1, tag);
759a747e4fSDavid du Colombier 		return addr;
763e12c5d1SDavid du Colombier 	}
773e12c5d1SDavid du Colombier 	a -= INDPERBUF;
783e12c5d1SDavid du Colombier 	if(a < INDPERBUF2) {
793e12c5d1SDavid du Colombier 		addr = d->diblock;
803e12c5d1SDavid du Colombier 		if(!addr && tag) {
819a747e4fSDavid du Colombier 			addr = balloc(dev, Tind2, qpath);
823e12c5d1SDavid du Colombier 			d->diblock = addr;
833e12c5d1SDavid du Colombier 			p->flags |= Bmod|Bimm;
843e12c5d1SDavid du Colombier 		}
859a747e4fSDavid du Colombier 		if(putb)
869a747e4fSDavid du Colombier 			putbuf(p);
873e12c5d1SDavid du Colombier 		addr = indfetch(p, d, addr, a/INDPERBUF, Tind2, Tind1);
883e12c5d1SDavid du Colombier 		addr = indfetch(p, d, addr, a%INDPERBUF, Tind1, tag);
899a747e4fSDavid du Colombier 		return addr;
903e12c5d1SDavid du Colombier 	}
919a747e4fSDavid du Colombier 	if(putb)
929a747e4fSDavid du Colombier 		putbuf(p);
933e12c5d1SDavid du Colombier 	print("dnodebuf: trip indirect\n");
943e12c5d1SDavid du Colombier 	return 0;
953e12c5d1SDavid du Colombier }
963e12c5d1SDavid du Colombier 
979a747e4fSDavid du Colombier Iobuf*
dnodebuf(Iobuf * p,Dentry * d,long a,int tag)989a747e4fSDavid du Colombier dnodebuf(Iobuf *p, Dentry *d, long a, int tag)
999a747e4fSDavid du Colombier {
1009a747e4fSDavid du Colombier 	long addr;
1019a747e4fSDavid du Colombier 
1029a747e4fSDavid du Colombier 	addr = rel2abs(p, d, a, tag, 0);
1039a747e4fSDavid du Colombier 	if(addr)
1049a747e4fSDavid du Colombier 		return getbuf(p->dev, addr, Bread);
1059a747e4fSDavid du Colombier 	return 0;
1069a747e4fSDavid du Colombier }
1079a747e4fSDavid du Colombier 
1089a747e4fSDavid du Colombier /*
1099a747e4fSDavid du Colombier  * same as dnodebuf but it calls putpuf(p)
1109a747e4fSDavid du Colombier  * to reduce interference.
1119a747e4fSDavid du Colombier  */
1129a747e4fSDavid du Colombier Iobuf*
dnodebuf1(Iobuf * p,Dentry * d,long a,int tag)1139a747e4fSDavid du Colombier dnodebuf1(Iobuf *p, Dentry *d, long a, int tag)
1149a747e4fSDavid du Colombier {
1159a747e4fSDavid du Colombier 	long addr;
1169a747e4fSDavid du Colombier 	Device dev;
1179a747e4fSDavid du Colombier 
1189a747e4fSDavid du Colombier 	dev = p->dev;
1199a747e4fSDavid du Colombier 	addr = rel2abs(p, d, a, tag, 1);
1209a747e4fSDavid du Colombier 	if(addr)
1219a747e4fSDavid du Colombier 		return getbuf(dev, addr, Bread);
1229a747e4fSDavid du Colombier 	return 0;
1239a747e4fSDavid du Colombier 
1249a747e4fSDavid du Colombier }
1259a747e4fSDavid du Colombier 
1263e12c5d1SDavid du Colombier long
indfetch(Iobuf * p,Dentry * d,long addr,long a,int itag,int tag)1273e12c5d1SDavid du Colombier indfetch(Iobuf *p, Dentry *d, long addr, long a, int itag, int tag)
1283e12c5d1SDavid du Colombier {
1293e12c5d1SDavid du Colombier 	Iobuf *bp;
1303e12c5d1SDavid du Colombier 
1313e12c5d1SDavid du Colombier 	if(!addr)
1323e12c5d1SDavid du Colombier 		return 0;
1333e12c5d1SDavid du Colombier 	bp = getbuf(p->dev, addr, Bread);
1343e12c5d1SDavid du Colombier 	if(!bp || checktag(bp, itag, d->qid.path)) {
1353e12c5d1SDavid du Colombier 		if(!bp) {
1363e12c5d1SDavid du Colombier 			print("ind fetch bp = 0\n");
1373e12c5d1SDavid du Colombier 			return 0;
1383e12c5d1SDavid du Colombier 		}
1393e12c5d1SDavid du Colombier 		print("ind fetch tag\n");
1403e12c5d1SDavid du Colombier 		putbuf(bp);
1413e12c5d1SDavid du Colombier 		return 0;
1423e12c5d1SDavid du Colombier 	}
1433e12c5d1SDavid du Colombier 	addr = ((long*)bp->iobuf)[a];
1443e12c5d1SDavid du Colombier 	if(!addr && tag) {
1453e12c5d1SDavid du Colombier 		addr = balloc(p->dev, tag, d->qid.path);
1463e12c5d1SDavid du Colombier 		if(addr) {
1473e12c5d1SDavid du Colombier 			((long*)bp->iobuf)[a] = addr;
148219b2ee8SDavid du Colombier 			bp->flags |= Bmod;
1493e12c5d1SDavid du Colombier 			if(localfs || tag == Tdir)
1503e12c5d1SDavid du Colombier 				bp->flags |= Bimm;
1513e12c5d1SDavid du Colombier 			settag(bp, itag, d->qid.path);
1523e12c5d1SDavid du Colombier 		}
1533e12c5d1SDavid du Colombier 	}
1543e12c5d1SDavid du Colombier 	putbuf(bp);
1553e12c5d1SDavid du Colombier 	return addr;
1563e12c5d1SDavid du Colombier }
1573e12c5d1SDavid du Colombier 
1583e12c5d1SDavid du Colombier void
dtrunc(Iobuf * p,Dentry * d)1593e12c5d1SDavid du Colombier dtrunc(Iobuf *p, Dentry *d)
1603e12c5d1SDavid du Colombier {
1613e12c5d1SDavid du Colombier 	int i;
1623e12c5d1SDavid du Colombier 
1633e12c5d1SDavid du Colombier 	bfree(p->dev, d->diblock, 2);
1643e12c5d1SDavid du Colombier 	d->diblock = 0;
1653e12c5d1SDavid du Colombier 	bfree(p->dev, d->iblock, 1);
1663e12c5d1SDavid du Colombier 	d->iblock = 0;
1673e12c5d1SDavid du Colombier 	for(i=NDBLOCK-1; i>=0; i--) {
1683e12c5d1SDavid du Colombier 		bfree(p->dev, d->dblock[i], 0);
1693e12c5d1SDavid du Colombier 		d->dblock[i] = 0;
1703e12c5d1SDavid du Colombier 	}
1713e12c5d1SDavid du Colombier 	d->size = 0;
1723e12c5d1SDavid du Colombier 	p->flags |= Bmod|Bimm;
1733e12c5d1SDavid du Colombier 	accessdir(p, d, FWRITE);
1743e12c5d1SDavid du Colombier }
175