markblockbad.c 857 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "nandfs.h"
  4. #include "local.h"
  5. char *
  6. nandfsmarkabsblockbad(Nandfs *nandfs, long absblock)
  7. {
  8. NandfsAuxiliary hdr;
  9. int page;
  10. int ppb;
  11. memset(&hdr, 0xff, sizeof(hdr));
  12. hdr.blockstatus = 0xf0; // late failure
  13. ppb = 1 << nandfs->ll.l2pagesperblock;
  14. for (page = 0; page < ppb; page++) {
  15. char *errmsg = (*nandfs->write)(nandfs->magic, &hdr, sizeof(hdr), nandfs->rawblocksize * absblock + page * NandfsFullSize + NandfsPageSize);
  16. if (errmsg && strcmp(errmsg, Eio) != 0)
  17. return errmsg;
  18. }
  19. return nil;
  20. }
  21. char *
  22. nandfsmarkblockbad(Nandfs *nandfs, long block)
  23. {
  24. char *errmsg;
  25. errmsg = nandfsmarkabsblockbad(nandfs, block + nandfs->baseblock);
  26. if (errmsg)
  27. return errmsg;
  28. if (nandfs->blockdata) {
  29. NandfsBlockData *d;
  30. d = &nandfs->blockdata[block];
  31. d->tag = LogfsTbad;
  32. }
  33. return nil;
  34. }