[Yaffs] Error in checkpt close function?

Top Page
Attachments:
Message as email
+ (text/plain)
+ (text/html)
Delete this message
Reply to this message
Author: Chris.Gofforth@corp.rockwellcollins.com
Date:  
To: yaffs
Subject: [Yaffs] Error in checkpt close function?
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