From d22521e4b671a9dfa6bc9fffb3fd6dd3b0079cda Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 14 Apr 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-04-14 --- gnot/fns.h | 1 + port/chan.c | 26 +++++++++++++++----------- port/dev.c | 17 ++++++++++++++--- port/devmnt.c | 27 +++++++++++++++++++++++++++ port/fcall.c | 14 ++++++++++++++ power/fns.h | 1 + ss/fns.h | 1 + 7 files changed, 73 insertions(+), 14 deletions(-) diff --git a/gnot/fns.h b/gnot/fns.h index 78e5a1999741368465d5d906d40c097954260ca1..35d2189d8d3f7fce3a7629b7af150724cda0867a 100644 --- a/gnot/fns.h +++ b/gnot/fns.h @@ -70,6 +70,7 @@ void fprestore(FPsave*); void fpregrestore(char*); void freeb(Block*); int freebroken(void); +void freechan(Chan*); void freenextmod(PTE*); void freepage(Orig*, int); void freepte(Orig*); diff --git a/port/chan.c b/port/chan.c index 9dcf9d8fdf4efc18debf05416e35a9e14197a51a..da75c143c617164238d82606aa9a6f6782bd2e3f 100644 --- a/port/chan.c +++ b/port/chan.c @@ -101,11 +101,13 @@ loop: void freechan(Chan *c) { - c->flag = CFREE; - lock(&chanalloc); - c->next = chanalloc.free; - chanalloc.free = c; - unlock(&chanalloc); + if(decref(c) == 0){ + c->flag = CFREE; + lock(&chanalloc); + c->next = chanalloc.free; + chanalloc.free = c; + unlock(&chanalloc); + } } void @@ -114,13 +116,15 @@ close(Chan *c) if(c->flag & CFREE) panic("close"); if(decref(c) == 0){ - if(waserror()) { - freechan(c); - nexterror(); + if(!waserror()) { + (*devtab[c->type].close)(c); + poperror(); } - (*devtab[c->type].close)(c); - freechan(c); - poperror(); + c->flag = CFREE; + lock(&chanalloc); + c->next = chanalloc.free; + chanalloc.free = c; + unlock(&chanalloc); } } diff --git a/port/dev.c b/port/dev.c index 0d38f024a64e36aa6837e34c487fb98a07e5afce..cdd1b32ddea9b4e0c33baeeffc264dacf191fb3a 100644 --- a/port/dev.c +++ b/port/dev.c @@ -107,10 +107,21 @@ devwalk(Chan *c, char *name, Dirtab *tab, int ntab, Devgen *gen) } } -int devclwalk(Chan *c, Chan *nc, char *name, Dirtab *tab, int ntab, Devgen *gen) +Chan* +devclwalk(Chan *c, char *name) { - c = devclone(c, nc); - return devwalk(c, name, tab, ntab, gen); + Chan *nc; + + nc = 0; + if(waserror()){ + if(nc) + close(nc); + return 0; + } + nc = (*devtab[c->type].clone)(c, 0); + (*devtab[nc->type].walk)(nc, name); + poperror(); + return nc; } void diff --git a/port/devmnt.c b/port/devmnt.c index 4de1ed4011cd34711e02e25dd62d9fb1941ef1ff..8424228573397901ef7153e880763153484804b6 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -388,6 +388,33 @@ mntwalk(Chan *c, char *name) return found; } +Chan * +mntclwalk(Chan *c, char *name) +{ + Mnt *m; + Mnthdr *mh; + Chan *nc; + + nc = newchan(); + m = mntdev(c->dev, 0); + mh = mhalloc(); + mh->thdr.type = Tclwalk; + mh->thdr.fid = c->fid; + mh->thdr.newfid = nc->fid; + strcpy(mh->thdr.name, name); + if(waserror()){ /* BUG: can check type of error? */ + freechan(nc); + nc = 0; + goto Out; + } + mntxmit(m, mh); + nc->qid = mh->rhdr.qid; + poperror(); + Out: + mhfree(mh); + return nc; +} + void mntstat(Chan *c, char *dp) { diff --git a/port/fcall.c b/port/fcall.c index 64d0195a664fd4c30f05da2a3e9a3a7ff3b1d707..be3e842f9432aa0cf0db476515bf23c37dcfe209 100644 --- a/port/fcall.c +++ b/port/fcall.c @@ -92,6 +92,12 @@ convS2M(Fcall *f, char *ap) SHORT(fid); STRING(stat, sizeof(f->stat)); break; + + case Tclwalk: + SHORT(fid); + SHORT(newfid); + STRING(name, sizeof(f->name)); + break; /* */ case Rnop: @@ -117,6 +123,7 @@ convS2M(Fcall *f, char *ap) SHORT(fid); break; + case Rclwalk: case Rwalk: SHORT(fid); LONG(qid.path); @@ -284,6 +291,12 @@ convM2S(char *ap, Fcall *f, int n) SHORT(fid); STRING(stat, sizeof(f->stat)); break; + + case Tclwalk: + SHORT(fid); + SHORT(newfid); + STRING(name, sizeof(f->name)); + break; /* */ case Rnop: @@ -310,6 +323,7 @@ convM2S(char *ap, Fcall *f, int n) break; case Rwalk: + case Rclwalk: SHORT(fid); LONG(qid.path); LONG(qid.vers); diff --git a/power/fns.h b/power/fns.h index b6d453cc7fe581d77733139c5bc9c38ba962cda2..29ed30e011f9533408a904c2b57ed0b595f3f497 100644 --- a/power/fns.h +++ b/power/fns.h @@ -70,6 +70,7 @@ void flushmmu(void); void forkmod(Seg*, Seg*, Proc*); void freeb(Block*); int freebroken(void); +void freechan(Chan*); void freepage(Orig*, int); void freepte(Orig*); void freesegs(int); diff --git a/ss/fns.h b/ss/fns.h index 45d0f23c59b5b8a231c4211cb8c15327df771d5b..466e9b7dbde56d4df9a15095b769948fb776dfed 100644 --- a/ss/fns.h +++ b/ss/fns.h @@ -77,6 +77,7 @@ void fprestore(FPsave*); void fpregrestore(char*); void freeb(Block*); int freebroken(void); +void freechan(Chan*); void freenextmod(PTE*); void freepage(Orig*, int); void freepte(Orig*);