yaffs: By default route all writes into the yaffs cache
[yaffs2.git] / yaffs_guts.c
index ae37c3fe1c140a844360d7bcd10496fab676ed6b..79568eeeae39eb20d171226afc015cedbda75e5d 100644 (file)
@@ -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
  *
@@ -218,18 +194,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,
@@ -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;
 }
 
@@ -698,7 +675,10 @@ void yaffs_set_obj_name_from_oh(struct yaffs_obj *obj,
 
 loff_t yaffs_max_file_size(struct yaffs_dev *dev)
 {
-       return ((loff_t) YAFFS_MAX_CHUNK_ID) * dev->data_bytes_per_chunk;
+       if(sizeof(loff_t) < 8)
+               return YAFFS_MAX_FILE_SIZE_32;
+       else
+               return ((loff_t) YAFFS_MAX_CHUNK_ID) * dev->data_bytes_per_chunk;
 }
 
 /*-------------------- TNODES -------------------
@@ -737,7 +717,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;
@@ -814,7 +794,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)
@@ -1924,7 +1904,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;
@@ -2387,7 +2367,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);
 
@@ -2502,7 +2482,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;
@@ -3221,7 +3201,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);
@@ -3345,8 +3325,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:
@@ -3530,7 +3510,8 @@ 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 (((loff_t)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 %lld gives chunk %d start %d",
@@ -3551,7 +3532,8 @@ int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
                         * before.
                         */
 
-                       chunk_start = (((loff_t)(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 */
@@ -3577,9 +3559,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) {
@@ -3687,17 +3671,26 @@ int yaffs_wr_file(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
 
 /* ---------------------- 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.
@@ -3847,7 +3840,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 */
@@ -4361,7 +4354,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;
                }
        }
@@ -4821,7 +4814,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;
@@ -4995,8 +4988,8 @@ int yaffs_get_n_free_chunks(struct yaffs_dev *dev)
        return n_free;
 }
 
-/*\
- * Marshalling functions to get loff_t file sizes into aand out of
+/*
+ * Marshalling functions to get loff_t file sizes into and out of
  * object headers.
  */
 void yaffs_oh_size_load(struct yaffs_obj_hdr *oh, loff_t fsize)
@@ -5009,7 +5002,7 @@ loff_t yaffs_oh_to_size(struct yaffs_obj_hdr *oh)
 {
        loff_t retval;
 
-       if(~(oh->file_size_high))
+       if (sizeof(loff_t) >= 8 && ~(oh->file_size_high))
                retval = (((loff_t) oh->file_size_high) << 32) |
                        (((loff_t) oh->file_size_low) & 0xFFFFFFFF);
        else