diff --git a/fs/yaffs2/yaffs_checkptrw.c b/fs/yaffs2/yaffs_checkptrw.c
index 230f78f..997a618 100644
--- a/fs/yaffs2/yaffs_checkptrw.c
+++ b/fs/yaffs2/yaffs_checkptrw.c
@@ -1,7 +1,7 @@
 /*
  * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
  *
- * Copyright (C) 2002-2007 Aleph One Ltd.
+ * Copyright (C) 2002-2011 Aleph One Ltd.
  *   for Toby Churchill Ltd and Brightstar Engineering
  *
  * Created by Charles Manning <charles@aleph1.co.uk>
@@ -11,395 +11,398 @@
  * published by the Free Software Foundation.
  */
 
-/* XXX U-BOOT XXX */
-#include <common.h>
-#include <malloc.h>
-
-const char *yaffs_checkptrw_c_version =
-    "$Id: yaffs_checkptrw.c,v 1.14 2007/05/15 20:07:40 charles Exp $";
-
-
 #include "yaffs_checkptrw.h"
+#include "yaffs_getblockinfo.h"
 
-
-static int yaffs_CheckpointSpaceOk(yaffs_Device *dev)
+static int yaffs2_checkpt_space_ok(struct yaffs_dev *dev)
 {
+	int blocks_avail = dev->n_erased_blocks - dev->param.n_reserved_blocks;
 
-	int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks;
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+		"checkpt blocks_avail = %d", blocks_avail);
 
-	T(YAFFS_TRACE_CHECKPOINT,
-		(TSTR("checkpt blocks available = %d" TENDSTR),
-		blocksAvailable));
-
-
-	return (blocksAvailable <= 0) ? 0 : 1;
+	return (blocks_avail <= 0) ? 0 : 1;
 }
 
-
-static int yaffs_CheckpointErase(yaffs_Device *dev)
+static int yaffs_checkpt_erase(struct yaffs_dev *dev)
 {
-
 	int i;
 
-
-	if(!dev->eraseBlockInNAND)
+	if (!dev->param.erase_fn)
 		return 0;
-	T(YAFFS_TRACE_CHECKPOINT,(TSTR("checking blocks %d to %d"TENDSTR),
-		dev->internalStartBlock,dev->internalEndBlock));
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+		"checking blocks %d to %d",
+		dev->internal_start_block, dev->internal_end_block);
 
