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