xref: /plan9-contrib/sys/src/cmd/dossrv/devio.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <u.h>
2 #include <libc.h>
3 #include "iotrack.h"
4 #include "dat.h"
5 #include "fns.h"
6 
7 static int
8 deverror(char *name, Xfs *xf, long addr, long n, long nret)
9 {
10 	char errbuf[ERRLEN];
11 
12 	if(nret < 0){
13 		errstr(errbuf);
14 		chat("%s errstr=\"%s\"...", name, errbuf);
15 		close(xf->dev);
16 		xf->dev = -1;
17 		/*if(strcmp(errbuf, "disk changed") == 0)*/
18 			return -1;
19 	}
20 	fprint(2, "dev %d sector %d, %s: %d, should be %d\n",
21 		xf->dev, addr, name, nret, n);
22 	panic(name);
23 	return -1;
24 }
25 
26 int
27 devread(Xfs *xf, long addr, void *buf, long n)
28 {
29 	long nread;
30 /*
31  *	chat("devread %d,%d...", dev, addr);
32  */
33 	if(xf->dev < 0)
34 		return -1;
35 	seek(xf->dev, xf->offset+addr*Sectorsize, 0);
36 	nread = read(xf->dev, buf, n);
37 	if (nread == n)
38 		return 0;
39 	return deverror("read", xf, addr, n, nread);
40 }
41 
42 int
43 devwrite(Xfs *xf, long addr, void *buf, long n)
44 {
45 	long nwrite;
46 /*
47  *	chat("devwrite %d,%d...", p->dev, p->addr);
48  */
49 	if(xf->dev < 0)
50 		return -1;
51 	seek(xf->dev, xf->offset+addr*Sectorsize, 0);
52 	nwrite = write(xf->dev, buf, n);
53 	if (nwrite == n)
54 		return 0;
55 	return deverror("write", xf, addr, n, nwrite);
56 }
57 
58 int
59 devcheck(Xfs *xf)
60 {
61 	char buf[Sectorsize];
62 
63 	if(xf->dev < 0)
64 		return -1;
65 	seek(xf->dev, 0, 0);
66 	if(read(xf->dev, buf, Sectorsize) != Sectorsize){
67 		close(xf->dev);
68 		xf->dev = -1;
69 		return -1;
70 	}
71 	return 0;
72 }
73