xref: /plan9/sys/src/cmd/dossrv/devio.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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