static int aoerio(SDreq *r) { int i, count, rw; uvlong lba; Ctlr *c; SDunit *u; u = r->unit; c = u->dev->ctlr; // if(c->feat & Datapi) // return aoeriopkt(r, d); if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91) { qlock(c); i = flushcache(c); qunlock(c); if(i == 0) return sdsetsense(r, SDok, 0, 0, 0); return sdsetsense(r, SDcheck, 3, 0xc, 2); } if((i = sdfakescsi(r)) != SDnostatus) { r->status = i; return i; } if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus) return i; r->rlen = aoebio(u, r->lun, rw == SDwrite, r->data, count, lba); return r->status = SDok; }
static int mmcrio(SDreq *r) { int i, rw, count; uvlong lba; if((i = sdfakescsi(r)) != SDnostatus) return r->status = i; if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus) return i; r->rlen = mmcbio(r->unit, r->lun, rw == SDwrite, r->data, count, lba); return r->status = SDok; }
static int looprio(SDreq *r) { int i, count, rw; uvlong lba; SDunit *u; u = r->unit; if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91) return sdsetsense(r, SDok, 0, 0, 0); if((i = sdfakescsi(r)) != SDnostatus) return r->status = i; if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus) return i; r->rlen = loopbio(u, r->lun, rw == SDwrite, r->data, count, lba); return r->status = SDok; }
static int viorio(SDreq *r) { int i, count, rw; uvlong lba; SDunit *u; u = r->unit; if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91){ if(vioreq(u->dev->ctlr, 4, nil, 0, 0, 0) != 0) return sdsetsense(r, SDcheck, 3, 0xc, 2); return sdsetsense(r, SDok, 0, 0, 0); } if((i = sdfakescsi(r)) != SDnostatus) return r->status = i; if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus) return i; r->rlen = viobio(u, r->lun, rw == SDwrite, r->data, count, lba); return r->status = SDok; }