1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "nandfs.h"
437da2899SCharles.Forsyth #include "local.h"
537da2899SCharles.Forsyth
637da2899SCharles.Forsyth char *
nandfsreadblock(Nandfs * nandfs,void * buf,long block,LogfsLowLevelReadResult * blocke)737da2899SCharles.Forsyth nandfsreadblock(Nandfs *nandfs, void *buf, long block, LogfsLowLevelReadResult *blocke)
837da2899SCharles.Forsyth {
937da2899SCharles.Forsyth int p;
1037da2899SCharles.Forsyth uchar *bp;
1137da2899SCharles.Forsyth int ppb;
1237da2899SCharles.Forsyth
1337da2899SCharles.Forsyth *blocke = LogfsLowLevelReadResultOk;
1437da2899SCharles.Forsyth ppb = 1 << nandfs->ll.l2pagesperblock;
1537da2899SCharles.Forsyth for (p = 0, bp = buf; p < ppb; p++, bp += NandfsPageSize) {
1637da2899SCharles.Forsyth LogfsLowLevelReadResult e;
1737da2899SCharles.Forsyth char *errmsg;
1837da2899SCharles.Forsyth errmsg = nandfsreadpage(nandfs, bp, nil, block, p, nandfs->printbad, &e);
1937da2899SCharles.Forsyth if (errmsg)
2037da2899SCharles.Forsyth return errmsg;
2137da2899SCharles.Forsyth switch (e) {
2237da2899SCharles.Forsyth case LogfsLowLevelReadResultOk:
2337da2899SCharles.Forsyth break;
2437da2899SCharles.Forsyth case LogfsLowLevelReadResultSoftError:
2537da2899SCharles.Forsyth if (*blocke == LogfsLowLevelReadResultOk)
2637da2899SCharles.Forsyth *blocke = LogfsLowLevelReadResultSoftError;
2737da2899SCharles.Forsyth break;
2837da2899SCharles.Forsyth case LogfsLowLevelReadResultHardError:
2937da2899SCharles.Forsyth if (*blocke == LogfsLowLevelReadResultOk || *blocke == LogfsLowLevelReadResultSoftError)
3037da2899SCharles.Forsyth *blocke = LogfsLowLevelReadResultHardError;
3137da2899SCharles.Forsyth break;
3237da2899SCharles.Forsyth }
3337da2899SCharles.Forsyth }
3437da2899SCharles.Forsyth
3537da2899SCharles.Forsyth return nil;
3637da2899SCharles.Forsyth }
37