xref: /inferno-os/libnandfs/eraseblock.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 *
nandfseraseblock(Nandfs * nandfs,long block,void ** llsavep,int * markedbad)737da2899SCharles.Forsyth nandfseraseblock(Nandfs *nandfs, long block, void **llsavep, int *markedbad)
837da2899SCharles.Forsyth {
937da2899SCharles.Forsyth 	NandfsBlockData *d;
1037da2899SCharles.Forsyth 	char *errmsg;
1137da2899SCharles.Forsyth 
1237da2899SCharles.Forsyth 	if (markedbad)
1337da2899SCharles.Forsyth 		*markedbad = 0;
1437da2899SCharles.Forsyth 
1537da2899SCharles.Forsyth 	errmsg = (*nandfs->erase)(nandfs->magic, nandfs->rawblocksize * (nandfs->baseblock + block));
1637da2899SCharles.Forsyth 	if (errmsg) {
1737da2899SCharles.Forsyth 		if (nandfs->blockdata) {
1837da2899SCharles.Forsyth 			d = &nandfs->blockdata[block];
1937da2899SCharles.Forsyth 			d->tag = LogfsTworse;
2037da2899SCharles.Forsyth 			nandfs->worseblocks = 1;
2137da2899SCharles.Forsyth 		}
2237da2899SCharles.Forsyth 		if (strcmp(errmsg, Eio) != 0)
2337da2899SCharles.Forsyth 			return errmsg;
2437da2899SCharles.Forsyth 		if (markedbad) {
2537da2899SCharles.Forsyth 			*markedbad = 1;
2637da2899SCharles.Forsyth 			errmsg = nandfsmarkblockbad(nandfs, block);
2737da2899SCharles.Forsyth 			if (strcmp(errmsg, Eio) != 0)
2837da2899SCharles.Forsyth 				return errmsg;
2937da2899SCharles.Forsyth 			return nil;
3037da2899SCharles.Forsyth 		}
3137da2899SCharles.Forsyth 		return errmsg;
3237da2899SCharles.Forsyth 	}
3337da2899SCharles.Forsyth 
3437da2899SCharles.Forsyth 	if (nandfs->blockdata) {
3537da2899SCharles.Forsyth 		ulong *llsave;
3637da2899SCharles.Forsyth 		d = &nandfs->blockdata[block];
3737da2899SCharles.Forsyth 		if (llsavep) {
3837da2899SCharles.Forsyth 			llsave = nandfsrealloc(nil, sizeof(ulong));
3937da2899SCharles.Forsyth 			if (llsave == nil)
4037da2899SCharles.Forsyth 				return Enomem;
4137da2899SCharles.Forsyth 			*llsave = d->nerase;
4237da2899SCharles.Forsyth 			*llsavep = llsave;
4337da2899SCharles.Forsyth 		}
4437da2899SCharles.Forsyth 		d->tag = 0xff;
4537da2899SCharles.Forsyth 		d->path = NandfsPathMask;
4637da2899SCharles.Forsyth 		d->nerase = NandfsNeraseMask;
4737da2899SCharles.Forsyth 	}
4837da2899SCharles.Forsyth 	return  nil;
4937da2899SCharles.Forsyth }
5037da2899SCharles.Forsyth 
51