xref: /inferno-os/libnandfs/readblock.c (revision 68c71d4caea0ad74b14fc837a1b3b595fcfdc1d7)
1 #include "logfsos.h"
2 #include "logfs.h"
3 #include "nandfs.h"
4 #include "local.h"
5 
6 char *
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