static int dirdevopen(ScsiReq *rp) { uint64_t blocks; uint8_t data[8+4+20]; /* 16-byte result: lba, blksize, reserved */ memset(data, 0, sizeof data); if(SRstart(rp, 1) == -1 || SRrcapacity(rp, data) == -1) return -1; rp->lbsize = GETBELONG(data+4); blocks = GETBELONG(data); if(debug) fprint(2, "disk: dirdevopen: 10-byte logical block size %lud, " "# blocks %llud\n", rp->lbsize, blocks); if(blocks == 0xffffffff){ if(SRrcapacity16(rp, data) == -1) return -1; rp->lbsize = GETBELONG(data + 8); blocks = (int64_t)GETBELONG(data)<<32 | GETBELONG(data + 4); if(debug) fprint(2, "disk: dirdevopen: 16-byte logical block size" " %lud, # blocks %llud\n", rp->lbsize, blocks); } /* some newer dev's don't support 6-byte commands */ if(blocks > Max24off && !force6bytecmds) rp->flags |= Frw10; return 0; }
static long start(ScsiReq *rp, int argc, char *argv[], uchar code) { char *p; if(argc && (code = strtoul(argv[0], &p, 0)) == 0 && p == argv[0]){ rp->status = Status_BADARG; return -1; } return SRstart(rp, code); }
static int wormdevopen(ScsiReq *rp) { int32_t status; uint8_t list[MaxDirData]; if (SRstart(rp, 1) == -1 || (status = SRmodesense10(rp, Allmodepages, list, sizeof list)) == -1) return -1; /* nbytes = list[0]<<8 | list[1]; */ /* # of bytes of block descriptors of 8 bytes each; not even 1? */ if((list[6]<<8 | list[7]) < 8) rp->lbsize = 2048; else /* last 3 bytes of block 0 descriptor */ rp->lbsize = GETBE24(list+13); if(debug) fprint(2, "disk: wormdevopen: 10-byte logical block size %lud\n", rp->lbsize); return status; }