From 37da2899f40661e3e9631e497da8dc59b971cbd0 Mon Sep 17 00:00:00 2001 From: "Charles.Forsyth" Date: Fri, 22 Dec 2006 17:07:39 +0000 Subject: 20060303a --- libnandfs/writeblock.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 libnandfs/writeblock.c (limited to 'libnandfs/writeblock.c') diff --git a/libnandfs/writeblock.c b/libnandfs/writeblock.c new file mode 100644 index 00000000..0e4b9c3d --- /dev/null +++ b/libnandfs/writeblock.c @@ -0,0 +1,47 @@ +#include "lib9.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; +} -- cgit v1.2.3