give up on the drive letter business. let sdctl tell us about controllers, and assume that each controler provides a contiguous set of drives. Reference: /n/atom/patch/applied2013/scuzzdevs Date: Sat Oct 19 05:00:07 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/scuzz/scuzz.c Sat Oct 19 04:58:38 2013 +++ /sys/src/cmd/scuzz/scuzz.c Sat Oct 19 04:58:41 2013 @@ -2340,45 +2340,53 @@ return 0; } -static long -cmdprobe(ScsiReq *rp, int argc, char *argv[]) +static void +probectlr(char *ctlr) { char buf[32]; + int i; ScsiReq scsireq; - char *ctlr, *unit; + + memset(&scsireq, 0, sizeof scsireq); + for(i = 0; i < 0x15; i++){ + snprint(buf, sizeof buf, "/dev/%s%x", ctlr, i); + if(access(buf, OREAD) == -1) + return; + if(SRopenraw(&scsireq, buf) == -1) + continue; + SRreqsense(&scsireq); + switch(scsireq.status){ + case STok: + case Status_SD: + Bprint(&bout, "%s: ", buf); + cmdinquiry(&scsireq, 0, 0); + break; + } + SRclose(&scsireq); + } +} + +static long +cmdprobe(ScsiReq *rp, int argc, char *argv[]) +{ + char buf[1025], *s, *p, *f[3]; + int fd, l; USED(argc, argv); rp->status = STok; - scsireq.flags = 0; - - for(ctlr="CDEFGHIJ0123456789abcdef"; *ctlr; ctlr++) { - /* - * I can guess how many units you have. - * SATA controllers can have more than two drives each. - */ - if(*ctlr >= 'C' && *ctlr <= 'D') - unit = "01"; - else if((*ctlr >= '0' && *ctlr <= '9') - || (*ctlr >= 'a' && *ctlr <= 'f')) - unit = "0123456789abcdef"; /* allow wide scsi */ - else - unit = "01234567"; - for(; *unit; unit++){ - sprint(buf, "/dev/sd%c%c", *ctlr, *unit); - if(SRopenraw(&scsireq, buf) == -1) + fd = open("#S/sdctl", OREAD); + if((l = read(fd, buf, 1024)) > 0){ + s = buf; + s[l] = 0; + for(; p = strchr(s, '\n'); s = p + 1){ + *p = 0; + if(tokenize(s, f, nelem(f)) < 1) continue; - SRreqsense(&scsireq); - switch(scsireq.status){ - case STok: - case Status_SD: - Bprint(&bout, "%s: ", buf); - cmdinquiry(&scsireq, 0, 0); - break; - } - SRclose(&scsireq); + probectlr(f[0]); } } + close(fd); return 0; }