summaryrefslogtreecommitdiff
path: root/libnandfs/markblockbad.c
blob: 6414c8d24b8d5ec93f2bc12bd213908a9c816cdb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "lib9.h"
#include "logfs.h"
#include "nandfs.h"
#include "local.h"

char *
nandfsmarkabsblockbad(Nandfs *nandfs, long absblock)
{
	NandfsAuxiliary hdr;
	int page;
	int ppb;

	memset(&hdr, 0xff, sizeof(hdr));
	hdr.blockstatus = 0xf0;		// late failure

	ppb = 1 << nandfs->ll.l2pagesperblock;
	for (page = 0; page < ppb; page++) {
		char *errmsg = (*nandfs->write)(nandfs->magic, &hdr, sizeof(hdr), nandfs->rawblocksize * absblock + page * NandfsFullSize + NandfsPageSize);
		if (errmsg && strcmp(errmsg, Eio) != 0)
			return errmsg;
	}

	return nil;
}

char *
nandfsmarkblockbad(Nandfs *nandfs, long block)
{
	char *errmsg;
	errmsg = nandfsmarkabsblockbad(nandfs, block + nandfs->baseblock);
	if (errmsg)
		return errmsg;

	if (nandfs->blockdata) {
		NandfsBlockData *d;
		d = &nandfs->blockdata[block];
		d->tag = LogfsTbad;
	}

	return nil;
}