diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /libnandfs/eraseblock.c | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'libnandfs/eraseblock.c')
| -rw-r--r-- | libnandfs/eraseblock.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libnandfs/eraseblock.c b/libnandfs/eraseblock.c new file mode 100644 index 00000000..2ecd490f --- /dev/null +++ b/libnandfs/eraseblock.c @@ -0,0 +1,50 @@ +#include "lib9.h" +#include "logfs.h" +#include "nandfs.h" +#include "local.h" + +char * +nandfseraseblock(Nandfs *nandfs, long block, void **llsavep, int *markedbad) +{ + NandfsBlockData *d; + char *errmsg; + + if (markedbad) + *markedbad = 0; + + errmsg = (*nandfs->erase)(nandfs->magic, nandfs->rawblocksize * (nandfs->baseblock + block)); + if (errmsg) { + if (nandfs->blockdata) { + d = &nandfs->blockdata[block]; + d->tag = LogfsTworse; + nandfs->worseblocks = 1; + } + if (strcmp(errmsg, Eio) != 0) + return errmsg; + if (markedbad) { + *markedbad = 1; + errmsg = nandfsmarkblockbad(nandfs, block); + if (strcmp(errmsg, Eio) != 0) + return errmsg; + return nil; + } + return errmsg; + } + + if (nandfs->blockdata) { + ulong *llsave; + d = &nandfs->blockdata[block]; + if (llsavep) { + llsave = nandfsrealloc(nil, sizeof(ulong)); + if (llsave == nil) + return Enomem; + *llsave = d->nerase; + *llsavep = llsave; + } + d->tag = 0xff; + d->path = NandfsPathMask; + d->nerase = NandfsNeraseMask; + } + return nil; +} + |
