X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.c;h=ce5f2387ab0aad483d8c403c15e69dcc7be663b3;hp=f3bc41905ab50099af47123b4b3c40867f6669ec;hb=df88cf1097f3b7012fc1010cccd4e682fb13de97;hpb=1af6728346f8d3cb23aee150c0b9b63405e4017e diff --git a/yaffs_guts.c b/yaffs_guts.c index f3bc419..ce5f238 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -17,6 +17,7 @@ #include "yaffs_guts.h" #include "yaffs_getblockinfo.h" #include "yaffs_tagscompat.h" +#include "yaffs_tagsmarshall.h" #include "yaffs_nand.h" #include "yaffs_yaffs1.h" #include "yaffs_yaffs2.h" @@ -185,31 +186,6 @@ void yaffs_release_temp_buffer(struct yaffs_dev *dev, u8 *buffer) } -/* - * Determine if we have a managed buffer. - */ -int yaffs_is_managed_tmp_buffer(struct yaffs_dev *dev, const u8 *buffer) -{ - int i; - - for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) { - if (dev->temp_buffer[i].buffer == buffer) - return 1; - } - - for (i = 0; i < dev->param.n_caches; i++) { - if (dev->cache[i].data == buffer) - return 1; - } - - if (buffer == dev->checkpt_buffer) - return 1; - - yaffs_trace(YAFFS_TRACE_ALWAYS, - "yaffs: unmaged buffer detected."); - return 0; -} - /* * Functions for robustisizing TODO * @@ -219,18 +195,18 @@ static void yaffs_handle_chunk_wr_ok(struct yaffs_dev *dev, int nand_chunk, const u8 *data, const struct yaffs_ext_tags *tags) { - dev = dev; - nand_chunk = nand_chunk; - data = data; - tags = tags; + (void) dev; + (void) nand_chunk; + (void) data; + (void) tags; } static void yaffs_handle_chunk_update(struct yaffs_dev *dev, int nand_chunk, const struct yaffs_ext_tags *tags) { - dev = dev; - nand_chunk = nand_chunk; - tags = tags; + (void) dev; + (void) nand_chunk; + (void) tags; } void yaffs_handle_chunk_error(struct yaffs_dev *dev, @@ -633,10 +609,10 @@ static void yaffs_retire_block(struct yaffs_dev *dev, int flash_block) memset(buffer, 0xff, dev->data_bytes_per_chunk); memset(&tags, 0, sizeof(tags)); tags.seq_number = YAFFS_SEQUENCE_BAD_BLOCK; - if (dev->param.write_chunk_tags_fn(dev, chunk_id - - dev->chunk_offset, - buffer, - &tags) != YAFFS_OK) + if (dev->th.write_chunk_tags_fn(dev, chunk_id - + dev->chunk_offset, + buffer, + &tags) != YAFFS_OK) yaffs_trace(YAFFS_TRACE_ALWAYS, "yaffs: Failed to write bad block marker to block %d", flash_block); @@ -742,7 +718,7 @@ static void yaffs_deinit_tnodes_and_objs(struct yaffs_dev *dev) dev->n_tnodes = 0; } -void yaffs_load_tnode_0(struct yaffs_dev *dev, struct yaffs_tnode *tn, +static void yaffs_load_tnode_0(struct yaffs_dev *dev, struct yaffs_tnode *tn, unsigned pos, unsigned val) { u32 *map = (u32 *) tn; @@ -819,7 +795,7 @@ struct yaffs_tnode *yaffs_find_tnode_0(struct yaffs_dev *dev, int required_depth; int level = file_struct->top_level; - dev = dev; + (void) dev; /* Check sane level and chunk Id */ if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL) @@ -1929,7 +1905,7 @@ struct yaffs_obj *yaffs_find_by_number(struct yaffs_dev *dev, u32 number) return NULL; } -struct yaffs_obj *yaffs_new_obj(struct yaffs_dev *dev, int number, +static struct yaffs_obj *yaffs_new_obj(struct yaffs_dev *dev, int number, enum yaffs_obj_type type) { struct yaffs_obj *the_obj = NULL; @@ -2822,7 +2798,8 @@ static int yaffs_check_gc(struct yaffs_dev *dev, int background) int erased_chunks; int checkpt_block_adjust; - if (dev->param.gc_control && (dev->param.gc_control(dev) & 1) == 0) + if (dev->param.gc_control_fn && + (dev->param.gc_control_fn(dev) & 1) == 0) return YAFFS_OK; if (dev->gc_disable) @@ -3226,7 +3203,7 @@ static void yaffs_load_name_from_oh(struct yaffs_dev *dev, YCHAR *name, } } else { #else - dev = dev; + (void) dev; { #endif strncpy(name, oh_name, buff_size - 1); @@ -3584,9 +3561,11 @@ int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset, } if (n_copy != dev->data_bytes_per_chunk || + !dev->param.cache_bypass_aligned || dev->param.inband_tags) { /* An incomplete start or end chunk (or maybe both * start and end chunk), or we're using inband tags, + * or we're forcing writes through the cache, * so we want to use the cache buffers. */ if (dev->param.n_caches > 0) { @@ -3863,7 +3842,7 @@ static int yaffs_unlink_file_if_needed(struct yaffs_obj *in) return ret_val; } -int yaffs_del_file(struct yaffs_obj *in) +static int yaffs_del_file(struct yaffs_obj *in) { int ret_val = YAFFS_OK; int deleted; /* Need to cache value on stack if in is freed */ @@ -4554,30 +4533,33 @@ YCHAR *yaffs_get_symlink_alias(struct yaffs_obj *obj) /*--------------------------- Initialisation code -------------------------- */ -static int yaffs_check_dev_fns(const struct yaffs_dev *dev) +static int yaffs_check_dev_fns(struct yaffs_dev *dev) { + struct yaffs_driver *drv = &dev->drv; + struct yaffs_tags_handler *th = &dev->th; + /* Common functions, gotta have */ - if (!dev->param.erase_fn || !dev->param.initialise_flash_fn) + if (!drv->drv_read_chunk_fn || + !drv->drv_write_chunk_fn || + !drv->drv_erase_fn) return 0; - /* Can use the "with tags" style interface for yaffs1 or yaffs2 */ - if (dev->param.write_chunk_tags_fn && - dev->param.read_chunk_tags_fn && - !dev->param.write_chunk_fn && - !dev->param.read_chunk_fn && - dev->param.bad_block_fn && dev->param.query_block_fn) - return 1; + if (dev->param.is_yaffs2 && + (!drv->drv_mark_bad_fn || !drv->drv_check_bad_fn)) + return 0; - /* Can use the "spare" style interface for yaffs1 */ - if (!dev->param.is_yaffs2 && - !dev->param.write_chunk_tags_fn && - !dev->param.read_chunk_tags_fn && - dev->param.write_chunk_fn && - dev->param.read_chunk_fn && - !dev->param.bad_block_fn && !dev->param.query_block_fn) - return 1; + /* Install the default tags marshalling functions if needed. */ + yaffs_tags_compat_install(dev); + yaffs_tags_marshall_install(dev); - return 0; /* bad */ + /* Check we now have the marshalling functions required. */ + if (!th->write_chunk_tags_fn || + !th->read_chunk_tags_fn || + !th->query_block_fn || + !th->mark_bad_fn) + return 0; + + return 1; } static int yaffs_create_initial_dir(struct yaffs_dev *dev) @@ -4947,8 +4929,7 @@ void yaffs_deinitialise(struct yaffs_dev *dev) dev->is_mounted = 0; - if (dev->param.deinitialise_flash_fn) - dev->param.deinitialise_flash_fn(dev); + yaffs_deinit_nand(dev); } }