X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.c;h=6d9f608601f48d0e12fe35a1db630805a08d950d;hp=79a798808c56660f8bbe223d90b2a2e9e1488d1e;hb=cb185cec287359727e44321979ad2324b4fad7cb;hpb=20de150d680c2a84c4a2e0d5f0f354274c7ff9ab diff --git a/yaffs_guts.c b/yaffs_guts.c index 79a7988..6d9f608 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -177,38 +177,14 @@ void yaffs_release_temp_buffer(struct yaffs_dev *dev, u8 *buffer) if (buffer) { /* assume it is an unmanaged one. */ - yaffs_trace(YAFFS_TRACE_BUFFERS, "Releasing unmanaged temp buffer"); + yaffs_trace(YAFFS_TRACE_BUFFERS, + "Releasing unmanaged temp buffer"); kfree(buffer); dev->unmanaged_buffer_deallocs++; } } -/* - * 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 * @@ -280,7 +256,8 @@ static void yaffs_handle_chunk_wr_error(struct yaffs_dev *dev, int nand_chunk, static inline int yaffs_hash_fn(int n) { - n = abs(n); + if (n < 0) + n = -n; return n % YAFFS_NOBJECT_BUCKETS; } @@ -696,6 +673,11 @@ void yaffs_set_obj_name_from_oh(struct yaffs_obj *obj, #endif } +loff_t yaffs_max_file_size(struct yaffs_dev *dev) +{ + return ((loff_t) YAFFS_MAX_CHUNK_ID) * dev->data_bytes_per_chunk; +} + /*-------------------- TNODES ------------------- * List of spare tnodes @@ -732,7 +714,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; @@ -1919,7 +1901,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; @@ -1953,7 +1935,8 @@ struct yaffs_obj *yaffs_new_obj(struct yaffs_dev *dev, int number, case YAFFS_OBJECT_TYPE_FILE: the_obj->variant.file_variant.file_size = 0; the_obj->variant.file_variant.scanned_size = 0; - the_obj->variant.file_variant.shrink_size = ~0; /* max */ + the_obj->variant.file_variant.shrink_size = + yaffs_max_file_size(dev); the_obj->variant.file_variant.top_level = 0; the_obj->variant.file_variant.top = tn; break; @@ -2381,7 +2364,7 @@ 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; + bi->has_summary = 0; yaffs_clear_chunk_bits(dev, block_no); @@ -2496,7 +2479,7 @@ static inline int yaffs_gc_process_chunk(struct yaffs_dev *dev, /* Update file size */ if (object->variant_type == YAFFS_OBJECT_TYPE_FILE) { - yaffs_oh_size_load( oh, + yaffs_oh_size_load(oh, object->variant.file_variant.file_size); tags.extra_file_size = object->variant.file_variant.file_size; @@ -3339,8 +3322,8 @@ int yaffs_update_oh(struct yaffs_obj *in, const YCHAR *name, int force, break; case YAFFS_OBJECT_TYPE_FILE: if (oh->parent_obj_id != YAFFS_OBJECTID_DELETED && - oh->parent_obj_id != YAFFS_OBJECTID_UNLINKED) - file_size = in->variant.file_variant.file_size; + oh->parent_obj_id != YAFFS_OBJECTID_UNLINKED) + file_size = in->variant.file_variant.file_size; yaffs_oh_size_load(oh, file_size); break; case YAFFS_OBJECT_TYPE_HARDLINK: @@ -3504,7 +3487,7 @@ int yaffs_file_rd(struct yaffs_obj *in, u8 * buffer, loff_t offset, int n_bytes) } int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset, - int n_bytes, int write_trhrough) + int n_bytes, int write_through) { int chunk; @@ -3513,10 +3496,10 @@ int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset, int n = n_bytes; int n_done = 0; int n_writeback; - int start_write = offset; + loff_t start_write = offset; int chunk_written = 0; u32 n_bytes_read; - u32 chunk_start; + loff_t chunk_start; struct yaffs_dev *dev; dev = in->my_dev; @@ -3524,11 +3507,12 @@ int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset, while (n > 0 && chunk_written >= 0) { yaffs_addr_to_chunk(dev, offset, &chunk, &start); - if (chunk * dev->data_bytes_per_chunk + start != offset || + if (((loff_t)chunk) * + dev->data_bytes_per_chunk + start != offset || start >= dev->data_bytes_per_chunk) { yaffs_trace(YAFFS_TRACE_ERROR, - "AddrToChunk of offset %d gives chunk %d start %d", - (int)offset, chunk, start); + "AddrToChunk of offset %lld gives chunk %d start %d", + offset, chunk, start); } chunk++; /* File pos to chunk in file offset */ @@ -3545,7 +3529,8 @@ int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset, * before. */ - chunk_start = ((chunk - 1) * dev->data_bytes_per_chunk); + chunk_start = (((loff_t)(chunk - 1)) * + dev->data_bytes_per_chunk); if (chunk_start > in->variant.file_variant.file_size) n_bytes_read = 0; /* Past end of file */ @@ -3613,7 +3598,7 @@ int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset, cache->locked = 0; cache->n_bytes = n_writeback; - if (write_trhrough) { + if (write_through) { chunk_written = yaffs_wr_data_obj (cache->object, @@ -3673,25 +3658,34 @@ int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset, } int yaffs_wr_file(struct yaffs_obj *in, const u8 *buffer, loff_t offset, - int n_bytes, int write_trhrough) + int n_bytes, int write_through) { yaffs2_handle_hole(in, offset); - return yaffs_do_file_wr(in, buffer, offset, n_bytes, write_trhrough); + return yaffs_do_file_wr(in, buffer, offset, n_bytes, write_through); } /* ---------------------- File resizing stuff ------------------ */ -static void yaffs_prune_chunks(struct yaffs_obj *in, int new_size) +static void yaffs_prune_chunks(struct yaffs_obj *in, loff_t new_size) { struct yaffs_dev *dev = in->my_dev; - int old_size = in->variant.file_variant.file_size; + loff_t old_size = in->variant.file_variant.file_size; int i; int chunk_id; - int last_del = 1 + (old_size - 1) / dev->data_bytes_per_chunk; - int start_del = 1 + (new_size + dev->data_bytes_per_chunk - 1) / - dev->data_bytes_per_chunk; + u32 dummy; + int last_del; + int start_del; + if (old_size > 0) + yaffs_addr_to_chunk(dev, old_size - 1, &last_del, &dummy); + else + last_del = 0; + + yaffs_addr_to_chunk(dev, new_size + dev->data_bytes_per_chunk - 1, + &start_del, &dummy); + last_del++; + start_del++; /* Delete backwards so that we don't end up with holes if * power is lost part-way through the operation. @@ -3841,7 +3835,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 */ @@ -4355,7 +4349,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 (!strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH)) return l; } } @@ -4815,7 +4809,7 @@ 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 && + if (!init_failed && dev->param.is_yaffs2 && !dev->param.disable_summary && !yaffs_summary_init(dev)) init_failed = 1; @@ -5002,8 +4996,8 @@ void yaffs_oh_size_load(struct yaffs_obj_hdr *oh, loff_t fsize) loff_t yaffs_oh_to_size(struct yaffs_obj_hdr *oh) { loff_t retval; - - if(~(oh->file_size_high)) + + if (~(oh->file_size_high)) retval = (((loff_t) oh->file_size_high) << 32) | (((loff_t) oh->file_size_low) & 0xFFFFFFFF); else