| plan 9 kernel history: overview | file list | diff list |
2002/0404/port/devwpsd.c (diff list | history)
| 2002/0330/sys/src/9/port/devwpsd.c:1,3 – 2002/0404/sys/src/9/port/devwpsd.c:1,6 (short | long | prev | next) | ||
| 2002/0404 | /* * Storage Device. */ | |
| 2002/0330 | #include "u.h" #include "../port/lib.h" #include "mem.h" | |
| 2002/0330/sys/src/9/port/devwpsd.c:9,19 – 2002/0404/sys/src/9/port/devwpsd.c:12,18 | ||
| 2002/0330 | #include "../port/sd.h" | |
| 2002/0404 | extern Dev wpsddevtab; | |
| 2002/0330 | extern SDifc* sdifc[]; typedef struct { | |
| 2002/0330/sys/src/9/port/devwpsd.c:31,36 – 2002/0404/sys/src/9/port/devwpsd.c:30,49 | ||
| 2002/0330 | Rawstatus, }; | |
| 2002/0404 | enum { CMpart, CMdelpart, CMwildcard, }; Cmdtab ctlmsg[] = { CMpart, "part", 3, CMdelpart, "delpart", 1, CMwildcard, "*", 0, }; | |
| 2002/0330 | enum { Qtopdir = 1, /* top level directory */ Qtopbase, | |
| 2002/0330/sys/src/9/port/devwpsd.c:461,467 – 2002/0404/sys/src/9/port/devwpsd.c:474,480 | ||
| 2002/0330 | case Qtopdir: if(s == DEVDOTDOT){ mkqid(&q, QID(0, s, 0, Qtopdir), 0, QTDIR); | |
| 2002/0404 | sprint(up->genbuf, "#%C", wpsddevtab.dc); | |
| 2002/0330 | devdir(c, q, up->genbuf, 0, eve, 0555, dp); return 1; } | |
| 2002/0330/sys/src/9/port/devwpsd.c:507,513 – 2002/0404/sys/src/9/port/devwpsd.c:520,526 | ||
| 2002/0330 | case Qunitdir: if(s == DEVDOTDOT){ mkqid(&q, QID(0, s, 0, Qtopdir), 0, QTDIR); | |
| 2002/0404 | sprint(up->genbuf, "#%C", wpsddevtab.dc); | |
| 2002/0330 | devdir(c, q, up->genbuf, 0, eve, 0555, dp); return 1; } | |
| 2002/0330/sys/src/9/port/devwpsd.c:591,597 – 2002/0404/sys/src/9/port/devwpsd.c:604,610 | ||
| 2002/0330 | int idno, subno, i; if(ndevs == 0 || *spec == '\0'){ | |
| 2002/0404 | c = devattach(wpsddevtab.dc, spec); | |
| 2002/0330 | mkqid(&c->qid, QID(0, 0, 0, Qtopdir), 0, QTDIR); return c; } | |
| 2002/0330/sys/src/9/port/devwpsd.c:615,621 – 2002/0404/sys/src/9/port/devwpsd.c:628,634 | ||
| 2002/0330 | incref(&sdev->r); qunlock(&devslock); | |
| 2002/0404 | c = devattach(wpsddevtab.dc, spec); | |
| 2002/0330 | mkqid(&c->qid, QID(sdev->idno, subno, 0, Qunitdir), 0, QTDIR); c->dev = (sdev->idno << UnitLOG) + subno; decref(&sdev->r); | |
| 2002/0330/sys/src/9/port/devwpsd.c:657,663 – 2002/0404/sys/src/9/port/devwpsd.c:670,676 | ||
| 2002/0330 | break; case Qraw: c->qid.vers = unit->vers; | |
| 2002/0404 | if(tas(&unit->rawinuse) != 0){ | |
| 2002/0330 | c->flag &= ~COPEN; error(Einuse); } | |
| 2002/0330/sys/src/9/port/devwpsd.c:698,704 – 2002/0404/sys/src/9/port/devwpsd.c:711,717 | ||
| 2002/0330 | sdev = sdgetdev(DEV(c->qid)); if (sdev) { unit = sdev->unit[UNIT(c->qid)]; | |
| 2002/0404 | unit->rawinuse = 0; | |
| 2002/0330 | decref(&sdev->r); } break; | |
| 2002/0330/sys/src/9/port/devwpsd.c:783,788 – 2002/0404/sys/src/9/port/devwpsd.c:796,803 | ||
| 2002/0330 | } offset = off%unit->secsize; | |
| 2002/0404 | if(offset+len > nb*unit->secsize) len = nb*unit->secsize - offset; | |
| 2002/0330 | if(write){ if(offset || (len%unit->secsize)){ l = unit->dev->ifc->bio(unit, 0, 0, b, nb, bno); | |
| 2002/0330/sys/src/9/port/devwpsd.c:1081,1086 – 2002/0404/sys/src/9/port/devwpsd.c:1096,1102 | ||
| 2002/0330 | sdwrite(Chan* c, void* a, long n, vlong off) { Cmdbuf *cb; | |
| 2002/0404 | Cmdtab *ct; | |
| 2002/0330 | SDreq *req; SDunit *unit; SDev *sdev; | |
| 2002/0330/sys/src/9/port/devwpsd.c:1130,1147 – 2002/0404/sys/src/9/port/devwpsd.c:1146,1163 | ||
| 2002/0330 | error(Ebadarg); } | |
| 2002/0404 | if(wpsddevtab.config == nil) | |
| 2002/0330 | error("No configuration function"); | |
| 2002/0404 | wpsddevtab.config(cd.o_on, cd.o_spec, &cd.o_cf); | |
| 2002/0330 | break; } case Qctl: | |
| 2002/0404 | cb = parsecmd(a, n); | |
| 2002/0330 | qlock(&unit->ctl); if(waserror()){ qunlock(&unit->ctl); | |
| 2002/0330/sys/src/9/port/devwpsd.c:1152,1180 – 2002/0404/sys/src/9/port/devwpsd.c:1168,1194 | ||
| 2002/0330 | if(unit->vers != c->qid.vers) error(Eio); | |
| 2002/0404 | ct = lookupcmd(cb, ctlmsg, nelem(ctlmsg)); switch(ct->index) { case CMpart: | |
| 2002/0330 | if(unit->sectors == 0 && !sdinitpart(unit)) error(Eio); start = strtoul(cb->f[2], 0, 0); end = strtoul(cb->f[3], 0, 0); sdaddpart(unit, cb->f[1], start, end); | |
| 2002/0404 | break; case CMdelpart: | |
| 2002/0330 | sddelpart(unit, cb->f[1]); | |
| 2002/0404 | break; case CMwildcard: if(unit->dev->ifc->wctl == nil) error(Ebadctl); | |
| 2002/0330 | unit->dev->ifc->wctl(unit, cb); | |
| 2002/0404 | break; } poperror(); | |
| 2002/0330 | qunlock(&unit->ctl); decref(&sdev->r); | |
| 2002/0330/sys/src/9/port/devwpsd.c:1448,1454 – 2002/0404/sys/src/9/port/devwpsd.c:1462,1468 | ||
| 2002/0330 | return unconfigure(spec); } | |
| 2002/0404 | Dev wpwpsddevtab = { | |
| 2002/0330 | 'S', "sd", | |