From c59efa05ac069005ef559093493c0cdc06f8cc78 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 15 Aug 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-08-15 --- pc/devhard.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/pc/devhard.c b/pc/devhard.c index 4016b6617d207a67e0f7a21313a155eed3361577..4e4a8b370eb2144e78f33cc4c50722b07e4105a2 100644 --- a/pc/devhard.c +++ b/pc/devhard.c @@ -137,8 +137,9 @@ struct Controller int tsec; /* target sector */ int tbyte; /* target byte */ int len; /* length of transfer (bytes) */ - int secs; /* sectors to be xferred */ + int toxfer; /* bytes to be xferred */ int sofar; /* bytes transferred so far */ + int toskip; /* bytes to skip over */ int status; int error; Drive *dp; /* drive being accessed */ @@ -390,13 +391,8 @@ hardxfer(Drive *dp, Partition *pp, int cmd, void *va, long off, long len) if(dp->online == 0) errors("disk offline"); - if(len % dp->bytes) - errors("bad length"); /* BUG - this shouldn't be a problem */ - if(off % dp->bytes) - errors("bad offset"); /* BUG - this shouldn't be a problem */ - -print("hardxfer %ld %ld\n", off, len); -print("hardxfer part %s %ld %ld\n", pp->name, pp->start, pp->end); + if(len > Maxxfer) + len = Maxxfer; cp = dp->cp; qlock(cp); @@ -417,9 +413,9 @@ print("hardxfer part %s %ld %ld\n", pp->name, pp->start, pp->end); cp->thead = (lsec/dp->sectors) % dp->heads; /* - * can't xfer across cylinder boundaries. + * can't xfer across cylinder boundaries or end of disk */ - lsec = (off+len)/dp->bytes; + lsec = (off+len+dp->bytes-1)/dp->bytes; lsec += pp->start; if(lsec > pp->end) errors("xfer past end of partition\n"); @@ -434,7 +430,7 @@ print("hardxfer part %s %ld %ld\n", pp->name, pp->start, pp->end); /* * start the transfer */ - cp->secs = cp->len/dp->bytes; + cp->toskip = off % dp->bytes; cp->sofar = 0; cp->cmd = cmd; cp->dp = dp; @@ -510,7 +506,7 @@ print("waserror in hardident\n"); cmdreadywait(cp); cp->len = 512; - cp->secs = 1; + cp->toskip = 0; cp->sofar = 0; cp->cmd = Cident; cp->dp = dp; @@ -643,8 +639,8 @@ hardintr(Ureg *ur) panic("hardintr 2"); inss(cp->pbase+Pdata, &cp->buf[cp->sofar*cp->dp->bytes], cp->dp->bytes/2); - cp->sofar++; - if(cp->sofar == cp->secs){ + cp->sofar += cp->dp->bytes; + if(cp->sofar >= cp->len){ cp->cmd = 0; wakeup(&cp->r); }