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