-	for(i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-		yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-		if(bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT){
-			T(YAFFS_TRACE_CHECKPOINT,(TSTR("erasing checkpt block %d"TENDSTR),i));
-			if(dev->eraseBlockInNAND(dev,i- dev->blockOffset /* realign */)){
-				bi->blockState = YAFFS_BLOCK_STATE_EMPTY;
-				dev->nErasedBlocks++;
-				dev->nFreeChunks += dev->nChunksPerBlock;
-			}
-			else {
-				dev->markNANDBlockBad(dev,i);
-				bi->blockState = YAFFS_BLOCK_STATE_DEAD;
+	for (i = dev->internal_start_block; i <= dev->internal_end_block; i++) {
+		struct yaffs_block_info *bi = yaffs_get_block_info(dev, i);
+		if (bi->block_state == YAFFS_BLOCK_STATE_CHECKPOINT) {
+			yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+			"erasing checkpt block %d", i);
+
+			dev->n_erasures++;
+
+			if (dev->param.
+			    erase_fn(dev,
+				     i - dev->block_offset /* realign */)) {
+				bi->block_state = YAFFS_BLOCK_STATE_EMPTY;
+				dev->n_erased_blocks++;
+				dev->n_free_chunks +=
+				    dev->param.chunks_per_block;
+			} else {
+				dev->param.bad_block_fn(dev, i);
+				bi->block_state = YAFFS_BLOCK_STATE_DEAD;
 			}
 		}
 	}
 
-	dev->blocksInCheckpoint = 0;
+	dev->blocks_in_checkpt = 0;
 
 	return 1;
 }
 
-
-static void yaffs_CheckpointFindNextErasedBlock(yaffs_Device *dev)
+static void yaffs2_checkpt_find_erased_block(struct yaffs_dev *dev)
 {
-	int  i;
-	int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks;
-	T(YAFFS_TRACE_CHECKPOINT,
-		(TSTR("allocating checkpt block: erased %d reserved %d avail %d next %d "TENDSTR),
-		dev->nErasedBlocks,dev->nReservedBlocks,blocksAvailable,dev->checkpointNextBlock));
+	int i;
+	int blocks_avail = dev->n_erased_blocks - dev->param.n_reserved_blocks;
 
-	if(dev->checkpointNextBlock >= 0 &&
-	   dev->checkpointNextBlock <= dev->internalEndBlock &&
-	   blocksAvailable > 0){
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+		"allocating checkpt block: erased %d reserved %d avail %d next %d ",
+		dev->n_erased_blocks, dev->param.n_reserved_blocks,
+		blocks_avail, dev->checkpt_next_block);
 
-		for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){
-			yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-			if(bi->blockState == YAFFS_BLOCK_STATE_EMPTY){
-				dev->checkpointNextBlock = i + 1;
-				dev->checkpointCurrentBlock = i;
-				T(YAFFS_TRACE_CHECKPOINT,(TSTR("allocating checkpt block %d"TENDSTR),i));
+	if (dev->checkpt_next_block >= 0 &&
+	    dev->checkpt_next_block <= dev->internal_end_block &&
+	    blocks_avail > 0) {
+
+		for (i = dev->checkpt_next_block; i <= dev->internal_end_block;
+		     i++) {
+			struct yaffs_block_info *bi =
+			    yaffs_get_block_info(dev, i);
+			if (bi->block_state == YAFFS_BLOCK_STATE_EMPTY) {
+				dev->checkpt_next_block = i + 1;
+				dev->checkpt_cur_block = i;
+				yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+					"allocating checkpt block %d", i);
 				return;
 			}
 		}
 	}
-	T(YAFFS_TRACE_CHECKPOINT,(TSTR("out of checkpt blocks"TENDSTR)));
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT, "out of checkpt blocks");
 
-	dev->checkpointNextBlock = -1;
-	dev->checkpointCurrentBlock = -1;
+	dev->checkpt_next_block = -1;
+	dev->checkpt_cur_block = -1;
 }
 
-static void yaffs_CheckpointFindNextCheckpointBlock(yaffs_Device *dev)
+static void yaffs2_checkpt_find_block(struct yaffs_dev *dev)
 {
-	int  i;
-	yaffs_ExtendedTags tags;
+	int i;
+	struct yaffs_ext_tags tags;
 
-	T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: start:  blocks %d next %d" TENDSTR),
-		dev->blocksInCheckpoint, dev->checkpointNextBlock));
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+		"find next checkpt block: start:  blocks %d next %d",
+		dev->blocks_in_checkpt, dev->checkpt_next_block);
 
-	if(dev->blocksInCheckpoint < dev->checkpointMaxBlocks)
-		for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){
-			int chunk = i * dev->nChunksPerBlock;
-			int realignedChunk = chunk - dev->chunkOffset;
+	if (dev->blocks_in_checkpt < dev->checkpt_max_blocks)
+		for (i = dev->checkpt_next_block; i <= dev->internal_end_block;
+		     i++) {
+			int chunk = i * dev->param.chunks_per_block;
+			int realigned_chunk = chunk - dev->chunk_offset;
 
-			dev->readChunkWithTagsFromNAND(dev,realignedChunk,NULL,&tags);
-			T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR),
-				i, tags.objectId,tags.sequenceNumber,tags.eccResult));
+			dev->param.read_chunk_tags_fn(dev, realigned_chunk,
+						      NULL, &tags);
+			yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+				"find next checkpt block: search: block %d oid %d seq %d eccr %d",
+				i, tags.obj_id, tags.seq_number,
+				tags.ecc_result);
 
