Change enums to u32 for stored fields
[yaffs2.git] / yaffs_guts.h
index 64929ed..c2f7ac4 100644 (file)
@@ -144,12 +144,12 @@ struct yaffs_cache {
  */
 
 struct yaffs_tags {
-       unsigned chunk_id:20;
-       unsigned serial_number:2;
-       unsigned n_bytes_lsb:10;
-       unsigned obj_id:18;
-       unsigned ecc:12;
-       unsigned n_bytes_msb:2;
+       u32 chunk_id:20;
+       u32 serial_number:2;
+       u32 n_bytes_lsb:10;
+       u32 obj_id:18;
+       u32 ecc:12;
+       u32 n_bytes_msb:2;
 };
 
 union yaffs_tags_union {
@@ -167,6 +167,12 @@ enum yaffs_ecc_result {
        YAFFS_ECC_RESULT_UNFIXED
 };
 
+/*
+ * Object type enum:
+ * When this is stored in flash we store it as a u32 instead
+ * to prevent any alignment change issues as compiler variants change.
+ */
+
 enum yaffs_obj_type {
        YAFFS_OBJECT_TYPE_UNKNOWN,
        YAFFS_OBJECT_TYPE_FILE,
@@ -287,9 +293,9 @@ enum yaffs_block_state {
 
 struct yaffs_block_info {
 
-       int soft_del_pages:10;  /* number of soft deleted pages */
-       int pages_in_use:10;    /* number of pages in use */
-       unsigned block_state:4; /* One of the above block states. */
+       s32 soft_del_pages:10;  /* number of soft deleted pages */
+       s32 pages_in_use:10;    /* number of pages in use */
+       u32 block_state:4;      /* One of the above block states. */
                                /* NB use unsigned because enum is sometimes
                                 * an int */
        u32 needs_retiring:1;   /* Data has failed on this block, */
@@ -310,7 +316,7 @@ struct yaffs_block_info {
 /* This is the object structure as stored on NAND */
 
 struct yaffs_obj_hdr {
-       enum yaffs_obj_type type;
+       u32 type;  /* enum yaffs_obj_type  */
 
        /* Apply to everything  */
        int parent_obj_id;
@@ -470,7 +476,7 @@ struct yaffs_obj {
 
        void *my_inode;
 
-       enum yaffs_obj_type variant_type;
+       u32 variant_type; /* enum yaffs_object_type */
 
        union yaffs_obj_var variant;
 
@@ -490,7 +496,7 @@ struct yaffs_checkpt_obj {
        u32 obj_id;
        u32 parent_id;
        int hdr_chunk;
-       enum yaffs_obj_type variant_type:3;
+       u32 variant_type:3; /* enum yaffs_obj_type */
        u8 deleted:1;
        u8 soft_del:1;
        u8 unlinked:1;
@@ -592,6 +598,7 @@ struct yaffs_param {
        int always_check_erased;        /* Force chunk erased check always on */
 
        int disable_summary;
+       int disable_bad_block_marking;
 
 };
 
@@ -636,6 +643,7 @@ struct yaffs_dev {
 
        struct list_head dev_list;
 
+       int ll_init;
        /* Runtime parameters. Set up by YAFFS. */
        int data_bytes_per_chunk;
 
@@ -686,8 +694,8 @@ struct yaffs_dev {
        /* Block Info */
        struct yaffs_block_info *block_info;
        u8 *chunk_bits;         /* bitmap of chunks in use */
-       unsigned block_info_alt:1;      /* allocated using alternative alloc */
-       unsigned chunk_bits_alt:1;      /* allocated using alternative alloc */
+       u8 block_info_alt:1;    /* allocated using alternative alloc */
+       u8 chunk_bits_alt:1;    /* allocated using alternative alloc */
        int chunk_bit_stride;   /* Number of bytes of chunk_bits per block.
                                 * Must be consistent with chunks_per_block.
                                 */
@@ -774,6 +782,7 @@ struct yaffs_dev {
        u32 n_page_writes;
        u32 n_page_reads;
        u32 n_erasures;
+       u32 n_bad_queries;
        u32 n_bad_markings;
        u32 n_erase_failures;
        u32 n_gc_copies;
@@ -852,6 +861,9 @@ int yaffs_rename_obj(struct yaffs_obj *old_dir, const YCHAR * old_name,
 
 int yaffs_unlinker(struct yaffs_obj *dir, const YCHAR * name);
 int yaffs_del_obj(struct yaffs_obj *obj);
+struct yaffs_obj *yaffs_retype_obj(struct yaffs_obj *obj,
+                                  enum yaffs_obj_type type);
+
 
 int yaffs_get_obj_name(struct yaffs_obj *obj, YCHAR * name, int buffer_size);
 loff_t yaffs_get_obj_length(struct yaffs_obj *obj);
@@ -870,10 +882,13 @@ struct yaffs_obj *yaffs_create_file(struct yaffs_obj *parent,
                                    const YCHAR *name, u32 mode, u32 uid,
                                    u32 gid);
 
-int yaffs_flush_file(struct yaffs_obj *obj, int update_time, int data_sync);
+int yaffs_flush_file(struct yaffs_obj *in,
+                    int update_time,
+                    int data_sync,
+                    int discard_cache);
 
 /* Flushing and checkpointing */
-void yaffs_flush_whole_cache(struct yaffs_dev *dev);
+void yaffs_flush_whole_cache(struct yaffs_dev *dev, int discard);
 
 int yaffs_checkpoint_save(struct yaffs_dev *dev);
 int yaffs_checkpoint_restore(struct yaffs_dev *dev);
@@ -923,6 +938,8 @@ int yaffs_bg_gc(struct yaffs_dev *dev, unsigned urgency);
 int yaffs_dump_obj(struct yaffs_obj *obj);
 
 void yaffs_guts_test(struct yaffs_dev *dev);
+int yaffs_guts_ll_init(struct yaffs_dev *dev);
+
 
 /* A few useful functions to be used within the core files*/
 void yaffs_chunk_del(struct yaffs_dev *dev, int chunk_id, int mark_flash,
@@ -974,7 +991,7 @@ u32 yaffs_get_group_base(struct yaffs_dev *dev, struct yaffs_tnode *tn,
 
 int yaffs_is_non_empty_dir(struct yaffs_obj *obj);
 
-int yaffs_format_dev(struct yaffs_dev *dev);
+int yaffs_guts_format_dev(struct yaffs_dev *dev);
 
 void yaffs_addr_to_chunk(struct yaffs_dev *dev, loff_t addr,
                                int *chunk_out, u32 *offset_out);
@@ -986,5 +1003,14 @@ void yaffs_oh_size_load(struct yaffs_obj_hdr *oh, loff_t fsize);
 loff_t yaffs_oh_to_size(struct yaffs_obj_hdr *oh);
 loff_t yaffs_max_file_size(struct yaffs_dev *dev);
 
+/*
+ * Debug function to count number of blocks in each state
+ * NB Needs to be called with correct number of integers
+ */
+
+void yaffs_count_blocks_by_state(struct yaffs_dev *dev, int bs[10]);
+
+int yaffs_find_chunk_in_file(struct yaffs_obj *in, int inode_chunk,
+                                   struct yaffs_ext_tags *tags);
 
 #endif