13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include "iotrack.h" 43e12c5d1SDavid du Colombier #include "dat.h" 53e12c5d1SDavid du Colombier #include "fns.h" 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier static int 83e12c5d1SDavid du Colombier deverror(char *name, Xfs *xf, long addr, long n, long nret) 93e12c5d1SDavid du Colombier { 103e12c5d1SDavid du Colombier char errbuf[ERRLEN]; 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier if(nret < 0){ 133e12c5d1SDavid du Colombier errstr(errbuf); 143e12c5d1SDavid du Colombier chat("%s errstr=\"%s\"...", name, errbuf); 153e12c5d1SDavid du Colombier close(xf->dev); 163e12c5d1SDavid du Colombier xf->dev = -1; 173e12c5d1SDavid du Colombier /*if(strcmp(errbuf, "disk changed") == 0)*/ 183e12c5d1SDavid du Colombier return -1; 193e12c5d1SDavid du Colombier } 203e12c5d1SDavid du Colombier fprint(2, "dev %d sector %d, %s: %d, should be %d\n", 21*219b2ee8SDavid du Colombier xf->dev, addr, name, nret, n); 223e12c5d1SDavid du Colombier panic(name); 233e12c5d1SDavid du Colombier return -1; 243e12c5d1SDavid du Colombier } 253e12c5d1SDavid du Colombier 263e12c5d1SDavid du Colombier int 273e12c5d1SDavid du Colombier devread(Xfs *xf, long addr, void *buf, long n) 283e12c5d1SDavid du Colombier { 293e12c5d1SDavid du Colombier long nread; 303e12c5d1SDavid du Colombier /* 313e12c5d1SDavid du Colombier * chat("devread %d,%d...", dev, addr); 323e12c5d1SDavid du Colombier */ 333e12c5d1SDavid du Colombier if(xf->dev < 0) 343e12c5d1SDavid du Colombier return -1; 353e12c5d1SDavid du Colombier seek(xf->dev, xf->offset+addr*Sectorsize, 0); 363e12c5d1SDavid du Colombier nread = read(xf->dev, buf, n); 373e12c5d1SDavid du Colombier if (nread == n) 383e12c5d1SDavid du Colombier return 0; 393e12c5d1SDavid du Colombier return deverror("read", xf, addr, n, nread); 403e12c5d1SDavid du Colombier } 413e12c5d1SDavid du Colombier 423e12c5d1SDavid du Colombier int 433e12c5d1SDavid du Colombier devwrite(Xfs *xf, long addr, void *buf, long n) 443e12c5d1SDavid du Colombier { 453e12c5d1SDavid du Colombier long nwrite; 463e12c5d1SDavid du Colombier /* 473e12c5d1SDavid du Colombier * chat("devwrite %d,%d...", p->dev, p->addr); 483e12c5d1SDavid du Colombier */ 493e12c5d1SDavid du Colombier if(xf->dev < 0) 503e12c5d1SDavid du Colombier return -1; 513e12c5d1SDavid du Colombier seek(xf->dev, xf->offset+addr*Sectorsize, 0); 523e12c5d1SDavid du Colombier nwrite = write(xf->dev, buf, n); 533e12c5d1SDavid du Colombier if (nwrite == n) 543e12c5d1SDavid du Colombier return 0; 553e12c5d1SDavid du Colombier return deverror("write", xf, addr, n, nwrite); 563e12c5d1SDavid du Colombier } 57*219b2ee8SDavid du Colombier 58*219b2ee8SDavid du Colombier int 59*219b2ee8SDavid du Colombier devcheck(Xfs *xf) 60*219b2ee8SDavid du Colombier { 61*219b2ee8SDavid du Colombier char buf[Sectorsize]; 62*219b2ee8SDavid du Colombier 63*219b2ee8SDavid du Colombier if(xf->dev < 0) 64*219b2ee8SDavid du Colombier return -1; 65*219b2ee8SDavid du Colombier seek(xf->dev, 0, 0); 66*219b2ee8SDavid du Colombier if(read(xf->dev, buf, Sectorsize) != Sectorsize){ 67*219b2ee8SDavid du Colombier close(xf->dev); 68*219b2ee8SDavid du Colombier xf->dev = -1; 69*219b2ee8SDavid du Colombier return -1; 70*219b2ee8SDavid du Colombier } 71*219b2ee8SDavid du Colombier return 0; 72*219b2ee8SDavid du Colombier } 73