~kris/9p

9hist

16413e9598efb10f70872d60c3658e05cda5497a — David du Colombier 32 years ago 07c4ce0
Plan 9 from Bell Labs 1994-02-22
5 files changed, 59 insertions(+), 36 deletions(-)

M pc/devhard.c
M port/alloc.c
M port/portdat.h
M port/portfns.h
M port/qio.c
M pc/devhard.c => pc/devhard.c +19 -11
@@ 99,6 99,7 @@ struct Drive
	Repl	repl;
	ulong	usetime;
	int	state;
	char	vol[NAMELEN];

	ulong	cap;		/* total bytes */
	int	bytes;		/* bytes/sector */


@@ 165,7 166,7 @@ hardgen(Chan *c, Dirtab *tab, long ntab, long s, Dir *dirp)
		return 0;

	pp = &dp->p[s];
	sprint(name, "hd%d%s", drive, pp->name);
	sprint(name, "%s%s", dp->vol, pp->name);
	name[NAMELEN] = 0;
	qid.path = MKQID(drive, s);
	l = (pp->end - pp->start) * dp->bytes;


@@ 854,6 855,8 @@ hardpart(Drive *dp)
	int i;
	char *buf;

	sprint(dp->vol, "hd%d", dp - hard);

	/*
	 *  we always have a partition for the whole disk
	 *  and one for the partition table


@@ 907,16 910,21 @@ hardpart(Drive *dp)
	if(n && strncmp(line[0], PARTMAGIC, sizeof(PARTMAGIC)-1) == 0){
		for(i = 1; i < n; i++){
			pp++;
			if(getfields(line[i], field, 3, ' ') != 3)
				break;
			strncpy(pp->name, field[0], NAMELEN);
			if(strncmp(pp->name, "repl", NAMELEN) == 0)
				dp->repl.p = pp;
			pp->start = strtoul(field[1], 0, 0);
			pp->end = strtoul(field[2], 0, 0);
			if(pp->start > pp->end || pp->start >= dp->p[0].end)
				break;
			dp->npart++;
			switch(getfields(line[i], field, 3, ' ')) {
			case 2:
				if(strcmp(field[0], "unit") == 0)
					strncpy(dp->vol, field[1], NAMELEN);
				break;	
			case 3:
				strncpy(pp->name, field[0], NAMELEN);
				if(strncmp(pp->name, "repl", NAMELEN) == 0)
					dp->repl.p = pp;
				pp->start = strtoul(field[1], 0, 0);
				pp->end = strtoul(field[2], 0, 0);
				if(pp->start > pp->end || pp->start >= dp->p[0].end)
					break;
				dp->npart++;
			}
		}
	}
	free(buf);

M port/alloc.c => port/alloc.c +2 -2
@@ 274,7 274,7 @@ good:
		unlock(&arena);

		if(bp->magic != 0)
			panic("malloc");
			panic("malloc %lux %lux", bp->magic, bp->pc);

		bp->magic = Magic2n;
		bp->pc = getcallerpc(((uchar*)&size) - sizeof(size));


@@ 368,7 368,7 @@ free(void *ptr)

	bp = (Bucket*)((ulong)ptr - bdatoff);
	if(bp->magic != Magic2n)
		panic("free");
		panic("free %lux %lux", bp->magic, bp->pc);

	bp->magic = 0;
	lock(&arena);

M port/portdat.h => port/portdat.h +2 -0
@@ 657,6 657,8 @@ enum

	SCSIread	= 0,
	SCSIwrite,

	SCSImaxxfer	= 1024*1024,
};

/*

M port/portfns.h => port/portfns.h +1 -1
@@ 214,7 214,7 @@ void		schedinit(void);
int		screenbits(void);
void		screenupdate(void);
int		scsiexec(Target*, int, uchar*, int, void*, int);
int		scsiinv(int, int, Target**, uchar**, int*, int*);
int		scsiinv(int, int, Target**, uchar**, char*);
long		seconds(void);
ulong		segattach(Proc*, ulong, char *, ulong, ulong);
void		segpage(Segment*, Page*);

M port/qio.c => port/qio.c +35 -22
@@ 97,6 97,21 @@ enum
};

void
checkb(Block *b, char *msg)
{
	if(b->base > b->lim)
		panic("checkb 0 %s %lux %lux", msg, b->base, b->lim);
	if(b->rp < b->base)
		panic("checkb 1 %s %lux %lux", msg, b->base, b->rp);
	if(b->wp < b->base)
		panic("checkb 2 %s %lux %lux", msg, b->base, b->wp);
	if(b->rp > b->lim)
		panic("checkb 3 %s %lux %lux", msg, b->rp, b->lim);
	if(b->wp > b->lim)
		panic("checkb 4 %s %lux %lux", msg, b->wp, b->lim);
}

void
poison(Block *b)
{
	b->next = (void*)0xdeadbabe;


@@ 310,7 325,6 @@ allocb(int size)
	b->rp = b->base;
	b->wp = b->base;
	b->lim = ((uchar*)b) + size;
	b->flag = 0;

	return b;
}


@@ 335,6 349,7 @@ qconsume(Queue *q, void *vp, int len)
		unlock(q);
		return -1;
	}
checkb(b, "qconsume 1");

	n = BLEN(b);
	if(n < len)


@@ 342,8 357,7 @@ qconsume(Queue *q, void *vp, int len)
	memmove(p, b->rp, len);
	if((q->state & Qmsg) || len == n)
		q->bfirst = b->next;
	else
		b->rp += len;
	b->rp += len;
	q->len -= len;

	/* if writer flow controlled, restart */


