Re: [Yaffs] Direct Interface, files contain zero when mount…

Top Page
Attachments:
Message as email
+ (text/plain)
+ yaffsnewcfg_ecc.c (text/plain)
+ TestYAFFS2-nocheckpoint.txt (text/plain)
Delete this message
Reply to this message
Author: Stéphane Lesage
Date:  
To: yaffs
Subject: Re: [Yaffs] Direct Interface, files contain zero when mounting without checkpoint

>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