plan 9 kernel history: overview | file list | diff list

1996/0218/port/devtinyfs.c (diff list | history)

1996/0217/sys/src/9/port/devtinyfs.c:150,1561996/0218/sys/src/9/port/devtinyfs.c:150,156 (short | long | prev | next)
1996/0201    
 
	if(checksum(p) != 0) 
		return 0; 
	if(buf[0] != Tagdir) 
1996/0218    
	if(p[0] != Tagdir) 
1996/0201    
		return 0; 
	md = (Mdir*)p; 
	x = GETS(md->bno); 
1996/0217/sys/src/9/port/devtinyfs.c:167,1741996/0218/sys/src/9/port/devtinyfs.c:167,174
1996/0201    
 
	if(checksum(p) != 0) 
		return 0; 
	md = (Mdir*)p; 
	switch(buf[0]){ 
1996/0218    
	md = (Mdata*)p; 
	switch(md->type){ 
1996/0201    
	case Tagdata: 
		x = GETS(md->bno); 
		if(x >= fs->nblocks) 
1996/0217/sys/src/9/port/devtinyfs.c:190,2141996/0218/sys/src/9/port/devtinyfs.c:190,236
1996/0206    
static Mdata* 
1996/0217    
readdata(Tfs *fs, ulong bno, uchar *buf, int *lenp) 
1996/0206    
{ 
1996/0217    
	Mdata *md; 
                 
1996/0206    
	if(bno >= fs->nblocks) 
		return 0; 
	n = devtab[fs->c->type].read(fs->c, buf, Blen, Blen*bno); 
	if(n != Blen) 
		return 0; 
1996/0218    
	if(devtab[fs->c->type].read(fs->c, buf, Blen, Blen*bno) != Blen) 
		error(Eio); 
1996/0217    
	return validdata(fs, buf, lenp); 
1996/0206    
} 
 
1996/0202    
static int 
1996/0218    
static void 
writedata(Tfs *fs, ulong bno, ulong next, uchar *buf, int len, int last) 
{ 
	Mdata md; 
 
	if(bno >= fs->nblocks) 
		error(Eio); 
	if(len > Dlen) 
		len = Dlen; 
	if(len < 0) 
		error(Eio); 
	memset(&md, 0, sizeof(md)); 
	if(last){ 
		md.type = Tagend; 
		PUTS(md.bno, len); 
	} else { 
		md.type = Tagdata; 
		PUTS(md.bno, next); 
	} 
	memmove(md.data, buf, len); 
	md.sum = 0 - checksum((uchar*)&md); 
	 
	if(devtab[fs->c->type].write(fs->c, &md, Blen, Blen*bno) != Blen) 
		error(Eio); 
} 
 
static void 
1996/0202    
writedir(Tfs *fs, Tfile *f) 
{ 
	Mdir *md; 
	int n; 
	uchar buf[Blen]; 
 
	if(f->bno == Notabno) 
		return Blen; 
1996/0218    
		return; 
1996/0202    
 
	md = (Mdir*)buf; 
	memset(buf, 0, Blen); 
1996/0217/sys/src/9/port/devtinyfs.c:216,2241996/0218/sys/src/9/port/devtinyfs.c:238,247
1996/0202    
	strncpy(md->name, f->name, sizeof(md->name)-1); 
	PUTS(md->bno, f->dbno); 
	PUTS(md->pin, f->pin); 
	f->sum = 0 - checksum(buf); 
1996/0218    
	md->sum = 0 - checksum(buf); 
1996/0202    
 
	return devtab[fs->c->type].write(fs->c, buf, Blen, Blen*f->bno); 
1996/0218    
	if(devtab[fs->c->type].write(fs->c, buf, Blen, Blen*f->bno) != Blen) 
		error(Eio); 
1996/0202    
} 
 
1996/0201    
static void 
1996/0217/sys/src/9/port/devtinyfs.c:277,2821996/0218/sys/src/9/port/devtinyfs.c:300,306
1996/0202    
	Tfile *f; 
 
	/* find free entry in file table */ 
1996/0218    
	f = 0; 
1996/0202    
	for(;;) { 
		for(i = 0; i < fs->fsize; i++){ 
			f = &fs->f[i]; 
1996/0217/sys/src/9/port/devtinyfs.c:298,3071996/0218/sys/src/9/port/devtinyfs.c:322,331
1996/0202    
 
	/* write directory block */ 
	if(waserror()){ 
		filefree(fs, f, Notabno); 
1996/0218    
		freefile(fs, f, Notabno); 
1996/0202    
		nexterror(); 
	} 
	if(b->bno == Notabno) 
1996/0218    
	if(f->bno == Notabno) 
1996/0202    
		error("out of space"); 
	writedir(fs, f); 
	poperror(); 
1996/0217/sys/src/9/port/devtinyfs.c:317,3321996/0218/sys/src/9/port/devtinyfs.c:341,357
1996/0201    
static void 
fsinit(Tfs *fs) 
1996/0123    
{ 
1996/0131    
	uchar buf[Blen+DIRLEN]; 
1996/0218    
	char dbuf[DIRLEN]; 
1996/0123    
	Dir d; 
1996/0218    
	uchar buf[Blen]; 
1996/0131    
	ulong x, bno; 
1996/0217    
	int n, done; 
1996/0201    
	Tfile *f; 
	Mdir *mdir; 
	Mdata *mdat; 
1996/0218    
	Mdata *mdata; 
1996/0123    
 
	devtab[fs->c->type].stat(fs->c, buf); 
	convM2D(buf, &d); 
1996/0218    
	devtab[fs->c->type].stat(fs->c, dbuf); 
	convM2D(dbuf, &d); 
1996/0131    
	fs->nblocks = d.length/Blen; 
	if(fs->nblocks < 3) 
1996/0123    
		error("tinyfs medium too small"); 
1996/0217/sys/src/9/port/devtinyfs.c:344,3541996/0218/sys/src/9/port/devtinyfs.c:369,379
1996/0131    
		if(n != Blen) 
			break; 
1996/0201    
 
		mdir = validdir(buf); 
1996/0218    
		mdir = validdir(fs, buf); 
1996/0201    
		if(mdir == 0) 
1996/0131    
			continue; 
1996/0201    
 
1996/0217    
		if(fs->nfs >= fs->fsize) 
1996/0218    
		if(fs->nf >= fs->fsize) 
1996/0201    
			expand(fs); 
1996/0202    
 
1996/0201    
		f = &fs->f[fs->nf++]; 
1996/0217/sys/src/9/port/devtinyfs.c:363,3721996/0218/sys/src/9/port/devtinyfs.c:388,397
1996/0201    
 
	/* follow files */ 
1996/0217    
	for(f = fs->f; f < &(fs->f[fs->nf]); f++){ 
1996/0201    
		bno = fs->dbno; 
1996/0218    
		bno = f->dbno; 
1996/0217    
		for(done = 0; !done;) { 
1996/0201    
			if(isalloced(fs, bno)){ 
				freefile(f, bno); 
1996/0218    
				freefile(fs, f, bno); 
1996/0201    
				break; 
			} 
			n = devtab[fs->c->type].read(fs->c, buf, Blen, Blen*bno); 
1996/0217/sys/src/9/port/devtinyfs.c:383,3921996/0218/sys/src/9/port/devtinyfs.c:408,417
1996/0201    
			switch(mdata->type){ 
			case Tagdata: 
				bno = GETS(mdata->bno); 
				f->len += Dlen; 
1996/0218    
				f->length += Dlen; 
1996/0201    
				break; 
			case Tagend: 
				f->len += GETS(mdata->bno); 
1996/0218    
				f->length += GETS(mdata->bno); 
1996/0217    
				done = 1; 
1996/0201    
				break; 
			} 
1996/0217/sys/src/9/port/devtinyfs.c:406,4111996/0218/sys/src/9/port/devtinyfs.c:431,438
1996/0201    
	Tfile *f; 
	Qid qid; 
1996/0123    
 
1996/0218    
	USED(ntab, tab); 
 
1996/0201    
	fs = &tinyfs.fs[c->dev]; 
	if(i >= fs->nf) 
		return -1; 
1996/0217/sys/src/9/port/devtinyfs.c:435,4411996/0218/sys/src/9/port/devtinyfs.c:462,468
1996/0122    
	Chan *c, *cc; 
1996/0201    
	int i; 
1996/0120    
 
1996/0122    
	cc = namec((char*)arg[0], Aopen, arg[1], 0); 
1996/0218    
	cc = namec(spec, Aopen, ORDWR, 0); 
1996/0123    
	if(waserror()){ 
		close(cc); 
1996/0201    
		qunlock(&tinyfs); 
1996/0217/sys/src/9/port/devtinyfs.c:443,4511996/0218/sys/src/9/port/devtinyfs.c:470,479
1996/0123    
	} 
1996/0201    
 
1996/0122    
	qlock(&tinyfs); 
1996/0218    
	fs = 0; 
1996/0201    
	for(i = 0; i < tinyfs.nfs; i++){ 
		fs = &tinyfs.fs[i]; 
		if(fs && eqchan(c, fs->c)) 
1996/0218    
		if(fs && eqchan(cc, fs->c, 0)) 
1996/0122    
			break; 
	} 
1996/0201    
	if(i < tinyfs.nfs){ 
1996/0217/sys/src/9/port/devtinyfs.c:477,4821996/0218/sys/src/9/port/devtinyfs.c:505,514
1996/0116    
Chan * 
tinyfsclone(Chan *c, Chan *nc) 
{ 
1996/0218    
	Tfs *fs; 
 
	fs = &tinyfs.fs[c->dev]; 
 
1996/0202    
	qlock(fs); 
	fs->r++; 
	qunlock(fs); 
1996/0217/sys/src/9/port/devtinyfs.c:488,4941996/0218/sys/src/9/port/devtinyfs.c:520,529
1996/0116    
tinyfswalk(Chan *c, char *name) 
{ 
1996/0202    
	int n; 
1996/0218    
	Tfs *fs; 
1996/0202    
 
1996/0218    
	fs = &tinyfs.fs[c->dev]; 
 
1996/0202    
	qlock(fs); 
	n = devwalk(c, name, 0, 0, tinyfsgen); 
	if(n != 0 && c->qid.path != CHDIR){ 
1996/0217/sys/src/9/port/devtinyfs.c:513,5251996/0218/sys/src/9/port/devtinyfs.c:548,560
1996/0201    
 
	fs = &tinyfs.fs[c->dev]; 
 
	if(c->path & CHDIR){ 
1996/0218    
	if(c->qid.path & CHDIR){ 
1996/0201    
		if(omode != OREAD) 
			error(Eperm); 
	} else { 
1996/0202    
		qlock(fs); 
		if(omode == (OTRUNC|ORDWR)){ 
			f = newfile(fs, fs->f[c->qid.path]); 
1996/0218    
			f = newfile(fs, fs->f[c->qid.path].name); 
1996/0202    
			c->qid.path = f - fs->f; 
		} else if(omode != OREAD){ 
			qunlock(fs); 
1996/0217/sys/src/9/port/devtinyfs.c:540,5451996/0218/sys/src/9/port/devtinyfs.c:575,582
1996/0116    
	if(perm & CHDIR) 
		error("directory creation illegal"); 
 
1996/0218    
	fs = &tinyfs.fs[c->dev]; 
 
1996/0202    
	qlock(fs); 
	f = newfile(fs, name); 
	qunlock(fs); 
1996/0217/sys/src/9/port/devtinyfs.c:570,5761996/0218/sys/src/9/port/devtinyfs.c:607,613
1996/0201    
	Tfile *f, *nf; 
1996/0202    
	int i; 
1996/0201    
 
	fs = c->aux; 
1996/0218    
	fs = &tinyfs.fs[c->dev]; 
1996/0201    
 
1996/0202    
	qlock(fs); 
1996/0201    
 
1996/0217/sys/src/9/port/devtinyfs.c:594,6001996/0218/sys/src/9/port/devtinyfs.c:631,637
1996/0203    
				} 
				f->flag &= ~(Frmonclose|Fcreating); 
1996/0202    
			} 
1996/0203    
			if(f->flag & Frmonclose){ 
1996/0218    
			if(f->flag & Frmonclose) 
1996/0203    
				freefile(fs, f, Notabno); 
1996/0202    
		} 
	} 
1996/0217/sys/src/9/port/devtinyfs.c:601,6091996/0218/sys/src/9/port/devtinyfs.c:638,646
1996/0202    
 
	/* dereference fs and remove on zero refs */ 
	fs->r--; 
1996/0203    
	unlock(fs); 
1996/0218    
	qunlock(fs); 
1996/0203    
	qlock(&tinyfs); 
1996/0201    
	if(fs->ref == 0){ 
1996/0218    
	if(fs->r == 0){ 
1996/0201    
		for(l = &fs->l; *l;){ 
			if(*l == fs){ 
				*l = fs->next; 
1996/0217/sys/src/9/port/devtinyfs.c:625,6311996/0218/sys/src/9/port/devtinyfs.c:662,668
1996/0203    
	Tfs *fs; 
	Tfile *f; 
	int sofar, i; 
1996/0206    
	ulong bno, tbno; 
1996/0218    
	ulong bno; 
1996/0206    
	Mdata *md; 
	uchar buf[Blen]; 
1996/0217    
	uchar *p = a; 
1996/0217/sys/src/9/port/devtinyfs.c:644,6511996/0218/sys/src/9/port/devtinyfs.c:681,686
1996/0206    
	bno = f->dbno; 
1996/0217    
	for(sofar = 0; sofar + Blen < offset; sofar += Blen){ 
		md = readdata(fs, bno, buf, 0); 
1996/0206    
		if(md == 0) 
			error(Eio); 
		bno = GETS(md->bno); 
	} 
 
1996/0217/sys/src/9/port/devtinyfs.c:653,6601996/0218/sys/src/9/port/devtinyfs.c:688,693
1996/0217    
	offset = offset%Blen; 
	for(sofar = 0; sofar < n; sofar += i){ 
		md = readdata(fs, bno, buf, &i); 
		if(md == 0) 
			error(Eio); 
		i -= offset; 
		if(i > n) 
			i = n; 
1996/0217/sys/src/9/port/devtinyfs.c:680,6861996/0218/sys/src/9/port/devtinyfs.c:713,719
1996/0116    
{ 
1996/0217    
	Tfs *fs; 
	Tfile *f; 
	int sofar, i; 
1996/0218    
	int sofar, i, x; 
1996/0217    
	ulong bno, tbno; 
	Mdata *md; 
	uchar buf[Blen]; 
1996/0217/sys/src/9/port/devtinyfs.c:689,7191996/0218/sys/src/9/port/devtinyfs.c:722,787
1996/0217    
	if(c->qid.path & CHDIR) 
		error(Eperm); 
 
1996/0218    
	if(n == 0) 
		return 0; 
 
1996/0217    
	fs = tinyfs.fs[c->dev]; 
	f = &fs->f[c->qid.path]; 
 
	/* walk to first data block */ 
1996/0218    
	/* files are append only, anything else is illegal */ 
	if(offset != f->length) 
		error("append only"); 
 
	qlock(fs); 
	if(waserror()){ 
		f->flag |= Frmonclose; 
		qunlock(fs); 
		nexterror(); 
	} 
 
	/* walk to last data block */ 
1996/0217    
	bno = f->dbno; 
	for(sofar = 0; sofar + Blen < offset; sofar += Blen){ 
		md = readdata(fs, bno, buf, 0); 
		if(md == 0) 
			error(Eio); 
1996/0218    
		if(md->type == Tagend) 
			break; 
1996/0217    
		bno = GETS(md->bno); 
1996/0116    
	} 
 
1996/0217    
	/* write data */ 
	offset = offset%Blen; 
	for(sofar = 0; sofar < n; sofar += i){ 
		md = readdata(fs, bno, buf, 0); 
		if(md == 0) 
			error(Eio); 
		i = Blen - offset; 
		if(i > n) 
			i = n; 
		memmove(p, a, i); 
		bno = GETS(md->bno); 
		offset = 0; 
1996/0218    
	sofar = 0; 
	i = offset%Dlen; 
	if(i){ 
		x = n; 
		if(i + x > Dlen) 
			x = Dlen - i; 
		memmove(md->data + i, p, sofar); 
		f->length += x; 
		sofar += x; 
1996/0116    
	} 
1996/0218    
 
	while(x = n - sofar) { 
		tbno = mapalloc(fs); 
		if(f->length == 0){ 
			f->dbno = tbno; 
			writedir(fs, f); 
		} else { 
			writedata(fs, bno, tbno, md->data, Dlen, 0); 
		} 
		if(x > Dlen) 
			x = Dlen; 
		memmove(md->data, p + sofar, x); 
		sofar += x; 
		f->length += x; 
		bno = tbno; 
	} 
 
	i = f->length%Dlen; 
	if(i == 0) 
		i = Dlen; 
	writedata(fs, bno, tbno, md->data, i, 1); 
 
	poperror(); 
	qunlock(fs); 
1996/0217    
 
	return sofar; 
1996/0116    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)