xref: /inferno-os/libnandfs/writepageauxilliary.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 /*
737da2899SCharles.Forsyth  * update the tags in a page's auxiliary area
837da2899SCharles.Forsyth  * only touch the fields if they contain some zeros, and compute the hamming codes
937da2899SCharles.Forsyth  * as well
1037da2899SCharles.Forsyth  */
1137da2899SCharles.Forsyth 
1237da2899SCharles.Forsyth char *
nandfswritepageauxiliary(Nandfs * nandfs,NandfsTags * tags,long absblock,int page)1337da2899SCharles.Forsyth nandfswritepageauxiliary(Nandfs *nandfs, NandfsTags *tags, long absblock, int page)
1437da2899SCharles.Forsyth {
1537da2899SCharles.Forsyth 	NandfsAuxiliary hdr;
1637da2899SCharles.Forsyth 	ulong tmp;
1737da2899SCharles.Forsyth 	ushort htmp;
1837da2899SCharles.Forsyth 
1937da2899SCharles.Forsyth 	memset(&hdr, 0xff, sizeof(hdr));
2037da2899SCharles.Forsyth 	if (tags->path < NandfsPathMask) {
2137da2899SCharles.Forsyth 		tmp = _nandfshamming31_26calc((tags->path << 6)) | (1 << 5);
2237da2899SCharles.Forsyth 		putbig4(hdr.parth, tmp);
2337da2899SCharles.Forsyth 	}
2437da2899SCharles.Forsyth 	if (tags->nerase < NandfsNeraseMask || tags->magic != 0xff) {
2537da2899SCharles.Forsyth 		tmp = _nandfshamming31_26calc((tags->magic << 24) | (tags->nerase << 6)) | (1 << 5);
2637da2899SCharles.Forsyth 		htmp = tmp >> 16;
2737da2899SCharles.Forsyth 		putbig2(hdr.nerasemagicmsw, htmp);
2837da2899SCharles.Forsyth 		putbig2(hdr.nerasemagiclsw, tmp);
2937da2899SCharles.Forsyth 	}
3037da2899SCharles.Forsyth 	if  (tags->tag != 0xff)
3137da2899SCharles.Forsyth 		hdr.tag = tags->tag;
3237da2899SCharles.Forsyth 	return (*nandfs->write)(nandfs->magic, &hdr, sizeof(hdr), nandfs->rawblocksize * absblock + page * NandfsFullSize + NandfsPageSize);
3337da2899SCharles.Forsyth }
34