xref: /inferno-os/libnandfs/markblockbad.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1 #include "logfsos.h"
2 #include "logfs.h"
3 #include "nandfs.h"
4 #include "local.h"
5 
6 char *
nandfsmarkabsblockbad(Nandfs * nandfs,long absblock)7 nandfsmarkabsblockbad(Nandfs *nandfs, long absblock)
8 {
9 	NandfsAuxiliary hdr;
10 	int page;
11 	int ppb;
12 
13 	memset(&hdr, 0xff, sizeof(hdr));
14 	hdr.blockstatus = 0xf0;		// late failure
15 
16 	ppb = 1 << nandfs->ll.l2pagesperblock;
17 	for (page = 0; page < ppb; page++) {
18 		char *errmsg = (*nandfs->write)(nandfs->magic, &hdr, sizeof(hdr), nandfs->rawblocksize * absblock + page * NandfsFullSize + NandfsPageSize);
19 		if (errmsg && strcmp(errmsg, Eio) != 0)
20 			return errmsg;
21 	}
22 
23 	return nil;
24 }
25 
26 char *
nandfsmarkblockbad(Nandfs * nandfs,long block)27 nandfsmarkblockbad(Nandfs *nandfs, long block)
28 {
29 	char *errmsg;
30 	errmsg = nandfsmarkabsblockbad(nandfs, block + nandfs->baseblock);
31 	if (errmsg)
32 		return errmsg;
33 
34 	if (nandfs->blockdata) {
35 		NandfsBlockData *d;
36 		d = &nandfs->blockdata[block];
37 		d->tag = LogfsTbad;
38 	}
39 
40 	return nil;
41 }
42 
43