yaffs: Tweaks to summary code
[yaffs2.git] / yaffs_guts.h
index e4680e819e4610e54a8759855d8600b9cae14450..fc311435207c08bcdbbbd115695e702d610d6aa8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * YAFFS: Yet another Flash File System . A NAND-flash specific file system.
  *
- * Copyright (C) 2002-2010 Aleph One Ltd.
+ * Copyright (C) 2002-2011 Aleph One Ltd.
  *   for Toby Churchill Ltd and Brightstar Engineering
  *
  * Created by Charles Manning <charles@aleph1.co.uk>
 
 /* Give us a  Y=0x59,
  * Give us an A=0x41,
- * Give us an FF=0xFF
+ * Give us an FF=0xff
  * Give us an S=0x53
  * And what have we got...
  */
-#define YAFFS_MAGIC                    0x5941FF53
+#define YAFFS_MAGIC                    0x5941ff53
 
 #define YAFFS_NTNODES_LEVEL0           16
 #define YAFFS_TNODES_LEVEL0_BITS       4
@@ -49,7 +49,7 @@
 #define YAFFS_MIN_YAFFS2_CHUNK_SIZE    1024
 #define YAFFS_MIN_YAFFS2_SPARE_SIZE    32
 
-#define YAFFS_MAX_CHUNK_ID             0x000FFFFF
+#define YAFFS_MAX_CHUNK_ID             0x000fffff
 
 #define YAFFS_ALLOCATION_NOBJECTS      100
 #define YAFFS_ALLOCATION_NTNODES       100
 #define YAFFS_OBJECTID_UNLINKED                3
 #define YAFFS_OBJECTID_DELETED         4
 
+/* Fake object Id for summary data */
+#define YAFFS_OBJECTID_SUMMARY         0x10
+
 /* Pseudo object ids for checkpointing */
-#define YAFFS_OBJECTID_SB_HEADER       0x10
 #define YAFFS_OBJECTID_CHECKPOINT_DATA 0x20
-#define YAFFS_SEQUENCE_CHECKPOINT_DATA  0x21
+#define YAFFS_SEQUENCE_CHECKPOINT_DATA 0x21
 
 #define YAFFS_MAX_SHORT_OP_CACHES      20
 
  * and is a larger number than the lifetime of a 2GB device.
  */
 #define YAFFS_LOWEST_SEQUENCE_NUMBER   0x00001000
-#define YAFFS_HIGHEST_SEQUENCE_NUMBER  0xEFFFFF00
+#define YAFFS_HIGHEST_SEQUENCE_NUMBER  0xefffff00
 
 /* Special sequence number for bad block that failed to be marked bad */
