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