-static void yaffs_check_obj_details_loaded(struct yaffs_obj *in)
-{
- u8 *chunk_data;
- struct yaffs_obj_hdr *oh;
- struct yaffs_dev *dev;
- struct yaffs_ext_tags tags;
- int result;
- int alloc_failed = 0;
-
- if (!in)
- return;
-
- dev = in->my_dev;
-
- if (in->lazy_loaded && in->hdr_chunk > 0) {
- in->lazy_loaded = 0;
- chunk_data = yaffs_get_temp_buffer(dev, __LINE__);
-
- result = yaffs_rd_chunk_tags_nand(dev, in->hdr_chunk, chunk_data, &tags);
- oh = (struct yaffs_obj_hdr *) chunk_data;
-
- in->yst_mode = oh->yst_mode;
-#ifdef CONFIG_YAFFS_WINCE
- in->win_atime[0] = oh->win_atime[0];
- in->win_ctime[0] = oh->win_ctime[0];
- in->win_mtime[0] = oh->win_mtime[0];
- in->win_atime[1] = oh->win_atime[1];
- in->win_ctime[1] = oh->win_ctime[1];
- in->win_mtime[1] = oh->win_mtime[1];
-#else
- in->yst_uid = oh->yst_uid;
- in->yst_gid = oh->yst_gid;
- in->yst_atime = oh->yst_atime;
- in->yst_mtime = oh->yst_mtime;
- in->yst_ctime = oh->yst_ctime;
- in->yst_rdev = oh->yst_rdev;
-
-#endif
- yaffs_set_obj_name_from_oh(in, oh);
-
- if (in->variant_type == YAFFS_OBJECT_TYPE_SYMLINK) {
- in->variant.symlink_variant.alias =
- yaffs_clone_str(oh->alias);
- if (!in->variant.symlink_variant.alias)
- alloc_failed = 1; /* Not returned to caller */
- }
-
- yaffs_release_temp_buffer(dev, chunk_data, __LINE__);
- }
-}
-
-/*------------------------------ Directory Functions ----------------------------- */
-
-/*
- *yaffs_update_parent() handles fixing a directories mtime and ctime when a new
- * link (ie. name) is created or deleted in the directory.
- *
- * ie.
- * create dir/a : update dir's mtime/ctime
- * rm dir/a: update dir's mtime/ctime
- * modify dir/a: don't update dir's mtimme/ctime
- *
- * This can be handled immediately or defered. Defering helps reduce the number
- * of updates when many files in a directory are changed within a brief period.
- *
- * If the directory updating is defered then yaffs_update_dirty_dirs must be
- * called periodically.
- */
-
-static void yaffs_update_parent(struct yaffs_obj *obj)
-{
- struct yaffs_dev *dev;
- if(!obj)
- return;
-#ifndef CONFIG_YAFFS_WINCE
-
- dev = obj->my_dev;
- obj->dirty = 1;
- obj->yst_mtime = obj->yst_ctime = Y_CURRENT_TIME;
- if(dev->param.defered_dir_update){
- struct list_head *link = &obj->variant.dir_variant.dirty;
-
- if(list_empty(link)){
- list_add(link,&dev->dirty_dirs);
- T(YAFFS_TRACE_BACKGROUND, (TSTR("Added object %d to dirty directories" TENDSTR),obj->obj_id));
- }
-
- } else
- yaffs_update_oh(obj, NULL, 0, 0, 0, NULL);
-#endif
-}
-
-void yaffs_update_dirty_dirs(struct yaffs_dev *dev)
-{
- struct list_head *link;
- struct yaffs_obj *obj;
- struct yaffs_dir_var *d_s;
- union yaffs_obj_var *o_v;
-
- T(YAFFS_TRACE_BACKGROUND, (TSTR("Update dirty directories" TENDSTR)));
-
- while(!list_empty(&dev->dirty_dirs)){
- link = dev->dirty_dirs.next;
- list_del_init(link);
-
- d_s=list_entry(link,struct yaffs_dir_var,dirty);
- o_v = list_entry(d_s,union yaffs_obj_var,dir_variant);
- obj = list_entry(o_v,struct yaffs_obj,variant);
-
- T(YAFFS_TRACE_BACKGROUND, (TSTR("Update directory %d" TENDSTR), obj->obj_id));
-
- if(obj->dirty)
- yaffs_update_oh(obj, NULL, 0, 0, 0, NULL);
- }
-}
-
-static void yaffs_remove_obj_from_dir(struct yaffs_obj *obj)
-{
- struct yaffs_dev *dev = obj->my_dev;
- struct yaffs_obj *parent;
-
- yaffs_verify_obj_in_dir(obj);
- parent = obj->parent;
-
- yaffs_verify_dir(parent);
-
- if (dev && dev->param.remove_obj_fn)
- dev->param.remove_obj_fn(obj);
-
-
- list_del_init(&obj->siblings);
- obj->parent = NULL;
-
- yaffs_verify_dir(parent);
-}
-
-void yaffs_add_obj_to_dir(struct yaffs_obj *directory,
- struct yaffs_obj *obj)
-{
- if (!directory) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
- ("tragedy: Trying to add an object to a null pointer directory"
- TENDSTR)));
- YBUG();
- return;
- }
- if (directory->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
- ("tragedy: Trying to add an object to a non-directory"
- TENDSTR)));
- YBUG();
- }
-
- if (obj->siblings.prev == NULL) {
- /* Not initialised */
- YBUG();
- }
-
-
- yaffs_verify_dir(directory);
-
- yaffs_remove_obj_from_dir(obj);
-
-
- /* Now add it */
- list_add(&obj->siblings, &directory->variant.dir_variant.children);
- obj->parent = directory;
-
- if (directory == obj->my_dev->unlinked_dir
- || directory == obj->my_dev->del_dir) {
- obj->unlinked = 1;
- obj->my_dev->n_unlinked_files++;
- obj->rename_allowed = 0;
- }
-
- yaffs_verify_dir(directory);
- yaffs_verify_obj_in_dir(obj);
-}