New yaffs2_image_maker tool to work with 4kB pages - still under test
[yaffs2.git] / yaffs_guts.h
index b0aca333fe706330bafe0f5ad983ab5b54b3bcf2..96fd547c40d47b629d41679cf26bf1a2521b04fa 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>
  *
 /* Special sequence number for bad block that failed to be marked bad */
 #define YAFFS_SEQUENCE_BAD_BLOCK       0xffff0000
 
-/* ChunkCache is used for short read/write operations.*/
+/* Chunk cache is used for short read/write operations.*/
 struct yaffs_cache {
        struct yaffs_obj *object;
        int chunk_id;
@@ -137,6 +136,13 @@ struct yaffs_cache {
        u8 *data;
 };
 
+struct yaffs_cache_manager {
+       struct yaffs_cache *cache;
+       int n_caches;
+       int cache_last_use;
+       int n_temp_buffers;
+};
+
 /* yaffs1 tags structures in RAM
  * NB This uses bitfield. Bitfields should not straddle a u32 boundary
  * otherwise the structure size will get blown out.
@@ -153,7 +159,8 @@ struct yaffs_tags {
 
 union yaffs_tags_union {
        struct yaffs_tags as_tags;
-       u8 as_bytes[8];
+       u8  as_bytes[8];
+       u32 as_u32[2];
 };
 
 
@@ -311,6 +318,11 @@ struct yaffs_block_info {
 
 };
 
+union yaffs_block_info_union {
+       struct yaffs_block_info bi;
+       u32     as_u32[2];
+};
+
 /* -------------------------- Object structure -------------------------------*/
 /* This is the object structure as stored on NAND */
 
@@ -318,7 +330,7 @@ struct yaffs_obj_hdr {
        u32 type;  /* enum yaffs_obj_type  */
 
        /* Apply to everything  */
-       int parent_obj_id;
+       u32 parent_obj_id;
        u16 sum_no_longer_used; /* checksum of name. No longer used */
        YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];
 
@@ -521,14 +533,14 @@ struct yaffs_param {
        int inband_tags;        /* Use unband tags */
        u32 total_bytes_per_chunk;      /* Should be >= 512, does not need to
                                         be a power of 2 */
-       int chunks_per_block;   /* does not need to be a power of 2 */
-       int spare_bytes_per_chunk;      /* spare area size */
-       int start_block;        /* Start block we're allowed to use */
-       int end_block;          /* End block we're allowed to use */
-       int n_reserved_blocks;  /* Tuneable so that we can reduce
+       u32 chunks_per_block;   /* does not need to be a power of 2 */
+       u32 spare_bytes_per_chunk;      /* spare area size */
+       u32 start_block;        /* Start block we're allowed to use */
+       u32 end_block;          /* End block we're allowed to use */
+       u32 n_reserved_blocks;  /* Tuneable so that we can reduce
                                 * reserved blocks on NOR and RAM. */
 
-       int n_caches;           /* If <= 0, then short op caching is disabled,
+       u32 n_caches;           /* If == 0, then short op caching is disabled,
                                 * else the number of short op caches.
                                 */
        int cache_bypass_aligned; /* If non-zero then bypass the cache for
@@ -560,6 +572,8 @@ struct yaffs_param {
 
        int hide_lost_n_found;  /* Set non-zero to hide the lost-n-found dir. */
 
+       int stored_endian; /* 0=cpu endian, 1=little endian, 2=big endian */
+
        /* The remove_obj_fn function must be supplied by OS flavours that
         * need it.
         * yaffs direct uses it to implement the faster readdir.
@@ -636,7 +650,7 @@ struct yaffs_dev {
 
        int ll_init;
        /* Runtime parameters. Set up by YAFFS. */
-       int data_bytes_per_chunk;
+       u32 data_bytes_per_chunk;
 
        /* Non-wide tnode stuff */
        u16 chunk_grp_bits;     /* Number of bits that need to be resolved if
@@ -644,6 +658,8 @@ struct yaffs_dev {
                                 */
        u16 chunk_grp_size;     /* == 2^^chunk_grp_bits */
 
+       struct yaffs_tnode *tn_swap_buffer;
+
        /* Stuff to support wide tnodes */
        u32 tnode_width;
        u32 tnode_mask;
@@ -657,10 +673,11 @@ struct yaffs_dev {
        int is_mounted;
        int read_only;
        int is_checkpointed;
+       int swap_endian;        /* Stored endian needs endian swap. */
 
        /* Stuff to support block offsetting to support start block zero */
-       int internal_start_block;
-       int internal_end_block;
+       u32 internal_start_block;
+       u32 internal_end_block;
        int block_offset;
        int chunk_offset;
 
@@ -670,12 +687,12 @@ struct yaffs_dev {
        int checkpt_byte_offs;
        u8 *checkpt_buffer;
        int checkpt_open_write;
-       int blocks_in_checkpt;
+       u32 blocks_in_checkpt;
        int checkpt_cur_chunk;
        int checkpt_cur_block;
        int checkpt_next_block;
        int *checkpt_block_list;
-       int checkpt_max_blocks;
+       u32 checkpt_max_blocks;
        u32 checkpt_sum;
        u32 checkpt_xor;
 
@@ -731,8 +748,7 @@ struct yaffs_dev {
        int buffered_block;     /* Which block is buffered here? */
        int doing_buffered_block_rewrite;
 
-       struct yaffs_cache *cache;
-       int cache_last_use;
+       struct yaffs_cache_manager cache_mgr;
 
        /* Stuff for background deletion and unlinked files. */
        struct yaffs_obj *unlinked_dir; /* Directory where unlinked and deleted
@@ -875,12 +891,15 @@ struct yaffs_xattr_mod {
 
 int yaffs_guts_initialise(struct yaffs_dev *dev);
 void yaffs_deinitialise(struct yaffs_dev *dev);
+void yaffs_guts_cleanup(struct yaffs_dev *dev);
 
 int yaffs_get_n_free_chunks(struct yaffs_dev *dev);
 
 int yaffs_rename_obj(struct yaffs_obj *old_dir, const YCHAR * old_name,
                     struct yaffs_obj *new_dir, const YCHAR * new_name);
 
+int yaffs_unlink_obj(struct yaffs_obj *obj);
+
 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,
@@ -1018,13 +1037,20 @@ 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);
 /*
- * Marshalling functions to get loff_t file sizes into aand out of
+ * Marshalling functions to get loff_t file sizes into and out of
  * object headers.
  */
-void yaffs_oh_size_load(struct yaffs_obj_hdr *oh, loff_t fsize);
-loff_t yaffs_oh_to_size(struct yaffs_obj_hdr *oh);
+void yaffs_oh_size_load(struct yaffs_dev *dev, struct yaffs_obj_hdr *oh,
+                       loff_t fsize, int do_endian);
+loff_t yaffs_oh_to_size(struct yaffs_dev *dev, struct yaffs_obj_hdr *oh,
+                       int do_endian);
 loff_t yaffs_max_file_size(struct yaffs_dev *dev);
 
+
+/* yaffs_wr_data_obj needs to be exposed to allow the cache to access it. */
+int yaffs_wr_data_obj(struct yaffs_obj *in, int inode_chunk,
+                            const u8 *buffer, int n_bytes, int use_reserve);
+
 /*
  * Debug function to count number of blocks in each state
  * NB Needs to be called with correct number of integers
@@ -1035,4 +1061,21 @@ 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);
 
+/*
+ * Define LOFF_T_32_BIT if a 32-bit LOFF_T is being used.
+ * Not serious if you get this wrong - you might just get some warnings.
+*/
+
+#ifdef  LOFF_T_32_BIT
+#define FSIZE_LOW(fsize) (fsize)
+#define FSIZE_HIGH(fsize) 0
+#define FSIZE_COMBINE(high, low) (low)
+#else
+#define FSIZE_LOW(fsize) ((fsize) & 0xffffffff)
+#define FSIZE_HIGH(fsize)(((fsize) >> 32) & 0xffffffff)
+#define FSIZE_COMBINE(high, low) ((((loff_t) (high)) << 32) | \
+                                       (((loff_t) (low)) & 0xFFFFFFFF))
+#endif
+
+
 #endif