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 *
nandfsformatblock(Nandfs * nandfs,long absblock,uchar tag,ulong path,long baseblock,long sizeinblocks,int xcount,long * xdata,void * llsave,int * markedbad)737da2899SCharles.Forsyth nandfsformatblock(Nandfs *nandfs, long absblock, uchar tag, ulong path, long baseblock, long sizeinblocks, int xcount, long *xdata, void *llsave, int *markedbad)
837da2899SCharles.Forsyth {
937da2899SCharles.Forsyth int page;
1037da2899SCharles.Forsyth char *rv;
1137da2899SCharles.Forsyth NandfsTags t;
1237da2899SCharles.Forsyth int ppb;
1337da2899SCharles.Forsyth
1437da2899SCharles.Forsyth if (markedbad)
1537da2899SCharles.Forsyth *markedbad = 0;
1637da2899SCharles.Forsyth
1737da2899SCharles.Forsyth t.tag = tag;
1837da2899SCharles.Forsyth t.magic = LogfsMagic;
1937da2899SCharles.Forsyth t.nerase = *(ulong *)llsave < NandfsNeraseMask ? *(ulong *)llsave + 1 : 1;
2037da2899SCharles.Forsyth
2137da2899SCharles.Forsyth ppb = 1 << nandfs->ll.l2pagesperblock;
2237da2899SCharles.Forsyth for (page = 0, rv = nil; rv == nil && page < ppb; page++) {
2337da2899SCharles.Forsyth if (tag == LogfsTboot && page > 0 && page < xcount + 3) {
2437da2899SCharles.Forsyth switch (page) {
2537da2899SCharles.Forsyth case 1:
2637da2899SCharles.Forsyth t.path = baseblock;
2737da2899SCharles.Forsyth break;
2837da2899SCharles.Forsyth case 2:
2937da2899SCharles.Forsyth t.path = sizeinblocks;
3037da2899SCharles.Forsyth break;
3137da2899SCharles.Forsyth default:
3237da2899SCharles.Forsyth t.path = xdata[page - 3];
3337da2899SCharles.Forsyth break;
3437da2899SCharles.Forsyth }
3537da2899SCharles.Forsyth }
3637da2899SCharles.Forsyth else
3737da2899SCharles.Forsyth t.path = path;
3837da2899SCharles.Forsyth rv = nandfswritepageauxiliary(nandfs, &t, absblock, page);
3937da2899SCharles.Forsyth if (rv)
4037da2899SCharles.Forsyth break;
4137da2899SCharles.Forsyth }
4237da2899SCharles.Forsyth
4337da2899SCharles.Forsyth if (rv) {
4437da2899SCharles.Forsyth if (strcmp(rv, Eio) != 0)
4537da2899SCharles.Forsyth return rv;
4637da2899SCharles.Forsyth if (markedbad) {
4737da2899SCharles.Forsyth *markedbad = 1;
4837da2899SCharles.Forsyth rv = nandfsmarkabsblockbad(nandfs, absblock);
4937da2899SCharles.Forsyth if (strcmp(rv, Eio) != 0)
5037da2899SCharles.Forsyth return rv;
5137da2899SCharles.Forsyth return nil;
5237da2899SCharles.Forsyth }
5337da2899SCharles.Forsyth return rv;
5437da2899SCharles.Forsyth }
5537da2899SCharles.Forsyth
5637da2899SCharles.Forsyth return nil;
5737da2899SCharles.Forsyth }
58