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 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 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 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 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