changeset 85:eeca349affa6

Add support for faster yaffs direct look-ups. Fix rename over problem
author charles
date Tue, 20 Sep 2005 06:08:50 +0100
parents 9af8bbd3c1da
children 9c9fd9831cf1
files yaffs_guts.c
diffstat 1 files changed, 26 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/yaffs_guts.c
+++ b/yaffs_guts.c
@@ -57,6 +57,8 @@ static void yaffs_HandleUpdateChunk(yaff
 				    const yaffs_ExtendedTags * tags);
 
 /* Other local prototypes */
+static int yaffs_UnlinkObject( yaffs_Object *obj);
+
 static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device * dev,
 					     const __u8 * buffer,
 					     yaffs_ExtendedTags * tags,
@@ -1729,10 +1731,10 @@ int yaffs_RenameObject(yaffs_Object * ol
 			 */
 			yaffs_ChangeObjectName(obj, newDir, newName, force,
 					       existingTarget->objectId);
-			yaffs_Unlink(newDir, newName);
+			yaffs_UnlinkObject(existingTarget);
 		}
 
-		return yaffs_ChangeObjectName(obj, newDir, newName, force, 0);
+		return yaffs_ChangeObjectName(obj, newDir, newName, 1, 0);
 	}
 	return YAFFS_FAIL;
 }
@@ -3771,11 +3773,9 @@ static int yaffs_UnlinkWorker(yaffs_Obje
 	}
 }
 
-int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name)
+
+static int yaffs_UnlinkObject( yaffs_Object *obj)
 {
-	yaffs_Object *obj;
-
-	obj = yaffs_FindObjectByName(dir, name);
 
 	if (obj && obj->unlinkAllowed) {
 		return yaffs_UnlinkWorker(obj);
@@ -3784,6 +3784,13 @@ int yaffs_Unlink(yaffs_Object * dir, con
 	return YAFFS_FAIL;
 
 }
+int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name)
+{
+	yaffs_Object *obj;
+
+	obj = yaffs_FindObjectByName(dir, name);
+	return yaffs_UnlinkObject(obj);
+}
 
 /*----------------------- Initialisation Scanning ---------------------- */
 
@@ -4910,6 +4917,18 @@ static int yaffs_ScanBackwards(yaffs_Dev
 
 /*------------------------------  Directory Functions ----------------------------- */
 
+static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj)
+{
+	yaffs_Device *dev = obj->myDev;
+	
+	if(dev && dev->removeObjectCallback)
+		dev->removeObjectCallback(obj);
+	   
+	list_del_init(&obj->siblings);
+	obj->parent = NULL;
+}
+
+
 static void yaffs_AddObjectToDirectory(yaffs_Object * directory,
 				       yaffs_Object * obj)
 {
@@ -4935,7 +4954,7 @@ static void yaffs_AddObjectToDirectory(y
 
 	} else if (!list_empty(&obj->siblings)) {
 		/* If it is holed up somewhere else, un hook it */
-		list_del_init(&obj->siblings);
+		yaffs_RemoveObjectFromDirectory(obj);
 	}
 	/* Now add it */
 	list_add(&obj->siblings, &directory->variant.directoryVariant.children);
@@ -4949,12 +4968,6 @@ static void yaffs_AddObjectToDirectory(y
 	}
 }
 
-static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj)
-{
-	list_del_init(&obj->siblings);
-	obj->parent = NULL;
-}
-
 yaffs_Object *yaffs_FindObjectByName(yaffs_Object * directory,
 				     const YCHAR * name)
 {