X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=yaffs_guts.c;h=789f8e2bf6cc0b3aca70ac1e15cda590b58216dc;hb=refs%2Fheads%2Fcase-insensitive;hp=cd70c5415d72af03ea6a08e471fe89394f9f324c;hpb=2c98f380f6e28ef71d4d7a8a174cc22b0481f102;p=yaffs2.git diff --git a/yaffs_guts.c b/yaffs_guts.c index cd70c54..789f8e2 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -27,6 +27,7 @@ #include "yaffs_nameval.h" #include "yaffs_allocator.h" #include "yaffs_attribs.h" +#include "yaffs_summary.h" /* Note YAFFS_GC_GOOD_ENOUGH must be <= YAFFS_GC_PASSIVE_THRESHOLD */ #define YAFFS_GC_GOOD_ENOUGH 2 @@ -597,7 +598,7 @@ static int yaffs_write_new_chunk(struct yaffs_dev *dev, yaffs_trace(YAFFS_TRACE_ERROR, "**>> yaffs write required %d attempts", attempts); - dev->n_retired_writes += (attempts - 1); + dev->n_retried_writes += (attempts - 1); } return chunk; @@ -673,9 +674,9 @@ void yaffs_set_obj_name(struct yaffs_obj *obj, const YCHAR * name) { memset(obj->short_name, 0, sizeof(obj->short_name)); if (name && - strnlen(name, YAFFS_SHORT_NAME_LENGTH + 1) <= + yaffs_strnlen(name, YAFFS_SHORT_NAME_LENGTH + 1) <= YAFFS_SHORT_NAME_LENGTH) - strcpy(obj->short_name, name); + yaffs_strcpy(obj->short_name, name); else obj->short_name[0] = _Y('\0'); obj->sum = yaffs_calc_name_sum(name); @@ -2033,10 +2034,10 @@ YCHAR *yaffs_clone_str(const YCHAR *str) if (!str) str = _Y(""); - len = strnlen(str, YAFFS_MAX_ALIAS_LENGTH); + len = yaffs_strnlen(str, YAFFS_MAX_ALIAS_LENGTH); new_str = kmalloc((len + 1) * sizeof(YCHAR), GFP_NOFS); if (new_str) { - strncpy(new_str, str, len); + yaffs_strncpy(new_str, str, len); new_str[len] = 0; } return new_str; @@ -2380,6 +2381,8 @@ void yaffs_block_became_dirty(struct yaffs_dev *dev, int block_no) bi->has_shrink_hdr = 0; bi->skip_erased_check = 1; /* Clean, so no need to check */ bi->gc_prioritise = 0; + bi->has_summary=0; + yaffs_clear_chunk_bits(dev, block_no); yaffs_trace(YAFFS_TRACE_ERASE, "Erased block %d", block_no); @@ -2555,6 +2558,8 @@ static int yaffs_gc_block(struct yaffs_dev *dev, int block, int whole_block) dev->gc_disable = 1; + yaffs_summary_gc(dev, block); + if (is_checkpt_block || !yaffs_still_some_chunks(dev, block)) { yaffs_trace(YAFFS_TRACE_TRACING, "Collecting block %d that has no chunks in use", @@ -3205,13 +3210,13 @@ static void yaffs_load_name_from_oh(struct yaffs_dev *dev, YCHAR *name, n--; } } else { - strncpy(name, oh_name + 1, buff_size - 1); + yaffs_strncpy(name, oh_name + 1, buff_size - 1); } } else { #else { #endif - strncpy(name, oh_name, buff_size - 1); + yaffs_strncpy(name, oh_name, buff_size - 1); } } @@ -3248,13 +3253,13 @@ static void yaffs_load_oh_from_name(struct yaffs_dev *dev, YCHAR *oh_name, } else { /* Unicode name, so save starting at the second YCHAR */ *oh_name = 0; - strncpy(oh_name + 1, name, YAFFS_MAX_NAME_LENGTH - 2); + yaffs_strncpy(oh_name + 1, name, YAFFS_MAX_NAME_LENGTH - 2); } } else { #else { #endif - strncpy(oh_name, name, YAFFS_MAX_NAME_LENGTH - 1); + yaffs_strncpy(oh_name, name, YAFFS_MAX_NAME_LENGTH - 1); } } @@ -3278,7 +3283,7 @@ int yaffs_update_oh(struct yaffs_obj *in, const YCHAR *name, int force, YCHAR old_name[YAFFS_MAX_NAME_LENGTH + 1]; struct yaffs_obj_hdr *oh = NULL; - strcpy(old_name, _Y("silly old name")); + yaffs_strcpy(old_name, _Y("silly old name")); if (in->fake && in != dev->root_dir && !force && !xmod) return ret_val; @@ -3347,7 +3352,7 @@ int yaffs_update_oh(struct yaffs_obj *in, const YCHAR *name, int force, alias = in->variant.symlink_variant.alias; if (!alias) alias = _Y("no alias"); - strncpy(oh->alias, alias, YAFFS_MAX_ALIAS_LENGTH); + yaffs_strncpy(oh->alias, alias, YAFFS_MAX_ALIAS_LENGTH); oh->alias[YAFFS_MAX_ALIAS_LENGTH] = 0; break; } @@ -4058,11 +4063,11 @@ int yaffs_rename_obj(struct yaffs_obj *old_dir, const YCHAR *old_name, */ if (old_dir == new_dir && old_name && new_name && - strcmp(old_name, new_name) == 0) + yaffs_strcmp(old_name, new_name) == 0) force = 1; #endif - if (strnlen(new_name, YAFFS_MAX_NAME_LENGTH + 1) > + if (yaffs_strnlen(new_name, YAFFS_MAX_NAME_LENGTH + 1) > YAFFS_MAX_NAME_LENGTH) /* ENAMETOOLONG */ return YAFFS_FAIL; @@ -4338,7 +4343,7 @@ struct yaffs_obj *yaffs_find_by_name(struct yaffs_obj *directory, /* Special case for lost-n-found */ if (l->obj_id == YAFFS_OBJECTID_LOSTNFOUND) { - if (!strcmp(name, YAFFS_LOSTNFOUND_NAME)) + if (!yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME)) return l; } else if (l->sum == sum || l->hdr_chunk <= 0) { /* LostnFound chunk called Objxxx @@ -4346,7 +4351,7 @@ struct yaffs_obj *yaffs_find_by_name(struct yaffs_obj *directory, */ yaffs_get_obj_name(l, buffer, YAFFS_MAX_NAME_LENGTH + 1); - if (strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH) == 0) + if (yaffs_strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH) == 0) return l; } } @@ -4389,7 +4394,7 @@ static void yaffs_fix_null_name(struct yaffs_obj *obj, YCHAR *name, int buffer_size) { /* Create an object name if we could not find one. */ - if (strnlen(name, YAFFS_MAX_NAME_LENGTH) == 0) { + if (yaffs_strnlen(name, YAFFS_MAX_NAME_LENGTH) == 0) { YCHAR local_name[20]; YCHAR num_string[20]; YCHAR *x = &num_string[19]; @@ -4401,9 +4406,9 @@ static void yaffs_fix_null_name(struct yaffs_obj *obj, YCHAR *name, v /= 10; } /* make up a name */ - strcpy(local_name, YAFFS_LOSTNFOUND_PREFIX); - strcat(local_name, x); - strncpy(name, local_name, buffer_size - 1); + yaffs_strcpy(local_name, YAFFS_LOSTNFOUND_PREFIX); + yaffs_strcat(local_name, x); + yaffs_strncpy(name, local_name, buffer_size - 1); } } @@ -4412,9 +4417,9 @@ int yaffs_get_obj_name(struct yaffs_obj *obj, YCHAR *name, int buffer_size) memset(name, 0, buffer_size * sizeof(YCHAR)); yaffs_check_obj_details_loaded(obj); if (obj->obj_id == YAFFS_OBJECTID_LOSTNFOUND) { - strncpy(name, YAFFS_LOSTNFOUND_NAME, buffer_size - 1); + yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffer_size - 1); } else if (obj->short_name[0]) { - strcpy(name, obj->short_name); + yaffs_strcpy(name, obj->short_name); } else if (obj->hdr_chunk > 0) { int result; u8 *buffer = yaffs_get_temp_buffer(obj->my_dev); @@ -4436,7 +4441,7 @@ int yaffs_get_obj_name(struct yaffs_obj *obj, YCHAR *name, int buffer_size) yaffs_fix_null_name(obj, name, buffer_size); - return strnlen(name, YAFFS_MAX_NAME_LENGTH); + return yaffs_strnlen(name, YAFFS_MAX_NAME_LENGTH); } int yaffs_get_obj_length(struct yaffs_obj *obj) @@ -4449,7 +4454,7 @@ int yaffs_get_obj_length(struct yaffs_obj *obj) if (obj->variant_type == YAFFS_OBJECT_TYPE_SYMLINK) { if (!obj->variant.symlink_variant.alias) return 0; - return strnlen(obj->variant.symlink_variant.alias, + return yaffs_strnlen(obj->variant.symlink_variant.alias, YAFFS_MAX_ALIAS_LENGTH); } else { /* Only a directory should drop through to here */ @@ -4806,6 +4811,11 @@ int yaffs_guts_initialise(struct yaffs_dev *dev) if (!init_failed && !yaffs_create_initial_dir(dev)) init_failed = 1; + if(!init_failed && dev->param.is_yaffs2 && + !dev->param.disable_summary && + !yaffs_summary_init(dev)) + init_failed = 1; + if (!init_failed) { /* Now scan the flash. */ if (dev->param.is_yaffs2) { @@ -4868,7 +4878,7 @@ int yaffs_guts_initialise(struct yaffs_dev *dev) dev->n_page_writes = 0; dev->n_erasures = 0; dev->n_gc_copies = 0; - dev->n_retired_writes = 0; + dev->n_retried_writes = 0; dev->n_retired_blocks = 0; @@ -4891,6 +4901,8 @@ void yaffs_deinitialise(struct yaffs_dev *dev) yaffs_deinit_blocks(dev); yaffs_deinit_tnodes_and_objs(dev); + yaffs_summary_deinit(dev); + if (dev->param.n_caches > 0 && dev->cache) { for (i = 0; i < dev->param.n_caches; i++) {