~kris/9p

9hist

c2979df11ddfd717a4c659a0692803f52a6848d5 — David du Colombier 35 years ago f8634a5
Plan 9 from Bell Labs 1991-08-31
2 files changed, 26 insertions(+), 20 deletions(-)

M pc/devfloppy.c
M port/stream.c
M pc/devfloppy.c => pc/devfloppy.c +19 -1
@@ 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 */


@@ 281,6 284,18 @@ ul2user(uchar *a, ulong 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)

M port/stream.c => port/stream.c +7 -19
@@ 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");
}