int yaffs2_checkpt_wr(struct yaffs_dev *dev, const void *data, int n_bytes) { int i = 0; int ok = 1; u8 *data_bytes = (u8 *) data; if (!dev->checkpt_buffer) return 0; if (!dev->checkpt_open_write) return -1; 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->checkpt_byte_offs++; i++; data_bytes++; dev->checkpt_byte_count++; if (dev->checkpt_byte_offs < 0 || dev->checkpt_byte_offs >= dev->data_bytes_per_chunk) ok = yaffs2_checkpt_flush_buffer(dev); } return i; }
int yaffs_checkpt_close(struct yaffs_dev *dev) { if (dev->checkpt_open_write) { if (dev->checkpt_byte_offs != 0) yaffs2_checkpt_flush_buffer(dev); } else if (dev->checkpt_block_list) { int i; 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; else ; } kfree(dev->checkpt_block_list); dev->checkpt_block_list = NULL; } 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 */ kfree(dev->checkpt_buffer); dev->checkpt_buffer = NULL; return 1; } else { return 0; } }
int yaffs_checkpt_close(yaffs_dev_t *dev) { if (dev->checkpt_open_write) { if (dev->checkpt_byte_offs != 0) yaffs2_checkpt_flush_buffer(dev); } else if(dev->checkpt_block_list){ int i; for (i = 0; i < dev->blocks_in_checkpt && dev->checkpt_block_list[i] >= 0; i++) { int blk = dev->checkpt_block_list[i]; yaffs_block_info_t *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; else { /* Todo this looks odd... */ } } YFREE(dev->checkpt_block_list); dev->checkpt_block_list = NULL; } dev->n_free_chunks -= dev->blocks_in_checkpt * dev->param.chunks_per_block; dev->n_erased_blocks -= dev->blocks_in_checkpt; T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint byte count %d" TENDSTR), dev->checkpt_byte_count)); if (dev->checkpt_buffer) { /* free the buffer */ YFREE(dev->checkpt_buffer); dev->checkpt_buffer = NULL; return 1; } else return 0; }