The following is the checkpt_close function, ( for yaffs2) I noticed that the values of dev->n_free_chunks and dev->n_erased_blocks are being modified each time this function is called. Should they only be modified if the checkpt was open for writing , not reading? Will this not cause an incorrect count value, as it occurs on a close for read operation? Also: If the buffers are not freed, then the checkpt_open () function would not try to re-allocate memory, as the buffers would exist. Since the checkpoint size would not change for the given device, this should be OK. Does this sound valid? int yaffs_checkpt_close(struct yaffs_dev *dev) { int i; if (dev->checkpt_open_write) { if (dev->checkpt_byte_offs != sizeof(sizeof(struct yaffs_checkpt_chunk_hdr))) 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; } yaffsfs_free(dev->checkpt_block_list); /* TODO: we do not want to free the buffer, but rather re-use it */ dev->checkpt_block_list = NULL; } /* TODO: following should only be applicable if it was open for writing */ 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); if (dev->checkpt_buffer) { /* free the buffer */ yaffsfs_free(dev->checkpt_buffer); /* TODO: we do not want to free the buffer, but rather re-use it */ dev->checkpt_buffer = NULL; return 1; } else { return 0; } } Thanks Chris