xref: /inferno-os/libnandfs/readblock.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
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