forsyth20121205-174063a80cc13 years agoHistory
47 lines · 1.0 KB · C
RawDownload
#include "logfsos.h"#include "logfs.h"#include "nandfs.h"#include "local.h" char *nandfswriteblock(Nandfs *nandfs, void *buf, uchar tag, ulong path, int xcount, long *data, long block){	int p;	char *errmsg; 	ulong opath = nandfsgetpath(nandfs, block);	ulong writepath = (~opath | path) & NandfsPathMask;	uchar writetag = ~nandfsgettag(nandfs, block) | tag;	int ppb = 1 << nandfs->ll.l2pagesperblock; 	for (p = 0; p < ppb; p++) {		ulong wp;		if (p > 0 && p <= 2 + xcount) {			switch (p) {			case 1:				wp = (~opath | nandfsgetbaseblock(nandfs)) & NandfsPathMask;				break;			case 2:				wp = (~opath | nandfs->ll.blocks) & NandfsPathMask;				break;			default:				wp = (~opath | data[p - 3]) & NandfsPathMask;				break;			}		}		else			wp = writepath;		errmsg = nandfsupdatepage(nandfs, buf, wp, writetag, block, p);		if (errmsg)			return errmsg;#ifdef LOGFSTEST		if (logfstest.partialupdate && p > 0) {			print("skipping pageupdate\n");			break;		}#endif		buf = (uchar *)buf + NandfsPageSize;	} 	return nil;}