xref: /inferno-os/libnandfs/markblockbad.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 *
nandfsmarkabsblockbad(Nandfs * nandfs,long absblock)737da2899SCharles.Forsyth nandfsmarkabsblockbad(Nandfs *nandfs, long absblock)
837da2899SCharles.Forsyth {
937da2899SCharles.Forsyth 	NandfsAuxiliary hdr;
1037da2899SCharles.Forsyth 	int page;
1137da2899SCharles.Forsyth 	int ppb;
1237da2899SCharles.Forsyth 
1337da2899SCharles.Forsyth 	memset(&hdr, 0xff, sizeof(hdr));
1437da2899SCharles.Forsyth 	hdr.blockstatus = 0xf0;		// late failure
1537da2899SCharles.Forsyth 
1637da2899SCharles.Forsyth 	ppb = 1 << nandfs->ll.l2pagesperblock;
1737da2899SCharles.Forsyth 	for (page = 0; page < ppb; page++) {
1837da2899SCharles.Forsyth 		char *errmsg = (*nandfs->write)(nandfs->magic, &hdr, sizeof(hdr), nandfs->rawblocksize * absblock + page * NandfsFullSize + NandfsPageSize);
1937da2899SCharles.Forsyth 		if (errmsg && strcmp(errmsg, Eio) != 0)
2037da2899SCharles.Forsyth 			return errmsg;
2137da2899SCharles.Forsyth 	}
2237da2899SCharles.Forsyth 
2337da2899SCharles.Forsyth 	return nil;
2437da2899SCharles.Forsyth }
2537da2899SCharles.Forsyth 
2637da2899SCharles.Forsyth char *
nandfsmarkblockbad(Nandfs * nandfs,long block)2737da2899SCharles.Forsyth nandfsmarkblockbad(Nandfs *nandfs, long block)
2837da2899SCharles.Forsyth {
2937da2899SCharles.Forsyth 	char *errmsg;
3037da2899SCharles.Forsyth 	errmsg = nandfsmarkabsblockbad(nandfs, block + nandfs->baseblock);
3137da2899SCharles.Forsyth 	if (errmsg)
3237da2899SCharles.Forsyth 		return errmsg;
3337da2899SCharles.Forsyth 
3437da2899SCharles.Forsyth 	if (nandfs->blockdata) {
3537da2899SCharles.Forsyth 		NandfsBlockData *d;
3637da2899SCharles.Forsyth 		d = &nandfs->blockdata[block];
3737da2899SCharles.Forsyth 		d->tag = LogfsTbad;
3837da2899SCharles.Forsyth 	}
3937da2899SCharles.Forsyth 
4037da2899SCharles.Forsyth 	return nil;
4137da2899SCharles.Forsyth }
4237da2899SCharles.Forsyth 
43