Write object headers with stored file extents
[yaffs2.git] / yaffs_yaffs2.c
index 5761e960e646c816c0628a2c7b64470bb55c04f1..f2f98a4c08770e8d3542de0f24a4f40fa6c51072 100644 (file)
@@ -432,11 +432,12 @@ static int yaffs2_checkpt_obj_to_obj(struct yaffs_obj *obj,
        obj->serial = cp->serial;
        obj->n_data_chunks = cp->n_data_chunks;
 
-       if (obj->variant_type == YAFFS_OBJECT_TYPE_FILE)
+       if (obj->variant_type == YAFFS_OBJECT_TYPE_FILE) {
                obj->variant.file_variant.file_size = cp->size_or_equiv_obj;
-       else if (obj->variant_type == YAFFS_OBJECT_TYPE_HARDLINK)
+               obj->variant.file_variant.stored_size = cp->size_or_equiv_obj;
+       } else if (obj->variant_type == YAFFS_OBJECT_TYPE_HARDLINK) {
                obj->variant.hardlink_variant.equiv_id = cp->size_or_equiv_obj;
-
+       }
        if (obj->hdr_chunk > 0)
                obj->lazy_loaded = 1;
        return 1;
@@ -836,7 +837,7 @@ int yaffs2_handle_hole(struct yaffs_obj *obj, loff_t new_size)
         * of hole marker.
         */
        loff_t old_file_size;
-       int increase;
+       loff_t increase;
        int small_hole;
        int result = YAFFS_OK;
        struct yaffs_dev *dev = NULL;
@@ -873,7 +874,7 @@ int yaffs2_handle_hole(struct yaffs_obj *obj, loff_t new_size)
 
        if (local_buffer) {
                /* fill hole with zero bytes */
-               int pos = old_file_size;
+               loff_t pos = old_file_size;
                int this_write;
                int written;
                memset(local_buffer, 0, dev->data_bytes_per_chunk);
@@ -942,7 +943,7 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
        struct yaffs_obj *in;
        struct yaffs_obj *parent;
        int equiv_id;
-       int file_size;
+       loff_t file_size;
        int is_shrink;
        int is_unlinked;
        struct yaffs_ext_tags tags;
@@ -1034,8 +1035,8 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
                dev->n_free_chunks++;
        } else if (tags.chunk_id > 0) {
                /* chunk_id > 0 so it is a data chunk... */
-               unsigned int endpos;
-               u32 chunk_base = (tags.chunk_id - 1) *
+               loff_t endpos;
+               loff_t chunk_base = (tags.chunk_id - 1) *
                                        dev->data_bytes_per_chunk;
 
                *found_chunks = 1;
@@ -1068,9 +1069,9 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
                        endpos = chunk_base + tags.n_bytes;
 
                        if (!in->valid &&
-                           in->variant.file_variant.scanned_size < endpos) {
+                           in->variant.file_variant.stored_size < endpos) {
                                in->variant.file_variant.
-                                   scanned_size = endpos;
+                                   stored_size = endpos;
                                in->variant.file_variant.
                                    file_size = endpos;
                        }
@@ -1157,9 +1158,9 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
                                 (tags.extra_available &&
                                  tags.extra_obj_type == YAFFS_OBJECT_TYPE_FILE)
                                )) {
-                               u32 this_size = (oh) ?
-                                       oh->file_size :
-                                       tags.extra_length;
+                               loff_t this_size = (oh) ?
+                                       yaffs_oh_to_size(oh) :
+                                       tags.extra_file_size;
                                u32 parent_obj_id = (oh) ?
                                        oh->parent_obj_id :
                                        tags.extra_parent_id;
@@ -1193,12 +1194,14 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
                }
 
                if (!in->valid && in->variant_type !=
-                   (oh ? oh->type : tags.extra_obj_type))
+                   (oh ? oh->type : tags.extra_obj_type)) {
                        yaffs_trace(YAFFS_TRACE_ERROR,
-                               "yaffs tragedy: Bad object type, %d != %d, for object %d at chunk %d during scan",
+                               "yaffs tragedy: Bad type, %d != %d, for object %d at chunk %d during scan",
                                oh ? oh->type : tags.extra_obj_type,
                                in->variant_type, tags.obj_id,
                                chunk);
+                       in = yaffs_retype_obj(in, oh ? oh->type : tags.extra_obj_type);
+               }
 
                if (!in->valid &&
                    (tags.obj_id == YAFFS_OBJECTID_ROOT ||
@@ -1233,7 +1236,7 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
                                parent = yaffs_find_or_create_by_number(dev,
                                                oh->parent_obj_id,
                                                YAFFS_OBJECT_TYPE_DIRECTORY);
-                               file_size = oh->file_size;
+                               file_size = yaffs_oh_to_size(oh);
                                is_shrink = oh->is_shrink;
                                equiv_id = oh->equiv_id;
                        } else {
@@ -1241,7 +1244,7 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
                                parent = yaffs_find_or_create_by_number(dev,
                                                tags.extra_parent_id,
                                                YAFFS_OBJECT_TYPE_DIRECTORY);
-                               file_size = tags.extra_length;
+                               file_size = tags.extra_file_size;
                                is_shrink = tags.extra_is_shrink;
                                equiv_id = tags.extra_equiv_id;
                                in->lazy_loaded = 1;
@@ -1297,7 +1300,7 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
                                break;
                        case YAFFS_OBJECT_TYPE_FILE:
                                file_var = &in->variant.file_variant;
-                               if (file_var->scanned_size < file_size) {
+                               if (file_var->stored_size < file_size) {
                                        /* This covers the case where the file
                                         * size is greater than the data held.
                                         * This will happen if the file is
@@ -1305,7 +1308,7 @@ static inline int yaffs2_scan_chunk(struct yaffs_dev *dev,
                                         * current data extents.
                                         */
                                        file_var->file_size = file_size;
-                                       file_var->scanned_size = file_size;
+                                       file_var->stored_size = file_size;
                                }
 
                                if (file_var->shrink_size > file_size)
@@ -1349,7 +1352,6 @@ int yaffs2_scan_backwards(struct yaffs_dev *dev)
        int n_to_scan = 0;
        enum yaffs_block_state state;
        int c;
-       int deleted;
        LIST_HEAD(hard_list);
        struct yaffs_block_info *bi;
        u32 seq_number;
@@ -1439,7 +1441,7 @@ int yaffs2_scan_backwards(struct yaffs_dev *dev)
                bi++;
        }
 
-       yaffs_trace(YAFFS_TRACE_SCAN, "%d blocks to be sorted...", n_to_scan);
+       yaffs_trace(YAFFS_TRACE_ALWAYS, "%d blocks to be sorted...", n_to_scan);
 
        cond_resched();
 
@@ -1467,13 +1469,12 @@ int yaffs2_scan_backwards(struct yaffs_dev *dev)
                /* get the block to scan in the correct order */
                blk = block_index[block_iter].block;
                bi = yaffs_get_block_info(dev, blk);
-               deleted = 0;
 
                summary_available = yaffs_summary_read(dev, dev->sum_tags, blk);
 
                /* For each chunk in each block that needs scanning.... */
                found_chunks = 0;
-               if(summary_available)
+               if (summary_available)
                        c = dev->chunks_per_summary - 1;
                else
                        c = dev->param.chunks_per_block - 1;