Merge branch 'driver-refactoring' into new-driver-refactoring
[yaffs2.git] / yaffs_guts.c
index ce5f2387ab0aad483d8c403c15e69dcc7be663b3..9f6b40964b5e85d154294fef73af38b544634cd8 100644 (file)
@@ -41,7 +41,8 @@
 static int yaffs_wr_data_obj(struct yaffs_obj *in, int inode_chunk,
                             const u8 *buffer, int n_bytes, int use_reserve);
 
-
+static void yaffs_fix_null_name(struct yaffs_obj *obj, YCHAR *name,
+                               int buffer_size);
 
 /* Function to calculate chunk and offset */
 
@@ -609,7 +610,7 @@ 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->th.write_chunk_tags_fn(dev, chunk_id -
+                       if (dev->tagger.write_chunk_tags_fn(dev, chunk_id -
                                                        dev->chunk_offset,
                                                        buffer,
                                                        &tags) != YAFFS_OK)
@@ -648,15 +649,21 @@ static u16 yaffs_calc_name_sum(const YCHAR *name)
        return sum;
 }
 
+
 void yaffs_set_obj_name(struct yaffs_obj *obj, const YCHAR * name)
 {
        memset(obj->short_name, 0, sizeof(obj->short_name));
-       if (name &&
+
+       if (name && !name[0]) {
+               yaffs_fix_null_name(obj, obj->short_name,
+                               YAFFS_SHORT_NAME_LENGTH);
+               name = obj->short_name;
+       } else if (name &&
                strnlen(name, YAFFS_SHORT_NAME_LENGTH + 1) <=
-               YAFFS_SHORT_NAME_LENGTH)
+               YAFFS_SHORT_NAME_LENGTH)  {
                strcpy(obj->short_name, name);
-       else
-               obj->short_name[0] = _Y('\0');
+       }
+
        obj->sum = yaffs_calc_name_sum(name);
 }
 
@@ -4536,7 +4543,7 @@ YCHAR *yaffs_get_symlink_alias(struct yaffs_obj *obj)
 static int yaffs_check_dev_fns(struct yaffs_dev *dev)
 {
        struct yaffs_driver *drv = &dev->drv;
-       struct yaffs_tags_handler *th = &dev->th;
+       struct yaffs_tags_handler *tagger = &dev->tagger;
 
        /* Common functions, gotta have */
        if (!drv->drv_read_chunk_fn ||
@@ -4553,10 +4560,10 @@ static int yaffs_check_dev_fns(struct yaffs_dev *dev)
        yaffs_tags_marshall_install(dev);
 
        /* 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)
+       if (!tagger->write_chunk_tags_fn ||
+           !tagger->read_chunk_tags_fn ||
+           !tagger->query_block_fn ||
+           !tagger->mark_bad_fn)
                return 0;
 
        return 1;
@@ -4992,6 +4999,42 @@ int yaffs_get_n_free_chunks(struct yaffs_dev *dev)
        return n_free;
 }
 
+
+int yaffs_format_dev(struct yaffs_dev *dev)
+{
+       int i;
+       enum yaffs_block_state state;
+       u32 dummy;
+
+       if(dev->is_mounted)
+               return YAFFS_FAIL;
+
+       /*
+       * The runtime variables might not have been set up,
+       * so set up what we need.
+       */
+       dev->internal_start_block = dev->param.start_block;
+       dev->internal_end_block = dev->param.end_block;
+       dev->block_offset = 0;
+       dev->chunk_offset = 0;
+
+       if (dev->param.start_block == 0) {
+               dev->internal_start_block = dev->param.start_block + 1;
+               dev->internal_end_block = dev->param.end_block + 1;
+               dev->block_offset = 1;
+               dev->chunk_offset = dev->param.chunks_per_block;
+       }
+
+       for (i = dev->internal_start_block; i <= dev->internal_end_block; i++) {
+               yaffs_query_init_block_state(dev, i, &state, &dummy);
+               if (state != YAFFS_BLOCK_STATE_DEAD)
+                       yaffs_erase_block(dev, i);
+       }
+
+       return YAFFS_OK;
+}
+
+
 /*
  * Marshalling functions to get loff_t file sizes into and out of
  * object headers.