-#define YAFFS_SEQUENCE_BAD_BLOCK       0xFFFF0000
+#define YAFFS_SEQUENCE_BAD_BLOCK       0xffff0000
 
 /* ChunkCache is used for short read/write operations.*/
 struct yaffs_cache {
@@ -160,8 +162,6 @@ enum yaffs_obj_type {
 #define YAFFS_OBJECT_TYPE_MAX YAFFS_OBJECT_TYPE_SPECIAL
 
 struct yaffs_ext_tags {
-
-       unsigned validity0;
        unsigned chunk_used;    /*  Status of the chunk: used or unused */
        unsigned obj_id;        /* If 0 this is not used */
        unsigned chunk_id;      /* If 0 this is a header, else a data chunk */
@@ -189,9 +189,6 @@ struct yaffs_ext_tags {
 
        unsigned extra_length;  /* Length if it is a file */
        unsigned extra_equiv_id;        /* Equivalent object for a hard link */
-
-       unsigned validity1;
-
 };
 
 /* Spare structure for YAFFS1 */
@@ -225,7 +222,7 @@ enum yaffs_block_state {
        YAFFS_BLOCK_STATE_SCANNING,
        /* Being scanned */
 
-       YAFFS_BLOCK_STATE_NEEDS_SCANNING,
+       YAFFS_BLOCK_STATE_NEEDS_SCAN,
        /* The block might have something on it (ie it is allocating or full,
         * perhaps empty) but it needs to be scanned to determine its true
         * state.
@@ -285,6 +282,7 @@ struct yaffs_block_info {
                                   Block should be prioritised for GC */
        u32 chunk_error_strikes:3;      /* How many times we've had ecc etc
                                failures on this block and tried to reuse it */
+       u32 has_summary:1;      /* The block has a summary */
 
 #ifdef CONFIG_YAFFS_YAFFS2
        u32 has_shrink_hdr:1;   /* This block has at least one shrink header */
@@ -492,13 +490,12 @@ struct yaffs_checkpt_obj {
 
 /*--------------------- Temporary buffers ----------------
  *
- * These are chunk-sized working buffers. Each device has a few
+ * These are chunk-sized working buffers. Each device has a few.
  */
 
 struct yaffs_buffer {
        u8 *buffer;
-       int line;       /* track from whence this buffer was allocated */
-       int max_line;
+       int in_use;
 };
 
 /*----------------- Device ---------------------------------*/
@@ -594,6 +591,8 @@ struct yaffs_param {
        int auto_unicode;
 #endif
        int always_check_erased;        /* Force chunk erased check always on */
+
+       int disable_summary;
 };
 
 struct yaffs_dev {
@@ -693,6 +692,7 @@ struct yaffs_dev {
        unsigned gc_block;
        unsigned gc_chunk;
        unsigned gc_skip;
+       struct yaffs_summary_tags *gc_sum_tags;
 
        /* Special directories */
        struct yaffs_obj *root_dir;
@@ -735,7 +735,11 @@ struct yaffs_dev {
        /* Dirty directory handling */
        struct list_head dirty_dirs;    /* List of dirty directories */
 
-       /* Statistcs */
+       /* Summary */
+       int chunks_per_summary;
+       struct yaffs_summary_tags *sum_tags;
+
+       /* Statistics */
        u32 n_page_writes;
        u32 n_page_reads;
        u32 n_erasures;
@@ -756,6 +760,8 @@ struct yaffs_dev {
        u32 n_unmarked_deletions;
        u32 refresh_count;
        u32 cache_hits;
+       u32 tags_used;
+       u32 summary_used;
 
 };
 
@@ -893,8 +899,8 @@ int yaffs_check_ff(u8 *buffer, int n_bytes);
 void yaffs_handle_chunk_error(struct yaffs_dev *dev,
                              struct yaffs_block_info *bi);
 
-u8 *yaffs_get_temp_buffer(struct yaffs_dev *dev, int line_no);
-void yaffs_release_temp_buffer(struct yaffs_dev *dev, u8 *buffer, int line_no);
+u8 *yaffs_get_temp_buffer(struct yaffs_dev *dev);
+void yaffs_release_temp_buffer(struct yaffs_dev *dev, u8 *buffer);
 
 struct yaffs_obj *yaffs_find_or_create_by_number(struct yaffs_dev *dev,
                                                 int number,
@@ -906,7 +912,7 @@ void yaffs_set_obj_name_from_oh(struct yaffs_obj *obj,
                                const struct yaffs_obj_hdr *oh);
 void yaffs_add_obj_to_dir(struct yaffs_obj *directory, struct yaffs_obj *obj);
 YCHAR *yaffs_clone_str(const YCHAR *str);
-void yaffs_link_fixup(struct yaffs_dev *dev, struct yaffs_obj *hard_list);
+void yaffs_link_fixup(struct yaffs_dev *dev, struct list_head *hard_list);
 void yaffs_block_became_dirty(struct yaffs_dev *dev, int block_no);
 int yaffs_update_oh(struct yaffs_obj *in, const YCHAR *name,
                    int force, int is_shrink, int shadows,