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