yaffs: Add first cut of block summary code
[yaffs2.git] / yaffs_guts.h
index e4680e819e4610e54a8759855d8600b9cae14450..631bd65b52b0aba1e1aa36c249d7aca5437ea3e1 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.
@@ -492,13 +489,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 ---------------------------------*/
@@ -735,6 +731,10 @@ struct yaffs_dev {
        /* Dirty directory handling */
        struct list_head dirty_dirs;    /* List of dirty directories */
 
+       /* Summary */
+       int chunks_per_summary;
+       struct yaffs_summary_tags *sum_tags;
+
        /* Statistcs */
        u32 n_page_writes;
        u32 n_page_reads;
@@ -893,8 +893,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 +906,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,