From c2979df11ddfd717a4c659a0692803f52a6848d5 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 31 Aug 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-08-31 --- pc/devfloppy.c | 20 +++++++++++++++++++- port/stream.c | 26 +++++++------------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/pc/devfloppy.c b/pc/devfloppy.c index 7e8294b612c034d09214529fcd3ac98792b7578b..71f22be07513b8682acdbb644004c2a5f7092670 100644 --- a/pc/devfloppy.c +++ b/pc/devfloppy.c @@ -26,9 +26,12 @@ enum Fseek= 0xf, /* seek cmd */ Fsense= 0x8, /* sense cmd */ Fread= 0x66, /* read cmd */ - Fwrite= 0x47, /* write cmd */ + Fwrite= 0x45, /* write cmd */ Fmulti= 0x80, /* or'd with Fread or Fwrite for multi-head */ + Fchanged= 0x3F7, /* disk changed register */ + Fchange= 0x80, /* disk has changed */ + DMAchan= 2, /* floppy dma channel */ /* status 0 byte */ @@ -280,6 +283,18 @@ ul2user(uchar *a, ulong x) a[3] = x; } +/* + * look for a floppy change + */ +void +floppychange(Drive *dp) +{ + if((inb(Fchanged) & Fchange) == 0) + return; + + +} + /* * the floppy is so slow, we always read a cylinder * at a time and cache the extra bytes. @@ -299,6 +314,7 @@ floppyread(Chan *c, void *a, long n) dp = &floppy.d[c->qid.path & ~Qmask]; switch ((int)(c->qid.path & Qmask)) { case Qdata: + floppychanged(dp); if(c->offset % dp->t->bytes) errors("bad offset"); if(n % dp->t->bytes) @@ -343,6 +359,8 @@ floppywrite(Chan *c, void *a, long n) dp = &floppy.d[c->qid.path & ~Qmask]; switch ((int)(c->qid.path & Qmask)) { case Qdata: + floppychanged(dp); + dp->ccyl = -1; for(rv = 0; rv < n; rv += i){ i = floppyxfer(dp, Fwrite, aa+rv, c->offset+rv, n-rv); if(i <= 0) diff --git a/port/stream.c b/port/stream.c index 2c4eebd2d79f1d0e1799b80f6dd431755c36dbb3..141aaec972191ec7cf7904029fd9cc664a70bfa9 100644 --- a/port/stream.c +++ b/port/stream.c @@ -43,11 +43,8 @@ static Lock garbagelock; */ typedef struct { int size; - int lim; int made; Blist; - QLock; /* qlock for sleepers on r */ - Rendez r; /* sleep here waiting for blocks */ } Bclass; Bclass bclass[Nclass]={ { 0 }, @@ -74,14 +71,13 @@ streaminit(void) qlist = (Queue *)ialloc(conf.nqueue * sizeof(Queue), 0); /* - * set limits on blocks + * set block classes */ n = conf.nblock; for(class = 0; class < Nclass; class++){ if(class < Nclass-1) n = n/2; bcp = &bclass[class]; - bcp->lim = n; bcp->made = 0; } @@ -115,9 +111,6 @@ newblock(Bclass *bcp) Block *bp; uchar *cp; - if(bcp->made > bcp->lim) - return -1; - page = newpage(1, 0, 0); page->va = VA(kmap(page)); if(bcp == bclass){ @@ -149,11 +142,11 @@ newblock(Bclass *bcp) * upgrade a level 0 block */ bp = allocb(0); - qlock(bclass); + lock(bclass); bclass->made--; bcp->made++; bp->flags = bcp - bclass; - qunlock(bclass); + unlock(bclass); /* * tack on the data area @@ -199,18 +192,12 @@ allocb(ulong size) */ lock(bcp); while(bcp->first == 0){ - if(newblock(bcp) == 0) - continue; - unlock(bcp); - qlock(bcp); if(waserror()){ - qunlock(bcp); + unlock(bcp); nexterror(); } - tsleep(&bcp->r, isblock, (void *)bcp, 250); - qunlock(bcp); + newblock(bcp); poperror(); - lock(bcp); } bp = bcp->first; bcp->first = bp->next; @@ -1462,7 +1449,8 @@ dumpqueues(void) for(count = 0, bp = bcp->first; bp; count++, bp = bp->next) ; unlock(bcp); - print("%d blocks of size %d\n", count, bcp->size); + print("%d byte blocks: %d made %d free\n", bcp->size, + bcp->made, count); } print("\n"); }