* 2^(3*MAX_LEVEL+4)
*
* Thus a max level of 8 supports files with up to 2^^28 chunks which gives
- * a maximum file size of arounf 51Gbytees with 2k chunks.
+ * a maximum file size of around 512Gbytees with 2k chunks.
*/
#define YAFFS_NTNODES_LEVEL0 16
#define YAFFS_TNODES_LEVEL0_BITS 4
int enable_xattr; /* Enable xattribs */
- /* Tags marshalling functions.
- * If these are not set then defaults will be assigned.
- */
- int (*write_chunk_tags_fn) (struct yaffs_dev *dev,
- int nand_chunk, const u8 *data,
- const struct yaffs_ext_tags *tags);
- int (*read_chunk_tags_fn) (struct yaffs_dev *dev,
- int nand_chunk, u8 *data,
- struct yaffs_ext_tags *tags);
-
- int (*query_block_fn) (struct yaffs_dev *dev, int block_no,
- enum yaffs_block_state *state,
- u32 *seq_number);
- int (*mark_bad_fn) (struct yaffs_dev *dev, int block_no);
-
- /* NAND driver access functions All required except
- * the deinitialise function which is optional.
- */
-
- int (*drv_write_chunk_fn) (struct yaffs_dev *dev, int nand_chunk,
- const u8 *data, int data_len,
- const u8 *oob, int oob_len);
- int (*drv_read_chunk_fn) (struct yaffs_dev *dev, int nand_chunk,
- u8 *data, int data_len,
- u8 *oob, int oob_len,
- enum yaffs_ecc_result *ecc_result);
- int (*drv_erase_fn) (struct yaffs_dev *dev, int block_no);
- int (*drv_mark_bad_fn) (struct yaffs_dev *dev, int block_no);
- int (*drv_check_bad_fn) (struct yaffs_dev *dev, int block_no);
- int (*drv_initialise_fn) (struct yaffs_dev *dev);
- int (*drv_deinitialise_fn) (struct yaffs_dev *dev);
-
-
int max_objects; /*
* Set to limit the number of objects created.
* 0 = no limit.
int always_check_erased; /* Force chunk erased check always on */
int disable_summary;
+ int disable_bad_block_marking;
};
+struct yaffs_driver {
+ int (*drv_write_chunk_fn) (struct yaffs_dev *dev, int nand_chunk,
+ const u8 *data, int data_len,
+ const u8 *oob, int oob_len);
+ int (*drv_read_chunk_fn) (struct yaffs_dev *dev, int nand_chunk,
+ u8 *data, int data_len,
+ u8 *oob, int oob_len,
+ enum yaffs_ecc_result *ecc_result);
+ int (*drv_erase_fn) (struct yaffs_dev *dev, int block_no);
+ int (*drv_mark_bad_fn) (struct yaffs_dev *dev, int block_no);
+ int (*drv_check_bad_fn) (struct yaffs_dev *dev, int block_no);
+ int (*drv_initialise_fn) (struct yaffs_dev *dev);
+ int (*drv_deinitialise_fn) (struct yaffs_dev *dev);
+};
+
+struct yaffs_tags_handler {
+ int (*write_chunk_tags_fn) (struct yaffs_dev *dev,
+ int nand_chunk, const u8 *data,
+ const struct yaffs_ext_tags *tags);
+ int (*read_chunk_tags_fn) (struct yaffs_dev *dev,
+ int nand_chunk, u8 *data,
+ struct yaffs_ext_tags *tags);
+
+ int (*query_block_fn) (struct yaffs_dev *dev, int block_no,
+ enum yaffs_block_state *state,
+ u32 *seq_number);
+ int (*mark_bad_fn) (struct yaffs_dev *dev, int block_no);
+};
+
struct yaffs_dev {
struct yaffs_param param;
+ struct yaffs_driver drv;
+ struct yaffs_tags_handler tagger;
/* Context storage. Holds extra OS specific data for this device */
struct list_head dev_list;
+ int ll_init;
/* Runtime parameters. Set up by YAFFS. */
int data_bytes_per_chunk;
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;
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);
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,
int yaffs_is_non_empty_dir(struct yaffs_obj *obj);
+int yaffs_format_dev(struct yaffs_dev *dev);
+
void yaffs_addr_to_chunk(struct yaffs_dev *dev, loff_t addr,
int *chunk_out, u32 *offset_out);
/*
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