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 > 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