13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include "iotrack.h"
43e12c5d1SDavid du Colombier #include "dat.h"
53e12c5d1SDavid du Colombier #include "fns.h"
63e12c5d1SDavid du Colombier
77dd7cddfSDavid du Colombier int readonly;
87dd7cddfSDavid du Colombier
93e12c5d1SDavid du Colombier static int
deverror(char * name,Xfs * xf,long addr,long n,long nret)103e12c5d1SDavid du Colombier deverror(char *name, Xfs *xf, long addr, long n, long nret)
113e12c5d1SDavid du Colombier {
127dd7cddfSDavid du Colombier errno = Eio;
133e12c5d1SDavid du Colombier if(nret < 0){
14*9a747e4fSDavid du Colombier chat("%s errstr=\"%r\"...", name);
153e12c5d1SDavid du Colombier close(xf->dev);
163e12c5d1SDavid du Colombier xf->dev = -1;
173e12c5d1SDavid du Colombier return -1;
183e12c5d1SDavid du Colombier }
19*9a747e4fSDavid du Colombier fprint(2, "dev %d sector %ld, %s: %ld, should be %ld\n", xf->dev, addr, name, nret, n);
203e12c5d1SDavid du Colombier return -1;
213e12c5d1SDavid du Colombier }
223e12c5d1SDavid du Colombier
233e12c5d1SDavid du Colombier int
devread(Xfs * xf,long addr,void * buf,long n)243e12c5d1SDavid du Colombier devread(Xfs *xf, long addr, void *buf, long n)
253e12c5d1SDavid du Colombier {
263e12c5d1SDavid du Colombier long nread;
27*9a747e4fSDavid du Colombier
283e12c5d1SDavid du Colombier if(xf->dev < 0)
293e12c5d1SDavid du Colombier return -1;
30*9a747e4fSDavid du Colombier nread = pread(xf->dev, buf, n, xf->offset+(vlong)addr*Sectorsize);
313e12c5d1SDavid du Colombier if (nread == n)
323e12c5d1SDavid du Colombier return 0;
333e12c5d1SDavid du Colombier return deverror("read", xf, addr, n, nread);
343e12c5d1SDavid du Colombier }
353e12c5d1SDavid du Colombier
363e12c5d1SDavid du Colombier int
devwrite(Xfs * xf,long addr,void * buf,long n)373e12c5d1SDavid du Colombier devwrite(Xfs *xf, long addr, void *buf, long n)
383e12c5d1SDavid du Colombier {
393e12c5d1SDavid du Colombier long nwrite;
40*9a747e4fSDavid du Colombier
41*9a747e4fSDavid du Colombier if(xf->omode==OREAD)
427dd7cddfSDavid du Colombier return -1;
437dd7cddfSDavid du Colombier
443e12c5d1SDavid du Colombier if(xf->dev < 0)
453e12c5d1SDavid du Colombier return -1;
46*9a747e4fSDavid du Colombier nwrite = pwrite(xf->dev, buf, n, xf->offset+(vlong)addr*Sectorsize);
473e12c5d1SDavid du Colombier if (nwrite == n)
483e12c5d1SDavid du Colombier return 0;
493e12c5d1SDavid du Colombier return deverror("write", xf, addr, n, nwrite);
503e12c5d1SDavid du Colombier }
51219b2ee8SDavid du Colombier
52219b2ee8SDavid du Colombier int
devcheck(Xfs * xf)53219b2ee8SDavid du Colombier devcheck(Xfs *xf)
54219b2ee8SDavid du Colombier {
55219b2ee8SDavid du Colombier char buf[Sectorsize];
56219b2ee8SDavid du Colombier
57219b2ee8SDavid du Colombier if(xf->dev < 0)
58219b2ee8SDavid du Colombier return -1;
59*9a747e4fSDavid du Colombier if(pread(xf->dev, buf, Sectorsize, 0) != Sectorsize){
60219b2ee8SDavid du Colombier close(xf->dev);
61219b2ee8SDavid du Colombier xf->dev = -1;
62219b2ee8SDavid du Colombier return -1;
63219b2ee8SDavid du Colombier }
64219b2ee8SDavid du Colombier return 0;
65219b2ee8SDavid du Colombier }
66