readblock.c 917 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "nandfs.h"
  4. #include "local.h"
  5. char *
  6. nandfsreadblock(Nandfs *nandfs, void *buf, long block, LogfsLowLevelReadResult *blocke)
  7. {
  8. int p;
  9. uchar *bp;
  10. int ppb;
  11. *blocke = LogfsLowLevelReadResultOk;
  12. ppb = 1 << nandfs->ll.l2pagesperblock;
  13. for (p = 0, bp = buf; p < ppb; p++, bp += NandfsPageSize) {
  14. LogfsLowLevelReadResult e;
  15. char *errmsg;
  16. errmsg = nandfsreadpage(nandfs, bp, nil, block, p, nandfs->printbad, &e);
  17. if (errmsg)
  18. return errmsg;
  19. switch (e) {
  20. case LogfsLowLevelReadResultOk:
  21. break;
  22. case LogfsLowLevelReadResultSoftError:
  23. if (*blocke == LogfsLowLevelReadResultOk)
  24. *blocke = LogfsLowLevelReadResultSoftError;
  25. break;
  26. case LogfsLowLevelReadResultHardError:
  27. if (*blocke == LogfsLowLevelReadResultOk || *blocke == LogfsLowLevelReadResultSoftError)
  28. *blocke = LogfsLowLevelReadResultHardError;
  29. break;
  30. }
  31. }
  32. return nil;
  33. }