xref: /plan9/sys/src/cmd/dossrv/devio.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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 
73e12c5d1SDavid du Colombier static int
83e12c5d1SDavid du Colombier deverror(char *name, Xfs *xf, long addr, long n, long nret)
93e12c5d1SDavid du Colombier {
103e12c5d1SDavid du Colombier 	char errbuf[ERRLEN];
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier 	if(nret < 0){
133e12c5d1SDavid du Colombier 		errstr(errbuf);
143e12c5d1SDavid du Colombier 		chat("%s errstr=\"%s\"...", name, errbuf);
153e12c5d1SDavid du Colombier 		close(xf->dev);
163e12c5d1SDavid du Colombier 		xf->dev = -1;
173e12c5d1SDavid du Colombier 		/*if(strcmp(errbuf, "disk changed") == 0)*/
183e12c5d1SDavid du Colombier 			return -1;
193e12c5d1SDavid du Colombier 	}
203e12c5d1SDavid du Colombier 	fprint(2, "dev %d sector %d, %s: %d, should be %d\n",
21*219b2ee8SDavid du Colombier 		xf->dev, addr, name, nret, n);
223e12c5d1SDavid du Colombier 	panic(name);
233e12c5d1SDavid du Colombier 	return -1;
243e12c5d1SDavid du Colombier }
253e12c5d1SDavid du Colombier 
263e12c5d1SDavid du Colombier int
273e12c5d1SDavid du Colombier devread(Xfs *xf, long addr, void *buf, long n)
283e12c5d1SDavid du Colombier {
293e12c5d1SDavid du Colombier 	long nread;
303e12c5d1SDavid du Colombier /*
313e12c5d1SDavid du Colombier  *	chat("devread %d,%d...", dev, addr);
323e12c5d1SDavid du Colombier  */
333e12c5d1SDavid du Colombier 	if(xf->dev < 0)
343e12c5d1SDavid du Colombier 		return -1;
353e12c5d1SDavid du Colombier 	seek(xf->dev, xf->offset+addr*Sectorsize, 0);
363e12c5d1SDavid du Colombier 	nread = read(xf->dev, buf, n);
373e12c5d1SDavid du Colombier 	if (nread == n)
383e12c5d1SDavid du Colombier 		return 0;
393e12c5d1SDavid du Colombier 	return deverror("read", xf, addr, n, nread);
403e12c5d1SDavid du Colombier }
413e12c5d1SDavid du Colombier 
423e12c5d1SDavid du Colombier int
433e12c5d1SDavid du Colombier devwrite(Xfs *xf, long addr, void *buf, long n)
443e12c5d1SDavid du Colombier {
453e12c5d1SDavid du Colombier 	long nwrite;
463e12c5d1SDavid du Colombier /*
473e12c5d1SDavid du Colombier  *	chat("devwrite %d,%d...", p->dev, p->addr);
483e12c5d1SDavid du Colombier  */
493e12c5d1SDavid du Colombier 	if(xf->dev < 0)
503e12c5d1SDavid du Colombier 		return -1;
513e12c5d1SDavid du Colombier 	seek(xf->dev, xf->offset+addr*Sectorsize, 0);
523e12c5d1SDavid du Colombier 	nwrite = write(xf->dev, buf, n);
533e12c5d1SDavid du Colombier 	if (nwrite == n)
543e12c5d1SDavid du Colombier 		return 0;
553e12c5d1SDavid du Colombier 	return deverror("write", xf, addr, n, nwrite);
563e12c5d1SDavid du Colombier }
57*219b2ee8SDavid du Colombier 
58*219b2ee8SDavid du Colombier int
59*219b2ee8SDavid du Colombier devcheck(Xfs *xf)
60*219b2ee8SDavid du Colombier {
61*219b2ee8SDavid du Colombier 	char buf[Sectorsize];
62*219b2ee8SDavid du Colombier 
63*219b2ee8SDavid du Colombier 	if(xf->dev < 0)
64*219b2ee8SDavid du Colombier 		return -1;
65*219b2ee8SDavid du Colombier 	seek(xf->dev, 0, 0);
66*219b2ee8SDavid du Colombier 	if(read(xf->dev, buf, Sectorsize) != Sectorsize){
67*219b2ee8SDavid du Colombier 		close(xf->dev);
68*219b2ee8SDavid du Colombier 		xf->dev = -1;
69*219b2ee8SDavid du Colombier 		return -1;
70*219b2ee8SDavid du Colombier 	}
71*219b2ee8SDavid du Colombier 	return 0;
72*219b2ee8SDavid du Colombier }
73