| plan 9 kernel history: overview | file list | diff list |
1996/0607/port/devsd.c (diff list | history)
| 1996/0315/sys/src/9/port/devsd.c:47,52 – 1996/0607/sys/src/9/port/devsd.c:47,54 (short | long | prev | next) | ||
| 1994/0913 | char vol[NAMELEN]; uchar* inquire; | |
| 1996/0607 | int partok; ulong version; | |
| 1994/0913 | ulong size; ulong bsize; | |
| 1996/0315/sys/src/9/port/devsd.c:57,63 – 1996/0607/sys/src/9/port/devsd.c:59,65 | ||
| 1994/0913 | int ndisk; Disk disk[Ndisk]; | |
| 1996/0607 | static int sdrdpart(Disk*); | |
| 1994/0913 | static long sdio(Chan*, int, char*, ulong, ulong); | |
| 1995/0722 | static int types[] = | |
| 1996/0315/sys/src/9/port/devsd.c:137,145 – 1996/0607/sys/src/9/port/devsd.c:139,144 | ||
| 1995/0405 | * their act together after a reset. * If 'not ready' comes back, try starting a TypeDA and punt * the get capacity until the drive is attached. | |
| 1996/0315/sys/src/9/port/devsd.c:187,194 – 1996/0607/sys/src/9/port/devsd.c:186,197 | ||
| 1994/0913 | { | |
| 1995/0417 | int i; | |
| 1994/0913 | ||
| 1995/0417 |
| |
| 1996/0607 | for(i = 0; i < ndisk; i++){ qlock(&disk[i]); if(disk[i].partok == 0) sdrdpart(&disk[i]); qunlock(&disk[i]); } | |
| 1995/0417 | ||
| 1994/0913 | return devattach('w', spec); } | |
| 1996/0315/sys/src/9/port/devsd.c:246,253 – 1996/0607/sys/src/9/port/devsd.c:249,260 | ||
| 1994/0913 | d = &disk[DRIVE(c->qid)]; p = &d->table[PART(c->qid)]; | |
| 1995/0325 |
| |
| 1996/0607 | if((c->mode&3) != OREAD && strcmp(p->name, "partition") == 0){ qlock(d); d->partok = 0; | |
| 1995/0325 | sdrdpart(d); | |
| 1996/0607 | qunlock(d); } | |
| 1994/0913 | } long | |
| 1996/0315/sys/src/9/port/devsd.c:268,273 – 1996/0607/sys/src/9/port/devsd.c:275,286 | ||
| 1994/0913 | long sdwrite(Chan *c, char *a, long n, ulong offset) { | |
| 1996/0607 | Disk *d; d = &disk[DRIVE(c->qid)]; if((d->inquire[0] & 0x1F) == TypeCD) error(Eperm); | |
| 1994/0913 | return sdio(c, 1, a, n, offset); | |
| 1995/0108 | } | |
| 1996/0315/sys/src/9/port/devsd.c:277,283 – 1996/0607/sys/src/9/port/devsd.c:290,296 | ||
| 1995/0108 | return devbwrite(c, bp, offset); | |
| 1994/0913 | } | |
| 1996/0607 | static int | |
| 1994/0913 | sdrdpart(Disk *d) { Part *p; | |
| 1996/0315/sys/src/9/port/devsd.c:285,314 – 1996/0607/sys/src/9/port/devsd.c:298,333 | ||
| 1994/0913 | char *b, *line[Npart+2], *field[3]; static char MAGIC[] = "plan9 partitions"; | |
| 1996/0607 | if(d->partok) return STok; p = d->table; strcpy(p->name, "disk"); p->beg = 0; p->end = 0; d->npart = 1; | |
| 1995/0417 | /* | |
| 1996/0607 | * If the drive wasn't ready when a read-capacity was tried * earlier (in sdinit()), try again. | |
| 1995/0417 | */ if(d->size == 0 || d->bsize == 0){ | |
| 1996/0607 | n = scsicap(d->t, d->lun, &d->size, &d->bsize); if(n != STok){ | |
| 1995/0417 | d->size = d->bsize = 0; | |
| 1996/0607 | return scsierrstr(n); | |
| 1995/0417 | } } | |
| 1996/0607 | p->end = d->size + 1; if((d->inquire[0] & 0x1F) == TypeCD) return STok; | |
| 1994/0913 | b = scsialloc(d->bsize); if(b == 0) | |
| 1996/0607 | return scsierrstr(STnomem); | |
| 1994/0913 |
| |
| 1996/0315/sys/src/9/port/devsd.c:316,327 – 1996/0607/sys/src/9/port/devsd.c:335,340 | ||
| 1994/0913 | p++; d->npart = 2; | |
| 1995/0403 |
| |
| 1994/0913 | scsibio(d->t, d->lun, SCSIread, b, 1, d->bsize, d->table[0].end-1); b[d->bsize-1] = '\0'; | |
| 1996/0315/sys/src/9/port/devsd.c:331,356 – 1996/0607/sys/src/9/port/devsd.c:344,367 | ||
| 1996/0315 | n = parsefields(b, line, Npart+2, "\n"); | |
| 1994/0913 | if(n > 0 && strncmp(line[0], MAGIC, sizeof(MAGIC)-1) == 0) { for(i = 1; i < n; i++) { | |
| 1996/0315 |
| |
| 1994/0913 |
| |
| 1994/1228 |
| |
| 1994/0913 |
| |
| 1996/0607 | if(parsefields(line[i], field, 3, " ") != 3) break; if(p >= &d->table[Npart]) break; strncpy(p->name, field[0], NAMELEN); p->beg = strtoul(field[1], 0, 0); p->end = strtoul(field[2], 0, 0); if(p->beg > p->end || p->beg >= d->table[0].end) break; p++; | |
| 1994/0913 | } } d->npart = p - d->table; scsifree(b); | |
| 1996/0607 | d->partok = 1; return STok; | |
| 1994/0913 | } static long | |
| 1996/0315/sys/src/9/port/devsd.c:364,372 – 1996/0607/sys/src/9/port/devsd.c:375,380 | ||
| 1994/0913 | d = &disk[DRIVE(c->qid)]; p = &d->table[PART(c->qid)]; | |
| 1995/0403 |
| |
| 1994/0913 |
| |
| 1996/0315/sys/src/9/port/devsd.c:379,393 – 1996/0607/sys/src/9/port/devsd.c:387,402 | ||
| 1994/0913 | b = scsialloc(n*d->bsize); if(b == 0) | |
| 1996/0607 | return scsierrstr(STnomem); | |
| 1994/0913 | offset %= d->bsize; if(write) { if(offset || len % d->bsize) { x = scsibio(d->t, d->lun, SCSIread, b, n, d->bsize, block); | |
| 1996/0607 | if(x < 0){ len = -1; goto buggery; } | |
| 1994/0913 | if(x < n * d->bsize) { n = x / d->bsize; x = n * d->bsize - offset; | |
| 1996/0315/sys/src/9/port/devsd.c:397,402 – 1996/0607/sys/src/9/port/devsd.c:406,415 | ||
| 1994/0913 | } memmove(b + offset, a, len); x = scsibio(d->t, d->lun, SCSIwrite, b, n, d->bsize, block); | |
| 1996/0607 | if(x < 0){ len = -1; goto buggery; } | |
| 1994/0913 | if(x < offset) len = 0; else | |
| 1996/0315/sys/src/9/port/devsd.c:405,410 – 1996/0607/sys/src/9/port/devsd.c:418,427 | ||
| 1994/0913 | } else { x = scsibio(d->t, d->lun, SCSIread, b, n, d->bsize, block); | |
| 1996/0607 | if(x < 0){ len = -1; goto buggery; } | |
| 1994/0913 | if(x < offset) len = 0; else | |
| 1996/0315/sys/src/9/port/devsd.c:412,418 – 1996/0607/sys/src/9/port/devsd.c:429,436 | ||
| 1994/0913 | len = x - offset; memmove(a, b+offset, len); } | |
| 1996/0607 | buggery: | |
| 1994/0913 | scsifree(b); return len; } | |