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)