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