Index the block state string list because the order was wrong.
[yaffs2.git] / yaffs_verify.c
index 27d36953bc4b7605c1acba461496de26c9898e6d..e634b50d1944f1ac13eef1f0fc9c42aec945a088 100644 (file)
@@ -1,8 +1,7 @@
 /*
  * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
  *
- * Copyright (C) 2002-2011 Aleph One Ltd.
- *   for Toby Churchill Ltd and Brightstar Engineering
+ * Copyright (C) 2002-2018 Aleph One Ltd.
  *
  * Created by Charles Manning <charles@aleph1.co.uk>
  *
 
 int yaffs_skip_verification(struct yaffs_dev *dev)
 {
-       dev = dev;
+       (void) dev;
        return !(yaffs_trace_mask &
                 (YAFFS_TRACE_VERIFY | YAFFS_TRACE_VERIFY_FULL));
 }
 
 static int yaffs_skip_full_verification(struct yaffs_dev *dev)
 {
-       dev = dev;
+       (void) dev;
        return !(yaffs_trace_mask & (YAFFS_TRACE_VERIFY_FULL));
 }
 
 static int yaffs_skip_nand_verification(struct yaffs_dev *dev)
 {
-       dev = dev;
+       (void) dev;
        return !(yaffs_trace_mask & (YAFFS_TRACE_VERIFY_NAND));
 }
 
 static const char * const block_state_name[] = {
-       "Unknown",
-       "Needs scan",
-       "Scanning",
-       "Empty",
-       "Allocating",
-       "Full",
-       "Dirty",
-       "Checkpoint",
-       "Collecting",
-       "Dead"
+       [YAFFS_BLOCK_STATE_UNKNOWN] = "Unknown",
+       [YAFFS_BLOCK_STATE_NEEDS_SCAN] = "Needs scan",
+       [YAFFS_BLOCK_STATE_SCANNING] = "Scanning",
+       [YAFFS_BLOCK_STATE_EMPTY] = "Empty",
+       [YAFFS_BLOCK_STATE_ALLOCATING] = "Allocating",
+       [YAFFS_BLOCK_STATE_FULL] = "Full",
+       [YAFFS_BLOCK_STATE_DIRTY] = "Dirty",
+       [YAFFS_BLOCK_STATE_CHECKPOINT] = "Checkpoint",
+       [YAFFS_BLOCK_STATE_COLLECTING] = "Collecting",
+       [YAFFS_BLOCK_STATE_DEAD] = "Dead"
 };
 
 void yaffs_verify_blk(struct yaffs_dev *dev, struct yaffs_block_info *bi, int n)
@@ -54,6 +53,8 @@ void yaffs_verify_blk(struct yaffs_dev *dev, struct yaffs_block_info *bi, int n)
        int actually_used;
        int in_use;
 
+       (void) block_state_name;
+
        if (yaffs_skip_verification(dev))
                return;
 
@@ -77,10 +78,10 @@ void yaffs_verify_blk(struct yaffs_dev *dev, struct yaffs_block_info *bi, int n)
        actually_used = bi->pages_in_use - bi->soft_del_pages;
 
        if (bi->pages_in_use < 0 ||
-           bi->pages_in_use > dev->param.chunks_per_block ||
+           bi->pages_in_use > (int)dev->param.chunks_per_block ||
            bi->soft_del_pages < 0 ||
-           bi->soft_del_pages > dev->param.chunks_per_block ||
-           actually_used < 0 || actually_used > dev->param.chunks_per_block)
+           bi->soft_del_pages > (int)dev->param.chunks_per_block ||
+           actually_used < 0 || actually_used > (int)dev->param.chunks_per_block)
                yaffs_trace(YAFFS_TRACE_VERIFY,
                        "Block %d has illegal values pages_in_used %d soft_del_pages %d",
                        n, bi->pages_in_use, bi->soft_del_pages);
@@ -110,8 +111,8 @@ void yaffs_verify_collected_blk(struct yaffs_dev *dev,
 
 void yaffs_verify_blocks(struct yaffs_dev *dev)
 {
-       int i;
-       int state_count[YAFFS_NUMBER_OF_BLOCK_STATES];
+       u32 i;
+       u32 state_count[YAFFS_NUMBER_OF_BLOCK_STATES];
        int illegal_states = 0;
 
        if (yaffs_skip_verification(dev))
@@ -149,7 +150,7 @@ void yaffs_verify_blocks(struct yaffs_dev *dev)
                        dev->blocks_in_checkpt,
                        state_count[YAFFS_BLOCK_STATE_CHECKPOINT]);
 
-       if (dev->n_erased_blocks != state_count[YAFFS_BLOCK_STATE_EMPTY])
+       if (dev->n_erased_blocks != (int)state_count[YAFFS_BLOCK_STATE_EMPTY])
                yaffs_trace(YAFFS_TRACE_VERIFY,
                        "Erased block count wrong dev %d count %d",
                        dev->n_erased_blocks,
@@ -201,7 +202,7 @@ void yaffs_verify_oh(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh,
                        tags->obj_id, oh->parent_obj_id);
 
        if (parent_check && obj->parent &&
-           oh->parent_obj_id != obj->parent->obj_id &&
+           oh->parent_obj_id !=  obj->parent->obj_id &&
            (oh->parent_obj_id != YAFFS_OBJECTID_UNLINKED ||
             obj->parent->obj_id != YAFFS_OBJECTID_DELETED))
                yaffs_trace(YAFFS_TRACE_VERIFY,
@@ -222,12 +223,13 @@ void yaffs_verify_oh(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh,
 
 void yaffs_verify_file(struct yaffs_obj *obj)
 {
+       u32 x;
        int required_depth;
-       int actual_depth;
-       u32 last_chunk;
+       int last_chunk;
+       u32 offset_in_chunk;
        u32 the_chunk;
-       u32 x;
-       u32 i;
+
+       int i;
        struct yaffs_dev *dev;
        struct yaffs_ext_tags tags;
        struct yaffs_tnode *tn;
@@ -242,9 +244,11 @@ void yaffs_verify_file(struct yaffs_obj *obj)
        dev = obj->my_dev;
        obj_id = obj->obj_id;
 
+
        /* Check file size is consistent with tnode depth */
