writeblock.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "nandfs.h"
  4. #include "local.h"
  5. char *
  6. nandfswriteblock(Nandfs *nandfs, void *buf, uchar tag, ulong path, int xcount, long *data, long block)
  7. {
  8. int p;
  9. char *errmsg;
  10. ulong opath = nandfsgetpath(nandfs, block);
  11. ulong writepath = (~opath | path) & NandfsPathMask;
  12. uchar writetag = ~nandfsgettag(nandfs, block) | tag;
  13. int ppb = 1 << nandfs->ll.l2pagesperblock;
  14. for (p = 0; p < ppb; p++) {
  15. ulong wp;
  16. if (p > 0 && p <= 2 + xcount) {
  17. switch (p) {
  18. case 1:
  19. wp = (~opath | nandfsgetbaseblock(nandfs)) & NandfsPathMask;
  20. break;
  21. case 2:
  22. wp = (~opath | nandfs->ll.blocks) & NandfsPathMask;
  23. break;
  24. default:
  25. wp = (~opath | data[p - 3]) & NandfsPathMask;
  26. break;
  27. }
  28. }
  29. else
  30. wp = writepath;
  31. errmsg = nandfsupdatepage(nandfs, buf, wp, writetag, block, p);
  32. if (errmsg)
  33. return errmsg;
  34. #ifdef LOGFSTEST
  35. if (logfstest.partialupdate && p > 0) {
  36. print("skipping pageupdate\n");
  37. break;
  38. }
  39. #endif
  40. buf = (uchar *)buf + NandfsPageSize;
  41. }
  42. return nil;
  43. }