-			if(tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA){
+			if (tags.seq_number == YAFFS_SEQUENCE_CHECKPOINT_DATA) {
 				/* Right kind of block */
-				dev->checkpointNextBlock = tags.objectId;
-				dev->checkpointCurrentBlock = i;
-				dev->checkpointBlockList[dev->blocksInCheckpoint] = i;
-				dev->blocksInCheckpoint++;
-				T(YAFFS_TRACE_CHECKPOINT,(TSTR("found checkpt block %d"TENDSTR),i));
+				dev->checkpt_next_block = tags.obj_id;
+				dev->checkpt_cur_block = i;
+				dev->checkpt_block_list[dev->
+							blocks_in_checkpt] = i;
+				dev->blocks_in_checkpt++;
+				yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+					"found checkpt block %d", i);
 				return;
 			}
 		}
 
-	T(YAFFS_TRACE_CHECKPOINT,(TSTR("found no more checkpt blocks"TENDSTR)));
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT, "found no more checkpt blocks");
 
-	dev->checkpointNextBlock = -1;
-	dev->checkpointCurrentBlock = -1;
+	dev->checkpt_next_block = -1;
+	dev->checkpt_cur_block = -1;
 }
 
-
-int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting)
+int yaffs2_checkpt_open(struct yaffs_dev *dev, int writing)
 {
+	int i;
+
+	dev->checkpt_open_write = writing;
 
 	/* Got the functions we need? */
-	if (!dev->writeChunkWithTagsToNAND ||
-	    !dev->readChunkWithTagsFromNAND ||
-	    !dev->eraseBlockInNAND ||
-	    !dev->markNANDBlockBad)
+	if (!dev->param.write_chunk_tags_fn ||
+	    !dev->param.read_chunk_tags_fn ||
+	    !dev->param.erase_fn || !dev->param.bad_block_fn)
 		return 0;
 
-	if(forWriting && !yaffs_CheckpointSpaceOk(dev))
+	if (writing && !yaffs2_checkpt_space_ok(dev))
 		return 0;
 
-	if(!dev->checkpointBuffer)
-		dev->checkpointBuffer = YMALLOC_DMA(dev->nDataBytesPerChunk);
-	if(!dev->checkpointBuffer)
+	if (!dev->checkpt_buffer)
+		dev->checkpt_buffer =
+		    kmalloc(dev->param.total_bytes_per_chunk, GFP_NOFS);
+	if (!dev->checkpt_buffer)
 		return 0;
 
-
-	dev->checkpointPageSequence = 0;
-
-	dev->checkpointOpenForWrite = forWriting;
-
-	dev->checkpointByteCount = 0;
-	dev->checkpointSum = 0;
-	dev->checkpointXor = 0;
-	dev->checkpointCurrentBlock = -1;
-	dev->checkpointCurrentChunk = -1;
-	dev->checkpointNextBlock = dev->internalStartBlock;
+	dev->checkpt_page_seq = 0;
+	dev->checkpt_byte_count = 0;
+	dev->checkpt_sum = 0;
+	dev->checkpt_xor = 0;
+	dev->checkpt_cur_block = -1;
+	dev->checkpt_cur_chunk = -1;
+	dev->checkpt_next_block = dev->internal_start_block;
 
 	/* Erase all the blocks in the checkpoint area */
-	if(forWriting){
-		memset(dev->checkpointBuffer,0,dev->nDataBytesPerChunk);
-		dev->checkpointByteOffset = 0;
-		return yaffs_CheckpointErase(dev);
-
-
-	} else {
-		int i;
-		/* Set to a value that will kick off a read */
-		dev->checkpointByteOffset = dev->nDataBytesPerChunk;
-		/* A checkpoint block list of 1 checkpoint block per 16 block is (hopefully)
-		 * going to be way more than we need */
-		dev->blocksInCheckpoint = 0;
-		dev->checkpointMaxBlocks = (dev->internalEndBlock - dev->internalStartBlock)/16 + 2;
-		dev->checkpointBlockList = YMALLOC(sizeof(int) * dev->checkpointMaxBlocks);
-		for(i = 0; i < dev->checkpointMaxBlocks; i++)
-			dev->checkpointBlockList[i] = -1;
+	if (writing) {
+		memset(dev->checkpt_buffer, 0, dev->data_bytes_per_chunk);
+		dev->checkpt_byte_offs = 0;
+		return yaffs_checkpt_erase(dev);
 	}
 
-	return 1;
-}
+	/* Set to a value that will kick off a read */
+	dev->checkpt_byte_offs = dev->data_bytes_per_chunk;
+	/* A checkpoint block list of 1 checkpoint block per 16 block is
+	 * (hopefully) going to be way more than we need */
+	dev->blocks_in_checkpt = 0;
+	dev->checkpt_max_blocks =
+	    (dev->internal_end_block - dev->internal_start_block) / 16 + 2;
+	dev->checkpt_block_list =
+	    kmalloc(sizeof(int) * dev->checkpt_max_blocks, GFP_NOFS);
 
-int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum)
-{
-	__u32 compositeSum;
-	compositeSum =  (dev->checkpointSum << 8) | (dev->checkpointXor & 0xFF);
-	*sum = compositeSum;
-	return 1;
-}
-
-static int yaffs_CheckpointFlushBuffer(yaffs_Device *dev)
-{
-
-	int chunk;
-	int realignedChunk;
-
-	yaffs_ExtendedTags tags;
-
-	if(dev->checkpointCurrentBlock < 0){
-		yaffs_CheckpointFindNextErasedBlock(dev);
-		dev->checkpointCurrentChunk = 0;
-	}
-
-	if(dev->checkpointCurrentBlock < 0)
+	if (!dev->checkpt_block_list)
 		return 0;
 
-	tags.chunkDeleted = 0;
-	tags.objectId = dev->checkpointNextBlock; /* Hint to next place to look */
-	tags.chunkId = dev->checkpointPageSequence + 1;
-	tags.sequenceNumber =  YAFFS_SEQUENCE_CHECKPOINT_DATA;
-	tags.byteCount = dev->nDataBytesPerChunk;
-	if(dev->checkpointCurrentChunk == 0){
+	for (i = 0; i < dev->checkpt_max_blocks; i++)
+		dev->checkpt_block_list[i] = -1;
+
+	return 1;
+}
+
+int yaffs2_get_checkpt_sum(struct yaffs_dev *dev, u32 * sum)
+{
+	u32 composite_sum;
+
+	composite_sum = (dev->checkpt_sum << 8) | (dev->checkpt_xor & 0xff);
+	*sum = composite_sum;
+	return 1;
+}
+
+static int yaffs2_checkpt_flush_buffer(struct yaffs_dev *dev)
+{
+	int chunk;
+	int realigned_chunk;
+	struct yaffs_ext_tags tags;
+
+	if (dev->checkpt_cur_block < 0) {
+		yaffs2_checkpt_find_erased_block(dev);
+		dev->checkpt_cur_chunk = 0;
+	}
+
+	if (dev->checkpt_cur_block < 0)
+		return 0;
+
+	tags.is_deleted = 0;
+	tags.obj_id = dev->checkpt_next_block;	/* Hint to next place to look */
+	tags.chunk_id = dev->checkpt_page_seq + 1;
+	tags.seq_number = YAFFS_SEQUENCE_CHECKPOINT_DATA;
+	tags.n_bytes = dev->data_bytes_per_chunk;
+	if (dev->checkpt_cur_chunk == 0) {
 		/* First chunk we write for the block? Set block state to
 		   checkpoint */
-		yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,dev->checkpointCurrentBlock);
-		bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT;
-		dev->blocksInCheckpoint++;
+		struct yaffs_block_info *bi =
+		    yaffs_get_block_info(dev, dev->checkpt_cur_block);
+		bi->block_state = YAFFS_BLOCK_STATE_CHECKPOINT;
+		dev->blocks_in_checkpt++;
 	}
 
-	chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock + dev->checkpointCurrentChunk;
+	chunk =
+	    dev->checkpt_cur_block * dev->param.chunks_per_block +
+	    dev->checkpt_cur_chunk;
 
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+		"checkpoint wite buffer nand %d(%d:%d) objid %d chId %d",
+		chunk, dev->checkpt_cur_block, dev->checkpt_cur_chunk,
+		tags.obj_id, tags.chunk_id);
 