-       last_chunk =
-           obj->variant.file_variant.file_size / dev->data_bytes_per_chunk + 1;
+       yaffs_addr_to_chunk(dev, obj->variant.file_variant.file_size,
+                               &last_chunk, &offset_in_chunk);
+       last_chunk++;
        x = last_chunk >> YAFFS_TNODES_LEVEL0_BITS;
        required_depth = 0;
        while (x > 0) {
@@ -252,8 +256,6 @@ void yaffs_verify_file(struct yaffs_obj *obj)
                required_depth++;
        }
 
-       actual_depth = obj->variant.file_variant.top_level;
-
        /* Check that the chunks in the tnode tree are all correct.
         * We do this by scanning through the tnode tree and
         * checking the tags for every chunk match.
@@ -272,7 +274,7 @@ void yaffs_verify_file(struct yaffs_obj *obj)
                if (the_chunk > 0) {
                        yaffs_rd_chunk_tags_nand(dev, the_chunk, NULL,
                                                 &tags);
-                       if (tags.obj_id != obj_id || tags.chunk_id != i)
+                       if (tags.obj_id != obj_id || tags.chunk_id != (u32)i)
                                yaffs_trace(YAFFS_TRACE_VERIFY,
                                        "Object %d chunk_id %d NAND mismatch chunk %d tags (%d:%d)",
                                        obj_id, i, the_chunk,
@@ -349,7 +351,7 @@ void yaffs_verify_obj(struct yaffs_obj *obj)
        if (chunk_valid && !yaffs_skip_nand_verification(dev)) {
                struct yaffs_ext_tags tags;
                struct yaffs_obj_hdr *oh;
-               u8 *buffer = yaffs_get_temp_buffer(dev, __LINE__);
+               u8 *buffer = yaffs_get_temp_buffer(dev);
 
                oh = (struct yaffs_obj_hdr *)buffer;
 
@@ -357,7 +359,7 @@ void yaffs_verify_obj(struct yaffs_obj *obj)
 
                yaffs_verify_oh(obj, oh, &tags, 1);
 
-               yaffs_release_temp_buffer(dev, buffer, __LINE__);
+               yaffs_release_temp_buffer(dev, buffer);
        }
 
        /* Verify it has a parent */
@@ -466,12 +468,26 @@ void yaffs_verify_dir(struct yaffs_obj *directory)
 {
        struct list_head *lh;
        struct yaffs_obj *list_obj;
+       struct yaffs_dev *dev;
 
        if (!directory) {
                BUG();
                return;
        }
 
+       dev = directory->my_dev;
+
+       if (!dev) {
+               BUG();
+               return;
+       }
+
+       if (directory == dev->root_dir ||
+           directory == dev->lost_n_found ||
+           directory == dev->unlinked_dir ||
+           directory == dev->del_dir)
+               return;
+
        if (yaffs_skip_full_verification(directory->my_dev))
                return;
 
@@ -520,6 +536,6 @@ void yaffs_verify_free_chunks(struct yaffs_dev *dev)
 
 int yaffs_verify_file_sane(struct yaffs_obj *in)
 {
-       in = in;
+       (void) in;
        return YAFFS_OK;
 }