>Hi Stephane
>I tried to reproduce this but could not.
>I wrote a test which should do what you are reporting. Can you please have a look at:
>http://yaffs.net/gitweb?p=yaffs2.git;a=shortlog;h=refs/heads/stephanetest
>and see if that represents your test.
Hi, thanks for having a look.
This is not exactly what I tested (unmount instead of 'power failure'),
but I still have the problem here on the last step.
I pretty sure my low-level NAND functions (or file simulation) work correctly, so this must be a bad configuration.
I attached the output of the test with debug, and my yaffs adaptation layer.
/************************************************************************/
/** \file yaffsnewcfg_ecc.c
* \brief YAFFS direct interface implementation with bad blocks+ECC
*
* \date 2012/05/16
* \author Stephane Lesage - ATEIS
*
*/
/************************************************************************/
/* Includes */
#include "yaffscfg.h"
#include "yaffsfs.h"
#include "yaffs_packedtags2.h"
#include "yaffs_trace.h"
#include "nandflash.h"
#include <assert.h>
/* Externals */
/* Macros */
/* Variables */
union
{
unsigned char buffer[64];
struct
{
unsigned char state[8];
struct yaffs_packed_tags2 PT2;
unsigned char ecc[8][3];
};
} spare;
unsigned yaffs_trace_mask =
YAFFS_TRACE_ALLOCATE |
YAFFS_TRACE_SCAN |
YAFFS_TRACE_BAD_BLOCKS |
YAFFS_TRACE_ERASE |
YAFFS_TRACE_GC |
YAFFS_TRACE_WRITE |
YAFFS_TRACE_TRACING |
YAFFS_TRACE_DELETION |
YAFFS_TRACE_CHECKPOINT |
YAFFS_TRACE_VERIFY_ALL |
0;
static int yaffsfs_lastError;
static struct yaffs_dev bootDev;
static struct yaffs_dev flashDev;
/* OS Glue Functions */
u32 yaffsfs_CurrentTime(void)
{
return 0;
}
void yaffsfs_SetError(int err)
{
yaffsfs_lastError = err;
}
int yaffsfs_GetLastError(void)
{
return yaffsfs_lastError;
}
void yaffsfs_Lock(void)
{
}
void yaffsfs_Unlock(void)
{
}
void *yaffsfs_malloc(size_t size)
{
return malloc(size);
}
void yaffsfs_free(void *ptr)
{
return free(ptr);
}
void yaffs_bug_fn(const char *file_name, int line_no)
{
printf("yaffs bug detected %s:%d\n", file_name, line_no);
assert(0);
}
void yaffsfs_OSInitialisation(void)
{
}
/* NAND Functions */
int yflash2_InitialiseNAND(struct yaffs_dev *dev)
{
return YAFFS_OK;
}
int yflash2_EraseBlockInNAND(struct yaffs_dev *dev, int block_no)
{
bool ret = NANDFlash_EraseBlock(block_no);
return ret ? YAFFS_OK : YAFFS_FAIL;
}
int yflash2_WriteChunkWithTagsToNAND(struct yaffs_dev *dev, int nand_chunk, const u8 *data, const struct yaffs_ext_tags *tags)
{
int i;
assert(tags);
assert(data);
memset(spare.state, -1, sizeof(spare.state));
yaffs_pack_tags2(&spare.PT2, tags, !dev->param.no_tags_ecc);
for (i=0; i<8; i++) yaffs_ecc_calc(data+256*i, spare.ecc[i]);
bool ret = NANDFlash_ProgramPage(nand_chunk, data, spare.buffer);
return ret ? YAFFS_OK : YAFFS_FAIL;
}
int yflash2_ReadChunkWithTagsFromNAND(struct yaffs_dev *dev, int nand_chunk, u8 *data, struct yaffs_ext_tags *tags)
{
assert(tags);
NANDFlash_ReadPage(nand_chunk, data, spare.buffer);
yaffs_unpack_tags2(tags, &spare.PT2, !dev->param.no_tags_ecc);
if (tags->ecc_result == YAFFS_ECC_RESULT_UNFIXED)
return YAFFS_OK;
if (data)
{
int i;
for (i=0; i<8; i++)
{
unsigned char ecc[3];
yaffs_ecc_calc(data+256*i, ecc);
int res = yaffs_ecc_correct(data+256*i, ecc, spare.ecc[i]);
if (res < 0)
{
tags->ecc_result = YAFFS_ECC_RESULT_UNFIXED;
}
else if (res > 0)
{
if (tags->ecc_result == YAFFS_ECC_RESULT_NO_ERROR)
tags->ecc_result = YAFFS_ECC_RESULT_UNFIXED;
}
}
}
return YAFFS_OK;
}
int yflash2_MarkNANDBlockBad(struct yaffs_dev *dev, int block_no)
{
NANDFlash_MarkBlockBad(block_no);
return YAFFS_OK;
}
int yflash2_QueryNANDBlock(struct yaffs_dev *dev, int block_no, enum yaffs_block_state *state, u32 *seq_number)
{
struct yaffs_ext_tags tags;
bool bad = NANDFlash_IsBlockBad(block_no, spare.buffer);
if (bad)
{
*seq_number = 0;
*state = YAFFS_BLOCK_STATE_DEAD;
return YAFFS_FAIL;
}
yaffs_unpack_tags2(&tags, &spare.PT2, !dev->param.no_tags_ecc);
if (tags.chunk_used)
{
*seq_number = tags.seq_number;
*state = YAFFS_BLOCK_STATE_NEEDS_SCAN;
}
else
{
*seq_number = 0;
*state = YAFFS_BLOCK_STATE_EMPTY;
}
return YAFFS_OK;
}
/* Startup */
int yaffs_start_up(void)
{
yaffsfs_OSInitialisation();
// Set up devices
memset(&bootDev, 0, sizeof(bootDev));
bootDev.os_context = (void*) 0; // Used to identify the device in fstat.
bootDev.param.name = "/boot";
bootDev.param.total_bytes_per_chunk = NANDFlashDevice.DataSize;
bootDev.param.spare_bytes_per_chunk = NANDFlashDevice.SpareSize;
bootDev.param.chunks_per_block = NANDFlashDevice.PagesPerBlock;
bootDev.param.start_block = 0;
bootDev.param.end_block = 63; // Last block in 8MB
bootDev.param.n_reserved_blocks = 5;
bootDev.param.n_caches = 10;
bootDev.param.is_yaffs2 = 1;
bootDev.param.erase_fn = yflash2_EraseBlockInNAND;
bootDev.param.initialise_flash_fn = yflash2_InitialiseNAND;
bootDev.param.write_chunk_tags_fn = yflash2_WriteChunkWithTagsToNAND;
bootDev.param.read_chunk_tags_fn = yflash2_ReadChunkWithTagsFromNAND;
bootDev.param.bad_block_fn = yflash2_MarkNANDBlockBad;
bootDev.param.query_block_fn = yflash2_QueryNANDBlock;
bootDev.param.wide_tnodes_disabled = 1;
yaffs_add_device(&bootDev);
memset(&flashDev, 0, sizeof(flashDev));
flashDev.os_context = (void*) 1; // Used to identify the device in fstat.
flashDev.param.name = "/flash";
flashDev.param.total_bytes_per_chunk = NANDFlashDevice.DataSize;
flashDev.param.spare_bytes_per_chunk = NANDFlashDevice.SpareSize;
flashDev.param.chunks_per_block = NANDFlashDevice.PagesPerBlock;
flashDev.param.start_block = 64; // First block after 8MB
flashDev.param.end_block = NANDFlashDevice.NbBlocks-1;
flashDev.param.n_reserved_blocks = 5;
flashDev.param.n_caches = 10;
flashDev.param.is_yaffs2 = 1;
flashDev.param.erase_fn = yflash2_EraseBlockInNAND;
flashDev.param.initialise_flash_fn = yflash2_InitialiseNAND;
flashDev.param.write_chunk_tags_fn = yflash2_WriteChunkWithTagsToNAND;
flashDev.param.read_chunk_tags_fn = yflash2_ReadChunkWithTagsFromNAND;
flashDev.param.bad_block_fn = yflash2_MarkNANDBlockBad;
flashDev.param.query_block_fn = yflash2_QueryNANDBlock;
yaffs_add_device(&flashDev);
return 0;
}
Test type 0
Regular mount
yaffs: yaffs: yaffs_guts_initialise()
yaffs: restore entry: is_checkpointed 0
yaffs: read checkpoint validity
yaffs: find next checkpt block: start: blocks 0 next 1
yaffs: find next checkpt block: search: block 1 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 2 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 3 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 4 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 5 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 6 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 7 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 8 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 9 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 10 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 11 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 12 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 13 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 14 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 15 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 16 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 17 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 18 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 19 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 20 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 21 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 22 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt blo
ck: search: block 23 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 24 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 25 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 26 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 27 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 28 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 29 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 30 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 31 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 32 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 33 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 34 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 35 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 36 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 37 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 38 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 39 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 40 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 41 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 42 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 43 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 44 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 45 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 46 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 47 state 5517496 oid 0 seq 0 eccr 1
y
affs: find next checkpt block: search: block 48 state 5
517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 49 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 50 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 51 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 52 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 53 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 54 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 55 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 56 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 57 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 58 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 59 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 60 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 61 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 62 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 63 state 5517496 oid 0 seq 0 eccr 1
yaffs: find next checkpt block: search: block 64 state 5517496 oid 0 seq 0 eccr 1
yaffs: found no more checkpt blocks
yaffs: checkpoint byte count 0
yaffs: restore exit: is_checkpointed 0
yaffs: yaffs2_scan_backwards starts intstartblk 1 intendblk 64...
yaffs: 0 blocks to be sorted...
yaffs: ...done
yaffs: yaffs2_scan_backwards ends
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 64 blocks
yaffs: Allocating 0 blocks
yaffs: Full 0 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 0 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: yaffs: yaffs_guts_initialise() done.
yaffs: Tnodes added
yaffs: Allocated block 1, seq 4097, 63 left
yaffs: Writing chunk 64 tags 257 0
yaffs: Writing chunk 65 tags 1 0
write returned 8
yaffs: Writing chunk 66 tags 257 1
yaffs: Writing chunk 67 tags 257 0
yaffs: line 3407 delete of chunk 64
file length 8
[66][6f][6f][20][62][61][72][20]
yaffs: save entry: is_checkpointed 0
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 63 blocks
yaffs: Allocating 1 blocks
yaffs: Full 0 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 0 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: checkpt blocks_avail = 58
yaffs: checking blocks 1 to 64
yaffs: write checkpoint validity
yaffs: write checkpoint device
yaffs: write checkpoint objects
yaffs: Checkpoint write object 257 parent 1 type 1 chunk 67 obj addr 006F2E4C
yaffs: Checkpoint write object 1 parent 0 type 3 chunk 65 obj addr 006F2F44
yaffs: Checkpoint write object 2 parent 1 type 3 chunk 0 obj addr 006F2EC8
yaffs: Checkpoint write object 3 parent 0 type 3 chunk 0 obj addr 006F303C
yaffs: Checkpoint write object 4 parent 0 type 3 chunk 0 obj addr 006F2FC0
yaffs: write checkpoint validity
yaffs: allocating checkpt block: erased 63 reserved 5 avail 58 next 1
yaffs: allocating checkpt block 2
yaffs: checkpoint wite buffer nand 128(2:0) objid 3 chId 1
yaffs: checkpoint byte count 1304
yaffs: save exit: is_checkpointed 1
unmount returned 0
Test type 1
Regular mount
yaffs: yaffs: yaffs_guts_initialise()
yaffs: restore entry: is_checkpointed 1
yaffs: read checkpoint validity
yaffs: find next checkpt block: start: blocks 0 next 1
yaffs: find next checkpt block: search: block 1 state 11710860 oid 257 seq 4097 eccr 1
yaffs: find next checkpt block: search: block 2 state 11710860 oid 3 seq 33 eccr 1
yaffs: found checkpt block 2
yaffs: read checkpoint device
yaffs: read checkpoint objects
yaffs: Checkpoint read object 257 parent 1 type 1 chunk 67
yaffs: Tnodes added
yaffs: Checkpoint read tnodes 1 records, last -1. ok 1
yaffs: Checkpoint read object 1 parent 0 type 3 chunk 65
yaffs: Checkpoint read object 2 parent 1 type
3 chunk 0
yaffs: Checkpoint read object 3 parent 0 type 3 chunk 0
yaffs: Checkpoint read object 4 parent 0 type 3 chunk 0
yaffs: Checkpoint read object -1 parent -1 type 7 chunk -1
yaffs: read checkpoint validity
yaffs: read checkpoint checksum 1
yaffs: checkpoint byte count 1304
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 62 blocks
yaffs: Allocating 1 blocks
yaffs: Full 0 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 1 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: restore exit: is_checkpointed 1
yaffs: yaffs: restored from checkpoint
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 62 blocks
yaffs: Allocating 1 blocks
yaffs: Full 0 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 1 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: yaffs: yaffs_guts_initialise() done.
write returned 8
yaffs: checkpoint invalidate of 1 blocks
yaffs: checking blocks 1 to 64
yaffs: erasing checkpt block 2
yaffs: Writing chunk 68 tags 257 1
yaffs: line 3045 delete of chunk 66
yaffs: Writing chunk 69 tags 257 0
yaffs: line 3407 delete of chunk 67
file length 16
[66][6f][6f][20][62][61][72][20][66][6f][6f][20][62][61][72][20]
yaffs: save entry: is_checkpointed 0
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 63 blocks
yaffs: Allocating 1 blocks
yaffs: Full 0 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 0 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: checkpt blocks_avail = 58
yaffs: checking blocks 1 to 64
yaffs: write checkpoint validity
yaffs: write checkpoint device
yaffs: write checkpoint objects
yaffs: Checkpoint write object 257 parent 1 type 1 chunk 69 obj addr 007FBEE4
yaffs: Checkpoint write object 1 parent 0 type 3 chunk 65 obj addr 007FBFDC
yaffs: Checkpoint write object 2 parent 1 type 3 chunk 0 obj addr 007FBF60
yaffs: Checkpoint write object 3 parent 0 type 3 chunk 0 obj addr 007FC0D4
yaffs: Checkpoint write object 4 parent 0 type 3 chunk 0 obj addr 007FC058
yaffs: write checkpoint validity
yaffs: allocating checkpt block: erased 63 reserved 5 avail 58 next 1
yaffs: allocating checkpt block 2
yaffs: checkpoint wite buffer nand 128(2:0) objid 3 chId 1
yaffs: checkpoint byte count 1304
yaffs: save exit: is_checkpointed 1
unmount returned 0
Test type 2
mount ro checkpt
yaffs: yaffs: yaffs_guts_initialise()
yaffs: restore entry: is_checkpointed 1
yaffs: read checkpoint validity
yaffs: find next checkpt block: start: blocks 0 next 1
yaffs: find next checkpt block: search: block 1 state 0 oid 257 seq 4097 eccr 1
yaffs: find next checkpt block: search: block 2 state 0 oid 3 seq 33 eccr 1
yaffs: found checkpt block 2
yaffs: read checkpoint device
yaffs: read checkpoint objects
yaffs: Checkpoint read object 257 parent 1 type 1 chunk 69
yaffs: Tnodes added
yaffs: Checkpoint read tnodes 1 records, last -1. ok 1
yaffs: Checkpoint read object 1 parent 0 type 3 chunk 65
yaffs: Checkpoint read object 2 parent 1 type 3 chunk 0
yaffs: Checkpoint read object 3 parent 0 type 3 chunk 0
yaffs: Checkpoint read object 4 parent 0 type 3 chunk 0
yaffs: Checkpoint read object -1 parent -1 type 7 chunk -1
yaffs: read checkpoint validity
yaffs: read checkpoint checksum 1
yaffs: checkpoint byte count 1304
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 62 blocks
yaffs: Allocating 1 blocks
yaffs: Full 0 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 1 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: restore exit: is_checkpointed 1
yaffs: yaffs: restored from checkpoint
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 62 blocks
yaffs: Allocating 1 blocks
yaffs: Full 0 blocks
yaffs: Dirty 0 blocks
yaffs: C
heckpoint 1 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: yaffs: yaffs_guts_initialise() done.
file length 16
[66][6f][6f][20][62][61][72][20][66][6f][6f][20][62][61][72][20]
yaffs: save entry: is_checkpointed 1
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 62 blocks
yaffs: Allocating 1 blocks
yaffs: Full 0 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 1 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: save exit: is_checkpointed 1
unmount returned 0
Test type 3
mount ro no-checkpt
yaffs: yaffs: yaffs_guts_initialise()
yaffs: restore entry: is_checkpointed 1
yaffs: skipping checkpoint read
yaffs: checkpoint byte count 1304
yaffs: restore exit: is_checkpointed 0
yaffs: yaffs2_scan_backwards starts intstartblk 1 intendblk 64...
yaffs: 1 blocks to be sorted...
yaffs: ...done
yaffs: Allocating from 1 63
yaffs: Allocating from 1 62
yaffs: Allocating from 1 61
yaffs: Allocating from 1 60
yaffs: Allocating from 1 59
yaffs: Allocating from 1 58
yaffs: Allocating from 1 57
yaffs: Allocating from 1 56
yaffs: Allocating from 1 55
yaffs: Allocating from 1 54
yaffs: Allocating from 1 53
yaffs: Allocating from 1 52
yaffs: Allocating from 1 51
yaffs: Allocating from 1 50
yaffs: Allocating from 1 49
yaffs: Allocating from 1 48
yaffs: Allocating from 1 47
yaffs: Allocating from 1 46
yaffs: Allocating from 1 45
yaffs: Allocating from 1 44
yaffs: Allocating from 1 43
yaffs: Allocating from 1 42
yaffs: Allocating from 1 41
yaffs: Allocating from 1 40
yaffs: Allocating from 1 39
yaffs: Allocating from 1 38
yaffs: Allocating from 1 37
yaffs: Allocating from 1 36
yaffs: Allocating from 1 35
yaffs: Allocating from 1 34
yaffs: Allocating from 1 33
yaffs: Allocating from 1 32
yaffs: Allocating from 1 31
yaffs: Allocating from 1 30
yaffs: Allocating from 1 29
yaffs: Allocating from 1 28
yaffs: Allocating from 1 27
yaffs: Allocating from 1 26
yaffs: Allocating from 1 25
yaffs: Allocating from 1 24
yaffs: Allocating from 1 23
yaffs: Allocating from 1 22
yaffs: Allocating from 1 21
yaffs: Allocating from 1 20
yaffs: Allocating from 1 19
yaffs: Allocating from 1 18
yaffs: Allocating from 1 17
yaffs: Allocating from 1 16
yaffs: Allocating from 1 15
yaffs: Allocating from 1 14
yaffs: Allocating from 1 13
yaffs: Allocating from 1 12
yaffs: Allocating from 1 11
yaffs: Allocating from 1 10
yaffs: Allocating from 1 9
yaffs: Allocating from 1 8
yaffs: Allocating from 1 7
yaffs: Allocating from 1 6
yaffs: Tnodes added
yaffs: Obj 257 header mismatch parent_id 1 parent_obj_id 2
yaffs: Obj 257 header mismatch parent_id 1 parent_obj_id 2
yaffs: Obj 257 header mismatch parent_id 1 parent_obj_id 2
yaffs: line 1081 delete of chunk 68
yaffs: line 1192 delete of chunk 67
yaffs: line 1081 delete of chunk 66
yaffs: line 1192 delete of chunk 64
yaffs: yaffs2_scan_backwards ends
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 62 blocks
yaffs: Allocating 0 blocks
yaffs: Full 1 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 1 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: checkpoint invalidate of 1 blocks
yaffs: checking blocks 1 to 64
yaffs: erasing checkpt block 2
yaffs: yaffs: yaffs_guts_initialise() done.
file length 16
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
yaffs: save entry: is_checkpointed 0
yaffs: Block summary
yaffs: 0 blocks have illegal states
yaffs: Unknown 0 blocks
yaffs: Needs scan 0 blocks
yaffs: Scanning 0 blocks
yaffs: Empty 63 blocks
yaffs: Allocating 0 blocks
yaffs: Full 1 blocks
yaffs: Dirty 0 blocks
yaffs: Checkpoint 0 blocks
yaffs: Collecting 0 blocks
yaffs: Dead 0 blocks
yaffs: skipping checkpoint write
yaffs: checkpoint byte count 1304
yaffs: save exit: is_checkpointed 0
unmount returned 0