-	T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR),
-		chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk,tags.objectId,tags.chunkId));
+	realigned_chunk = chunk - dev->chunk_offset;
 
-	realignedChunk = chunk - dev->chunkOffset;
+	dev->n_page_writes++;
 
-	dev->writeChunkWithTagsToNAND(dev,realignedChunk,dev->checkpointBuffer,&tags);
-	dev->checkpointByteOffset = 0;
-	dev->checkpointPageSequence++;
-	dev->checkpointCurrentChunk++;
-	if(dev->checkpointCurrentChunk >= dev->nChunksPerBlock){
-		dev->checkpointCurrentChunk = 0;
-		dev->checkpointCurrentBlock = -1;
+	dev->param.write_chunk_tags_fn(dev, realigned_chunk,
+				       dev->checkpt_buffer, &tags);
+	dev->checkpt_byte_offs = 0;
+	dev->checkpt_page_seq++;
+	dev->checkpt_cur_chunk++;
+	if (dev->checkpt_cur_chunk >= dev->param.chunks_per_block) {
+		dev->checkpt_cur_chunk = 0;
+		dev->checkpt_cur_block = -1;
 	}
-	memset(dev->checkpointBuffer,0,dev->nDataBytesPerChunk);
+	memset(dev->checkpt_buffer, 0, dev->data_bytes_per_chunk);
 
 	return 1;
 }
 
