yaffs Direct: Add feature to limit the number of files that may be created on a singl...
[yaffs2.git] / yaffs_guts.h
index 3b01dfa2549cf7af55aa9b864eb8b76ee00123f3..b6d51299d87ffbc6ba8cac87a470b8872726249c 100644 (file)
 #define YAFFS_TNODES_INTERNAL_MASK     0x7
 #define YAFFS_TNODES_MAX_LEVEL         6
 
-#ifndef CONFIG_YAFFS_NO_YAFFS1
+
+/* Constants for YAFFS1 mode */
 #define YAFFS_BYTES_PER_SPARE          16
 #define YAFFS_BYTES_PER_CHUNK          512
 #define YAFFS_CHUNK_SIZE_SHIFT         9
 #define YAFFS_CHUNKS_PER_BLOCK         32
 #define YAFFS_BYTES_PER_BLOCK  (YAFFS_CHUNKS_PER_BLOCK*YAFFS_BYTES_PER_CHUNK)
-#endif
 
 #define YAFFS_MIN_YAFFS2_CHUNK_SIZE    1024
 #define YAFFS_MIN_YAFFS2_SPARE_SIZE    32
 #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
 
@@ -117,12 +119,11 @@ struct yaffs_cache {
        u8 *data;
 };
 
-/* Tags structures in RAM
+/* yaffs1 tags structures in RAM
  * NB This uses bitfield. Bitfields should not straddle a u32 boundary
  * otherwise the structure size will get blown out.
  */
 
-#ifndef CONFIG_YAFFS_NO_YAFFS1
 struct yaffs_tags {
        unsigned chunk_id:20;
        unsigned serial_number:2;
@@ -137,7 +138,6 @@ union yaffs_tags_union {
        u8 as_bytes[8];
 };
 
-#endif
 
 /* Stuff used for extended tags in YAFFS2 */
 
@@ -280,11 +280,10 @@ 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 */
        u32 seq_number;         /* block sequence number for yaffs2 */
-#endif
 
 };
 
@@ -433,9 +432,7 @@ struct yaffs_obj {
 
        u32 yst_mode;
 
-#ifndef CONFIG_YAFFS_NO_SHORT_NAMES
        YCHAR short_name[YAFFS_SHORT_NAME_LENGTH + 1];
-#endif
 
 #ifdef CONFIG_YAFFS_WINCE
        u32 win_ctime[2];
@@ -487,13 +484,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 ---------------------------------*/
@@ -522,6 +518,7 @@ struct yaffs_param {
                                 */
        int use_nand_ecc;       /* Flag to decide whether or not to use
                                 * NAND driver ECC on data (yaffs1) */
+        int tags_9bytes;       /* Use 9 byte tags */
        int no_tags_ecc;        /* Flag to decide whether or not to do ECC
                                 * on packed tags (yaffs2) */
 
@@ -549,7 +546,7 @@ struct yaffs_param {
        int (*initialise_flash_fn) (struct yaffs_dev *dev);
        int (*deinitialise_flash_fn) (struct yaffs_dev *dev);
 
-#ifdef CONFIG_YAFFS_YAFFS2
+       /* yaffs2 mode functions */
        int (*write_chunk_tags_fn) (struct yaffs_dev *dev,
                                    int nand_chunk, const u8 *data,
                                    const struct yaffs_ext_tags *tags);
@@ -560,7 +557,6 @@ struct yaffs_param {
        int (*query_block_fn) (struct yaffs_dev *dev, int block_no,
                               enum yaffs_block_state *state,
                               u32 *seq_number);
-#endif
 
        /* The remove_obj_fn function must be supplied by OS flavours that
         * need it.
@@ -589,6 +585,13 @@ struct yaffs_param {
        int auto_unicode;
 #endif
        int always_check_erased;        /* Force chunk erased check always on */
+
+       int disable_summary;
+
+       int max_objects;        /*
+                                * Set to limit the number of objects created.
+                                * 0 = no limit.
+                               */
 };
 
 struct yaffs_dev {
@@ -688,6 +691,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;
@@ -730,7 +734,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;
@@ -741,7 +749,7 @@ struct yaffs_dev {
        u32 oldest_dirty_gc_count;
        u32 n_gc_blocks;
        u32 bg_gcs;
-       u32 n_retired_writes;
+       u32 n_retried_writes;
        u32 n_retired_blocks;
        u32 n_ecc_fixed;
        u32 n_ecc_unfixed;
@@ -751,6 +759,8 @@ struct yaffs_dev {
        u32 n_unmarked_deletions;
        u32 refresh_count;
        u32 cache_hits;
+       u32 tags_used;
+       u32 summary_used;
 
 };
 
@@ -888,8 +898,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,