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