X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.h;h=fc311435207c08bcdbbbd115695e702d610d6aa8;hp=e4680e819e4610e54a8759855d8600b9cae14450;hb=447f47497bcd9acf7e59823a4e43888356200dc9;hpb=511baf572f96c689043518d443086b8dd6751089 diff --git a/yaffs_guts.h b/yaffs_guts.h index e4680e8..fc31143 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -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 @@ -23,11 +23,11 @@ /* 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 @@ -78,10 +78,12 @@ #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 @@ -101,10 +103,10 @@ * 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,