devio.c 1.1 KB

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