-
-int yaffs_CheckpointWrite(yaffs_Device *dev,const void *data, int nBytes)
+int yaffs2_checkpt_wr(struct yaffs_dev *dev, const void *data, int n_bytes)
 {
-	int i=0;
+	int i = 0;
 	int ok = 1;
+	u8 *data_bytes = (u8 *) data;
 
-
-	__u8 * dataBytes = (__u8 *)data;
-
-
-
-	if(!dev->checkpointBuffer)
+	if (!dev->checkpt_buffer)
 		return 0;
 
-	if(!dev->checkpointOpenForWrite)
+	if (!dev->checkpt_open_write)
 		return -1;
 
-	while(i < nBytes && ok) {
+	while (i < n_bytes && ok) {
+		dev->checkpt_buffer[dev->checkpt_byte_offs] = *data_bytes;
+		dev->checkpt_sum += *data_bytes;
+		dev->checkpt_xor ^= *data_bytes;
 
-
-
-		dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes ;
-		dev->checkpointSum += *dataBytes;
-		dev->checkpointXor ^= *dataBytes;
-
-		dev->checkpointByteOffset++;
+		dev->checkpt_byte_offs++;
 		i++;
-		dataBytes++;
-		dev->checkpointByteCount++;
+		data_bytes++;
+		dev->checkpt_byte_count++;
 
-
-		if(dev->checkpointByteOffset < 0 ||
-		   dev->checkpointByteOffset >= dev->nDataBytesPerChunk)
-			ok = yaffs_CheckpointFlushBuffer(dev);
-
+		if (dev->checkpt_byte_offs < 0 ||
+		    dev->checkpt_byte_offs >= dev->data_bytes_per_chunk)
+			ok = yaffs2_checkpt_flush_buffer(dev);
 	}
 
-	return 	i;
+	return i;
 }
 
-int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes)
+int yaffs2_checkpt_rd(struct yaffs_dev *dev, void *data, int n_bytes)
 {
-	int i=0;
+	int i = 0;
 	int ok = 1;
-	yaffs_ExtendedTags tags;
-
-
+	struct yaffs_ext_tags tags;
 	int chunk;
-	int realignedChunk;
+	int realigned_chunk;
+	u8 *data_bytes = (u8 *) data;
 
-	__u8 *dataBytes = (__u8 *)data;
-
-	if(!dev->checkpointBuffer)
+	if (!dev->checkpt_buffer)
 		return 0;
 
-	if(dev->checkpointOpenForWrite)
+	if (dev->checkpt_open_write)
 		return -1;
 
-	while(i < nBytes && ok) {
+	while (i < n_bytes && ok) {
 
+		if (dev->checkpt_byte_offs < 0 ||
+		    dev->checkpt_byte_offs >= dev->data_bytes_per_chunk) {
 
-		if(dev->checkpointByteOffset < 0 ||
-		   dev->checkpointByteOffset >= dev->nDataBytesPerChunk) {
-
-		   	if(dev->checkpointCurrentBlock < 0){
-				yaffs_CheckpointFindNextCheckpointBlock(dev);
-				dev->checkpointCurrentChunk = 0;
+			if (dev->checkpt_cur_block < 0) {
+				yaffs2_checkpt_find_block(dev);
+				dev->checkpt_cur_chunk = 0;
 			}
 
-			if(dev->checkpointCurrentBlock < 0)
+			if (dev->checkpt_cur_block < 0) {
 				ok = 0;
-			else {
-
-				chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock +
-				          dev->checkpointCurrentChunk;
-
-				realignedChunk = chunk - dev->chunkOffset;
-
-	   			/* read in the next chunk */
-	   			/* printf("read checkpoint page %d\n",dev->checkpointPage); */
-				dev->readChunkWithTagsFromNAND(dev, realignedChunk,
-							       dev->checkpointBuffer,
-							      &tags);
-
-				if(tags.chunkId != (dev->checkpointPageSequence + 1) ||
-				   tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA)
-				   ok = 0;
-
-				dev->checkpointByteOffset = 0;
-				dev->checkpointPageSequence++;
-				dev->checkpointCurrentChunk++;
-
-				if(dev->checkpointCurrentChunk >= dev->nChunksPerBlock)
-					dev->checkpointCurrentBlock = -1;
+				break;
 			}
+
+			chunk = dev->checkpt_cur_block *
+			    dev->param.chunks_per_block +
+			    dev->checkpt_cur_chunk;
+
+			realigned_chunk = chunk - dev->chunk_offset;
+			dev->n_page_reads++;
+
+			/* read in the next chunk */
+			dev->param.read_chunk_tags_fn(dev,
+						realigned_chunk,
+						dev->checkpt_buffer,
+						&tags);
+
+			if (tags.chunk_id != (dev->checkpt_page_seq + 1) ||
+			    tags.ecc_result > YAFFS_ECC_RESULT_FIXED ||
+			    tags.seq_number != YAFFS_SEQUENCE_CHECKPOINT_DATA) {
+				ok = 0;
+				break;
+			}
+
+			dev->checkpt_byte_offs = 0;
+			dev->checkpt_page_seq++;
+			dev->checkpt_cur_chunk++;
+
+			if (dev->checkpt_cur_chunk >=
+					dev->param.chunks_per_block)
+				dev->checkpt_cur_block = -1;
 		}
 
-		if(ok){
-			*dataBytes = dev->checkpointBuffer[dev->checkpointByteOffset];
-			dev->checkpointSum += *dataBytes;
-			dev->checkpointXor ^= *dataBytes;
-			dev->checkpointByteOffset++;
-			i++;
-			dataBytes++;
-			dev->checkpointByteCount++;
-		}
+		*data_bytes = dev->checkpt_buffer[dev->checkpt_byte_offs];
+		dev->checkpt_sum += *data_bytes;
+		dev->checkpt_xor ^= *data_bytes;
+		dev->checkpt_byte_offs++;
+		i++;
+		data_bytes++;
+		dev->checkpt_byte_count++;
 	}
 
-	return 	i;
+	return i;
 }
 
-int yaffs_CheckpointClose(yaffs_Device *dev)
+int yaffs_checkpt_close(struct yaffs_dev *dev)
 {
+	int i;
 
-	if(dev->checkpointOpenForWrite){
-		if(dev->checkpointByteOffset != 0)
-			yaffs_CheckpointFlushBuffer(dev);
-	} else {
-		int i;
-		for(i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++){
-			yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,dev->checkpointBlockList[i]);
-			if(bi->blockState == YAFFS_BLOCK_STATE_EMPTY)
-				bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT;
-			else {
-				// Todo this looks odd...
-			}
+	if (dev->checkpt_open_write) {
+		if (dev->checkpt_byte_offs != 0)
+			yaffs2_checkpt_flush_buffer(dev);
+	} else if (dev->checkpt_block_list) {
+		for (i = 0;
+		     i < dev->blocks_in_checkpt &&
+		     dev->checkpt_block_list[i] >= 0; i++) {
+			int blk = dev->checkpt_block_list[i];
+			struct yaffs_block_info *bi = NULL;
+
+			if (dev->internal_start_block <= blk &&
+			    blk <= dev->internal_end_block)
+				bi = yaffs_get_block_info(dev, blk);
+			if (bi && bi->block_state == YAFFS_BLOCK_STATE_EMPTY)
+				bi->block_state = YAFFS_BLOCK_STATE_CHECKPOINT;
 		}
-		YFREE(dev->checkpointBlockList);
-		dev->checkpointBlockList = NULL;
+		kfree(dev->checkpt_block_list);
+		dev->checkpt_block_list = NULL;
 	}
 
-	dev->nFreeChunks -= dev->blocksInCheckpoint * dev->nChunksPerBlock;
-	dev->nErasedBlocks -= dev->blocksInCheckpoint;
+	dev->n_free_chunks -=
+		dev->blocks_in_checkpt * dev->param.chunks_per_block;
+	dev->n_erased_blocks -= dev->blocks_in_checkpt;
 
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT, "checkpoint byte count %d",
+		dev->checkpt_byte_count);
 
-	T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint byte count %d" TENDSTR),
-			dev->checkpointByteCount));
-
-	if(dev->checkpointBuffer){
+	if (dev->checkpt_buffer) {
 		/* free the buffer */
-		YFREE(dev->checkpointBuffer);
-		dev->checkpointBuffer = NULL;
+		kfree(dev->checkpt_buffer);
+		dev->checkpt_buffer = NULL;
 		return 1;
-	}
-	else
+	} else {
 		return 0;
-
+	}
 }
 
-int yaffs_CheckpointInvalidateStream(yaffs_Device *dev)
+int yaffs2_checkpt_invalidate_stream(struct yaffs_dev *dev)
 {
-	/* Erase the first checksum block */
+	/* Erase the checkpoint data */
 
-	T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint invalidate"TENDSTR)));
+	yaffs_trace(YAFFS_TRACE_CHECKPOINT,
+		"checkpoint invalidate of %d blocks",
+		dev->blocks_in_checkpt);
 
-	if(!yaffs_CheckpointSpaceOk(dev))
-		return 0;
-
-	return yaffs_CheckpointErase(dev);
+	return yaffs_checkpt_erase(dev);
 }
