Charles.Forsyth20060303a828770d19 years agoHistory
102 lines · 3.2 KB · C
RawDownload
#include "lib9.h"#include "logfs.h"#include "nandfs.h"#include "local.h" uchar _nandfsvalidtags[] = {	LogfsTnone,	LogfsTboot,	LogfsTlog,	LogfsTdata,}; int _nandfsvalidtagscount = nelem(_nandfsvalidtags); static intl2(long n){	int i;	for (i = 0; i < 32; i++)		if ((1 << i) >= n)			return i;	return 0;} char *nandfsinit(void *magic, long rawsize, long rawblocksize,	char *(*read)(void *magic, void *buf, long nbytes, ulong offset),	char *(*write)(void *magic, void *buf, long nbytes, ulong offset),	char *(*erase)(void *magic, long blockaddr),	char *(*sync)(void *magic),	LogfsLowLevel **llp){	Nandfs *nandfs;	nandfs = nandfsrealloc(nil, sizeof(*nandfs));	if (nandfs == nil)		return Enomem;	if (rawblocksize % NandfsFullSize)		return "unsupported block size";	if (rawsize % rawblocksize)		return "size not multiple of block size";	nandfs->read = read;	nandfs->write = write;	nandfs->erase = erase;	nandfs->sync = sync;	nandfs->magic = magic;	nandfs->limitblock = rawsize / rawblocksize;//print("rawsize %ld\n", rawsize);//print("rawblocksize %ld\n", rawblocksize);//print("limitblock %ld\n", nandfs->limitblock);	nandfs->rawblocksize = rawblocksize;	/* fill in upper interface */	nandfs->ll.pathbits = NandfsPathBits;	nandfs->ll.blocks = 0;	nandfs->ll.l2pagesize = NandfsL2PageSize;	nandfs->ll.l2pagesperblock = l2(rawblocksize / NandfsFullSize);	nandfs->ll.open = (LOGFSOPENFN *)nandfsopen;	nandfs->ll.getblocktag = (LOGFSGETBLOCKTAGFN *)nandfsgettag;	nandfs->ll.setblocktag = (LOGFSSETBLOCKTAGFN *)nandfssettag;	nandfs->ll.getblockpath = (LOGFSGETBLOCKPATHFN *)nandfsgetpath;	nandfs->ll.setblockpath = (LOGFSSETBLOCKPATHFN *)nandfssetpath;	nandfs->ll.getblockpartialformatstatus = (LOGFSGETBLOCKPARTIALFORMATSTATUSFN *)nandfsgetblockpartialformatstatus;	nandfs->ll.findfreeblock = (LOGFSFINDFREEBLOCKFN *)nandfsfindfreeblock;	nandfs->ll.readpagerange = (LOGFSREADPAGERANGEFN *)nandfsreadpagerange;	nandfs->ll.writepage = (LOGFSWRITEPAGEFN *)nandfswritepage;	nandfs->ll.readblock = (LOGFSREADBLOCKFN *)nandfsreadblock;	nandfs->ll.writeblock = (LOGFSWRITEBLOCKFN *)nandfswriteblock;	nandfs->ll.eraseblock = (LOGFSERASEBLOCKFN *)nandfseraseblock;	nandfs->ll.formatblock = (LOGFSFORMATBLOCKFN *)nandfsformatblock;	nandfs->ll.reformatblock = (LOGFSREFORMATBLOCKFN *)nandfsreformatblock;	nandfs->ll.markblockbad = (LOGFSMARKBLOCKBADFN *)nandfsmarkblockbad;	nandfs->ll.getbaseblock = (LOGFSGETBASEBLOCKFN *)nandfsgetbaseblock;	nandfs->ll.getblocksize = (LOGFSGETBLOCKSIZEFN *)nandfsgetblocksize;	nandfs->ll.calcrawaddress = (LOGFSCALCRAWADDRESSFN *)nandfscalcrawaddress;	nandfs->ll.getblockstatus = (LOGFSGETBLOCKSTATUSFN *)nandfsgetblockstatus;	nandfs->ll.calcformat = (LOGFSCALCFORMATFN *)nandfscalcformat;	nandfs->ll.getopenstatus = (LOGFSGETOPENSTATUSFN *)nandfsgetopenstatus;	nandfs->ll.free = (LOGFSFREEFN *)nandfsfree;	nandfs->ll.sync = (LOGFSSYNCFN *)nandfssync;	*llp = (LogfsLowLevel *)nandfs;	return nil;} voidnandfsfree(Nandfs *nandfs){	if (nandfs) {		nandfsfreemem(nandfs->blockdata);		nandfsfreemem(nandfs);	}} voidnandfssetmagic(Nandfs *nandfs, void *magic){	nandfs->magic = magic;} char *nandfssync(Nandfs *nandfs){	return (*nandfs->sync)(nandfs->magic);}