| 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,156 – 1996/0218/sys/src/9/port/devtinyfs.c:150,156 (short | long | prev | next) | ||
| 1996/0201 | if(checksum(p) != 0) return 0; | |
| 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,174 – 1996/0218/sys/src/9/port/devtinyfs.c:167,174 | ||
| 1996/0201 | if(checksum(p) != 0) return 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,214 – 1996/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 |
| |
| 1996/0206 | if(bno >= fs->nblocks) 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 |
| |
| 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; | |
| 1996/0218 | return; | |
| 1996/0202 | md = (Mdir*)buf; memset(buf, 0, Blen); | |
| 1996/0217/sys/src/9/port/devtinyfs.c:216,224 – 1996/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); | |
| 1996/0218 | md->sum = 0 - checksum(buf); | |
| 1996/0202 |
| |
| 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,282 – 1996/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,307 – 1996/0218/sys/src/9/port/devtinyfs.c:322,331 | ||
| 1996/0202 | /* write directory block */ if(waserror()){ | |
| 1996/0218 | freefile(fs, f, Notabno); | |
| 1996/0202 | nexterror(); } | |
| 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,332 – 1996/0218/sys/src/9/port/devtinyfs.c:341,357 | ||
| 1996/0201 | static void fsinit(Tfs *fs) | |
| 1996/0123 | { | |
| 1996/0131 |
| |
| 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; | |
| 1996/0218 | Mdata *mdata; | |
| 1996/0123 |
| |
| 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,354 – 1996/0218/sys/src/9/port/devtinyfs.c:369,379 | ||
| 1996/0131 | if(n != Blen) break; | |
| 1996/0201 |
| |
| 1996/0218 | mdir = validdir(fs, buf); | |
| 1996/0201 | if(mdir == 0) | |
| 1996/0131 | continue; | |
| 1996/0201 | ||
| 1996/0217 |
| |
| 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,372 – 1996/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 |
| |
| 1996/0218 | bno = f->dbno; | |
| 1996/0217 | for(done = 0; !done;) { | |
| 1996/0201 | if(isalloced(fs, 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,392 – 1996/0218/sys/src/9/port/devtinyfs.c:408,417 | ||
| 1996/0201 | switch(mdata->type){ case Tagdata: bno = GETS(mdata->bno); | |
| 1996/0218 | f->length += Dlen; | |
| 1996/0201 | break; case Tagend: | |
| 1996/0218 | f->length += GETS(mdata->bno); | |
| 1996/0217 | done = 1; | |
| 1996/0201 | break; } | |
| 1996/0217/sys/src/9/port/devtinyfs.c:406,411 – 1996/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,441 – 1996/0218/sys/src/9/port/devtinyfs.c:462,468 | ||
| 1996/0122 | Chan *c, *cc; | |
| 1996/0201 | int i; | |
| 1996/0120 | ||
| 1996/0122 |
| |
| 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,451 – 1996/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]; | |
| 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,482 – 1996/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,494 – 1996/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,525 – 1996/0218/sys/src/9/port/devtinyfs.c:548,560 | ||
| 1996/0201 | fs = &tinyfs.fs[c->dev]; | |
| 1996/0218 | if(c->qid.path & CHDIR){ | |
| 1996/0201 | if(omode != OREAD) error(Eperm); } else { | |
| 1996/0202 | qlock(fs); if(omode == (OTRUNC|ORDWR)){ | |
| 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,545 – 1996/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,576 – 1996/0218/sys/src/9/port/devtinyfs.c:607,613 | ||
| 1996/0201 | Tfile *f, *nf; | |
| 1996/0202 | int i; | |
| 1996/0201 |
| |
| 1996/0218 | fs = &tinyfs.fs[c->dev]; | |
| 1996/0201 | ||
| 1996/0202 | qlock(fs); | |
| 1996/0201 | ||
| 1996/0217/sys/src/9/port/devtinyfs.c:594,600 – 1996/0218/sys/src/9/port/devtinyfs.c:631,637 | ||
| 1996/0203 | } f->flag &= ~(Frmonclose|Fcreating); | |
| 1996/0202 | } | |
| 1996/0203 |
| |
| 1996/0218 | if(f->flag & Frmonclose) | |
| 1996/0203 | freefile(fs, f, Notabno); | |
| 1996/0202 | } } | |
| 1996/0217/sys/src/9/port/devtinyfs.c:601,609 – 1996/0218/sys/src/9/port/devtinyfs.c:638,646 | ||
| 1996/0202 | /* dereference fs and remove on zero refs */ fs->r--; | |
| 1996/0203 |
| |
| 1996/0218 | qunlock(fs); | |
| 1996/0203 | qlock(&tinyfs); | |
| 1996/0201 |
| |
| 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,631 – 1996/0218/sys/src/9/port/devtinyfs.c:662,668 | ||
| 1996/0203 | Tfs *fs; Tfile *f; int sofar, i; | |
| 1996/0206 |
| |
| 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,651 – 1996/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 |
| |
| 1996/0217/sys/src/9/port/devtinyfs.c:653,660 – 1996/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); | |
| 1996/0217/sys/src/9/port/devtinyfs.c:680,686 – 1996/0218/sys/src/9/port/devtinyfs.c:713,719 | ||
| 1996/0116 | { | |
| 1996/0217 | Tfs *fs; Tfile *f; | |
| 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,719 – 1996/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]; | |
| 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); | |
| 1996/0218 | if(md->type == Tagend) break; | |
| 1996/0217 | bno = GETS(md->bno); | |
| 1996/0116 | } | |
| 1996/0217 |
| |
| 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 | } | |