@@ 358,6 372,7 @@ qconsume(Queue *q, void *vp, int len)
	if(dowakeup)
		wakeup(&q->wr);

checkb(b, "qconsume 2");
	/* discard the block if we're done with it */
	if((q->state & Qmsg) || len == n) {
		poison(b);


@@ 403,26 418,21 @@ qproduce(Queue *q, void *vp, int len)
	}

	/* save in buffer */
	b = q->bfirst;
	if((q->state & Qmsg) == 0 && b && b->lim - b->wp <= len){
		memmove(b->wp, p, len);
		b->wp += len;
		b->flag |= Bfilled;
	} else {
		b = iallocb(len);
		if(b == 0){
			unlock(q);
			return -2;
		}
		memmove(b->wp, p, len);
		b->wp += len;
		if(q->bfirst)
			q->blast->next = b;
		else
			q->bfirst = b;
		q->blast = b;
	b = iallocb(len);
	if(b == 0){
		unlock(q);
		return -2;
	}
	memmove(b->wp, p, len);
	b->wp += len;
	if(q->bfirst)
		q->blast->next = b;
	else
		q->bfirst = b;
	q->blast = b;
	q->len += len;
checkb(b, "qproduce");

	if(q->state & Qstarve){
		q->state &= ~Qstarve;
		dowakeup = 1;


@@ 542,6 552,7 @@ qread(Queue *q, void *vp, int len)
			sleep(&q->rr, notempty, q);
		}
	}
checkb(b, "qread 1");

	/* remove a buffered block */
	q->bfirst = b->next;


@@ 563,6 574,7 @@ qread(Queue *q, void *vp, int len)
	memmove(p, b->rp, n);
	b->rp += n;

checkb(b, "qread 2");
	/* free it or put what's left on the queue */
	if(b->rp >= b->wp || (q->state&Qmsg)) {
		poison(b);


@@ 663,7 675,8 @@ qwrite(Queue *q, void *vp, int len, int nowait)
			splx(x);
			error(Ehungup);
		}
	

checkb(b, "qwrite");
		if(q->syncbuf){
			/* we guessed wrong and did an extra copy */
			if(n > q->synclen)