Only change devsd version number when media size changes. Do not change when it is zero and remains zero. Also, remove useless and confusing > lines in: switch(unit->state){ ... case Rawdata: > if(unit->state != Rawdata) > error(Ebadusefd); ... } Reference: /n/sources/patch/applied/devsd-version Date: Mon May 7 16:08:12 CES 2007 Signed-off-by: rsc@swtch.com --- /sys/src/9/port/devsd.c Mon May 7 16:06:14 2007 +++ /sys/src/9/port/devsd.c Mon May 7 16:06:14 2007 @@ -159,21 +159,31 @@ pp->vers++; } -static int -sdinitpart(SDunit* unit) +static void +sdincvers(SDunit *unit) { - int i, nf; - ulong start, end; - char *f[4], *p, *q, buf[10]; + int i; unit->vers++; - unit->sectors = unit->secsize = 0; if(unit->part){ for(i = 0; i < unit->npart; i++){ unit->part[i].valid = 0; unit->part[i].vers++; } } +} + +static int +sdinitpart(SDunit* unit) +{ + int nf; + ulong start, end; + char *f[4], *p, *q, buf[10]; + + if(unit->sectors > 0){ + unit->sectors = unit->secsize = 0; + sdincvers(unit); + } if(unit->inquiry[0] & 0xC0) return 0; @@ -190,6 +200,7 @@ if(unit->dev->ifc->online) unit->dev->ifc->online(unit); if(unit->sectors){ + sdincvers(unit); sdaddpart(unit, "data", 0, unit->sectors); /* @@ -1311,10 +1322,7 @@ error(Ebadusefd); case Rawdata: - if(unit->state != Rawdata) - error(Ebadusefd); unit->state = Rawstatus; - unit->req->write = 1; n = sdrio(unit->req, a, n); }