On Tuesday 22 May 2012 00:31:25 peterlingoal wrote:
> Hi Charles:
>
> following is a proposed patch that check for block state after discovering
> a check point block, and continues search if the block state is DEAD:
> From b08b8c5fc21c2820f66454968be3a5115477fc96 Mon Sep 17 00:00:00 2001
> From: Peter Lin <peter.lin@gdc-tech.com>
> Date: Mon, 21 May 2012 20:25:55 +0800
> Subject: [PATCH] yaffs: ignore checkpt if it is in bad block
>
> ---
> yaffs_checkptrw.c | 11 +++++++++++
> 1 files changed, 11 insertions(+), 0 deletions(-)
>
> diff --git a/yaffs_checkptrw.c b/yaffs_checkptrw.c
> index 997a618..0d63e74 100644
> --- a/yaffs_checkptrw.c
> +++ b/yaffs_checkptrw.c
> @@ -13,6 +13,8 @@
>
> #include "yaffs_checkptrw.h"
> #include "yaffs_getblockinfo.h"
> +#include "yaffs_nand.h"
> +#include "yaffs_guts.h"
>
> static int yaffs2_checkpt_space_ok(struct yaffs_dev *dev)
> {
> @@ -117,6 +119,15 @@ static void yaffs2_checkpt_find_block(struct yaffs_dev
> *dev)
> tags.ecc_result);
>
> if (tags.seq_number == YAFFS_SEQUENCE_CHECKPOINT_DATA) {
> + enum yaffs_block_state state = 0;
> + u32 seq_number = 0;
> + yaffs_query_init_block_state(dev, i, &state, &seq_number);
> + if( YAFFS_BLOCK_STATE_DEAD == state )
> + {
> + yaffs_trace(YAFFS_TRACE_CHECKPOINT,
> + "ignore bad checkpt block %d", i);
> + continue;
> + }
This approach won't always work
yaffs_querey_init_block_state() applies a block offset which is not set up
properly yet. Instead you need to use the raw functions during checkpoint
reading:
+ dev->param.query_block_fn(dev, i, &state, &seq);
+ if (state == YAFFS_BLOCK_STATE_DEAD)
+ continue;
> /* Right kind of block */
> dev->checkpt_next_block = tags.obj_id;
> dev->checkpt_cur_block = i;
I have a fix for this that should be pushed to yaffs2 git today.
I am also adding a further check to the checkpointing.
Currently the checkpoint data has various checks in it, but none that checks
for dropped or stale data during the reading. Each checkpoint record is
framed and there is a checksum at the end which do provide a level of
checking.
I have written some code, now under test, which does further checks on a
chunk-by-chunk basis. This should be checked in today.
-- Charles