changeset 366:2a0c6f4e34ec

Clean up yaffs_FindNiceObject to be thread safe and simpler. Fix code that does a dummy tree insert during write
author charles <charles>
date Tue, 02 Mar 2010 02:29:21 +0000
parents db12031081bc
children 7fb8c1aa623a
files direct/dtest.c yaffs_guts.c yaffs_guts.h
diffstat 3 files changed, 15 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/direct/dtest.c
+++ b/direct/dtest.c
@@ -2479,7 +2479,7 @@ int main(int argc, char *argv[])
 
 	//rename_over_test("//////////////////flash///////////////////yaffs1///////////");
 	
-	//fill_empty_files_test("/yaffs2/");
+	fill_empty_files_test("/yaffs2/");
 	//long_name_test("/yaffs2");
 	//link_test0("/yaffs2");
 	//link_test1("yaffs2");
--- a/yaffs_guts.c
+++ b/yaffs_guts.c
@@ -12,7 +12,7 @@
  */
 
 const char *yaffs_guts_c_version =
-    "$Id: yaffs_guts.c,v 1.110 2010-02-25 22:41:46 charles Exp $";
+    "$Id: yaffs_guts.c,v 1.111 2010-03-02 02:29:21 charles Exp $";
 
 #include "yportenv.h"
 #include "yaffs_trace.h"
@@ -2129,33 +2129,21 @@ static void yaffs_InitialiseObjects(yaff
 
 static int yaffs_FindNiceObjectBucket(yaffs_Device *dev)
 {
-	static int x;
 	int i;
 	int l = 999;
 	int lowest = 999999;
 
-	/* First let's see if we can find one that's empty. */
-
-	for (i = 0; i < 10 && lowest > 0; i++) {
-		x++;
-		x %= YAFFS_NOBJECT_BUCKETS;
-		if (dev->objectBucket[x].count < lowest) {
-			lowest = dev->objectBucket[x].count;
-			l = x;
-		}
-
-	}
-
-	/* If we didn't find an empty list, then try
-	 * looking a bit further for a short one
+
+	/* Search for the shortest list or one that
+	 * isn't too long.
 	 */
 
-	for (i = 0; i < 10 && lowest > 3; i++) {
-		x++;
-		x %= YAFFS_NOBJECT_BUCKETS;
-		if (dev->objectBucket[x].count < lowest) {
-			lowest = dev->objectBucket[x].count;
-			l = x;
+	for (i = 0; i < 10 && lowest > 4; i++) {
+		dev->bucketFinder++;
+		dev->bucketFinder %= YAFFS_NOBJECT_BUCKETS;
+		if (dev->objectBucket[dev->bucketFinder].count < lowest) {
+			lowest = dev->objectBucket[dev->bucketFinder].count;
+			l = dev->bucketFinder;
 		}
 
 	}
@@ -3818,9 +3806,9 @@ static int yaffs_WriteChunkDataToObject(
 	 * the tnode now, rather than later when it is harder to clean up.
 	 */
 	prevChunkId = yaffs_FindChunkInFile(in, chunkInInode, &prevTags);
-	if(prevChunkId <= 0 &&
-		!yaffs_PutChunkIntoFile(in, chunkInInode, 0, 0)){
-	}
+	if(prevChunkId < 1 &&
+		!yaffs_PutChunkIntoFile(in, chunkInInode, 0, 0))
+		return 0;
 
 	/* Set up new tags */
 	yaffs_InitialiseTags(&newTags);
@@ -3837,13 +3825,6 @@ static int yaffs_WriteChunkDataToObject(
 		YBUG();
 	}
 	
-	/*
-	 * If there isn't already a chunk there then do a dummy
-	 * insert to make sue we have the desired tnode structure.
-	 */
-	if(prevChunkId < 1 &&
-		yaffs_PutChunkIntoFile(in, chunkInInode, 0, 0) != YAFFS_OK)
-		return -1;
 		
 	newChunkId =
 	    yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags,
--- a/yaffs_guts.h
+++ b/yaffs_guts.h
@@ -700,6 +700,7 @@ struct yaffs_DeviceStruct {
 	yaffs_ObjectList *allocatedObjectList;
 
 	yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS];
+	__u32 bucketFinder;
 
 	int nFreeChunks;