*** empty log message ***
[yaffs/.git] / yaffsdev.c
index e38a98330a5f04b2f4139ea86a3a431dd71e8be1..f325b78c1099972b23056c2b2c13429499b268d0 100644 (file)
@@ -14,6 +14,8 @@
  */
  
 #include "yaffsinterface.h"
+#include "yportenv.h"
+
 #if YAFFS_FILEEM       
 #include "yaffs_fileem.h"
 #else
 
 #include <stdio.h>
 #include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 
 
+unsigned yaffs_traceMask = 0xFFFFFFFF;
 
 yaffs_Device device;
 
 
-
-
-
-
-
 char *testStr = "this is a test string";
 
 char *testStr2 = "abcdefghijklmnopqrstuvwxyz1234567890";
@@ -112,7 +111,7 @@ void TestTimeasasas(yaffs_Device *dev)
        
        printf("Flush\n");
        
-       yaffs_FlushFile(f);
+       yaffs_FlushFile(f,1);
 
        yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
        
@@ -123,19 +122,21 @@ void TestTimeasasas(yaffs_Device *dev)
        
        yaffs_DumpObject(f);
 
-       printf("Resize\n");     
-       yaffs_ResizeFile(f,2000);
+       printf("Resize to 3000\n");     
+       yaffs_ResizeFile(f,3000);
+       printf("Resize to 2048\n");     
+       yaffs_ResizeFile(f,2048);
        
        yaffs_DumpObject(f);
 
-       yaffs_FlushFile(f);
+       yaffs_FlushFile(f,1);
        
        
                
 
 }
 
-void TestTime(yaffs_Device *dev)
+void TestTimeBigDeletes(yaffs_Device *dev)
 {
        yaffs_Object *f;
        yaffs_Object *sl;
@@ -155,8 +156,15 @@ void TestTime(yaffs_Device *dev)
        int written;
        
        
+       printf("Exisiting objects\n");
+       yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
+       printf("Exisiting objects in lost+found\n");
+       lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
+       yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
+
        printf("Start\n");
        
+       
 
        f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
        if(f)
@@ -169,11 +177,56 @@ void TestTime(yaffs_Device *dev)
                printf("Created\n");
        }
        
+       for(i = 0; i < 100000; i+=20)
+       { 
        
-       x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
+               b++;
+               if(b & 1)
+                       written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
+               else
+                       written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
+       }
+       
+       yaffs_FlushFile(f,1);
+       yaffs_DeleteFile(f);
+
+       f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
+       if(f)
+       {
+               printf("Found\n");
+       }
+       else
+       {
+               f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
+               printf("Created\n");
+       }
        
        for(i = 0; i < 100000; i+=20)
+       { 
+       
+               b++;
+               if(b & 1)
+                       written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
+               else
+                       written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
+       }
+       
+       yaffs_FlushFile(f,1);
+       yaffs_DeleteFile(f);
+
+       f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
+       if(f)
        {
+               printf("Found\n");
+       }
+       else
+       {
+               f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
+               printf("Created\n");
+       }
+       
+       for(i = 0; i < 100000; i+=20)
+       { 
        
                b++;
                if(b & 1)
@@ -182,15 +235,176 @@ void TestTime(yaffs_Device *dev)
                        written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
        }
        
+       yaffs_FlushFile(f,1);
+       yaffs_DeleteFile(f);
+       
+}
+
+void TestTime(yaffs_Device *dev)
+{
+       yaffs_Object *f;
+       yaffs_Object *sl;
+       yaffs_Object *lnf;
+       
+       yaffs_Object *hl1;
+       yaffs_Object *hl2;
+       yaffs_Object *hl3;
+       yaffs_Object *d, *df;
+       
+       int x;
+       int i;
+       int b;
+       char data[200];
+       
+       char * alias;
+       int written;
+       
+       
+       printf("Exisiting objects\n");
+       yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
+       printf("Exisiting objects in lost+found\n");
+       lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
+       yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
+
+       printf("Start\n");
+       
+       
+       // Test the problem of:
+       // Create file
+       // Delete file
+       // Create file with same name
+       // Delete file <== crash
+
+       f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
+       if(f)
+       {
+               printf("Found\n");
+       }
+       else
+       {
+               f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
+               printf("Created\n");
+       }
+       yaffs_Unlink(yaffs_Root(dev),"Name1");
+
+
+       f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
+       if(f)
+       {
+               printf("Found\n");
+       }
+       else
+       {
+               f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
+               printf("Created\n");
+       }
+       yaffs_Unlink(yaffs_Root(dev),"Name1");
+       
+       
+       
+       // Other tests
+       
+       f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
+       if(f)
+       {
+               printf("Found\n");
+       }
+       else
+       {
+               f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
+               printf("Created\n");
+       }
+       
+       
+       x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
+       
+// Write a file with overwrite, then read it back and save outside yaffs
+// This is to test that write caching works.
+
+       for(i = 0; i < 100; i++)
+       { 
+               unsigned char x[500];
+       
+               memset(x,i,500);
+               
+               written = yaffs_WriteDataToFile(f,x,i*500,500);         
+       }
+
+       for(i = 0; i < 100; i++)
+       { 
+               unsigned char x;
+       
+               x = i+5;
+               
+               written = yaffs_WriteDataToFile(f,&x,i*500 + 2,1);              
+       }
+       
+       
+       {
+               int h;
+               
+               h = open("bork",O_RDWR | O_CREAT | O_TRUNC,0666);
+               for(i = 0; i < 100; i++)
+               { 
+                       unsigned char x[500];
+       
+                       yaffs_ReadDataFromFile(f,x,i*500,500);
+                       write(h,x,500);
+               }
+               close(h);
+               
+               
+       }
+       
+// Big write to fill disk
+
+       written = 1;
+       for(i = 0; i < 1000000 && written > 0; i++)
+       { 
+               unsigned char x[500];
+       
+               memset(x,i,500);
+               
+               written = yaffs_WriteDataToFile(f,x,i*500,500);         
+       }
+       if(written <= 0)
+       {
+               printf("YAFFS full\n");
+       }
+       
+       // some short reads
+       for(i = 1000; i < 50000; i+=2)
+       { 
+               yaffs_ReadDataFromFile(f,data,i,20);
+       }
+       
+               
+       yaffs_ReadDataFromFile(f,data,1000,50); 
+       data[50] = 0;
+       
+       printf("Read data is \"%s\"\n",data);
+
        yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
+       yaffs_ReadDataFromFile(f,data,1000,50);
+       data[50] = 0;
+       
+       printf("Read data is \"%s\"\n",data);
        
        printf("Flush\n");
        
-       yaffs_FlushFile(f);
+       yaffs_FlushFile(f,1);
+       yaffs_ReadDataFromFile(f,data,1000,50);
+       data[50] = 0;
+       
+       printf("Read data is \"%s\"\n",data);
        
        printf("File length is %d\n",yaffs_GetObjectFileLength(f));
        
        sl = yaffs_MknodSymLink(yaffs_Root(dev),"sym-link",0,0,0,"/tmp/alias");
+       yaffs_ReadDataFromFile(f,data,1000,50);
+       data[50] = 0;
+       
+       printf("Read data is \"%s\"\n",data);
 
 
        yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
@@ -209,7 +423,18 @@ void TestTime(yaffs_Device *dev)
        
        yaffs_DumpObject(f);
 
-       printf("Resize\n");     
+       printf("Resize 3000\n");        
+       yaffs_ResizeFile(f,3000);
+
+       printf("Resize 2050\n");        
+       yaffs_ResizeFile(f,2050);
+       printf("Resize 2049\n");        
+       yaffs_ResizeFile(f,2049);
+       printf("Resize 2048\n");        
+       yaffs_ResizeFile(f,2048);
+
+
+       printf("Resize 2000\n");        
        yaffs_ResizeFile(f,2000);
        
        yaffs_DumpObject(f);
@@ -218,19 +443,24 @@ void TestTime(yaffs_Device *dev)
        
        
 
-       yaffs_FlushFile(f);
+       yaffs_FlushFile(f,1);
                
 
        printf("Unlink file: %d\n",yaffs_Unlink(yaffs_Root(dev),"Rename"));
        
+       yaffs_DeleteFile(f);
+       
        yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
        
        // Create a directory and play with it
        
 
-       printf("Create directory and play with it\n");
-               
-       d = yaffs_MknodDirectory(yaffs_Root(dev),"direct",0,0,0);
+       printf("Find or Create directory and play with it\n");
+       d =  yaffs_FindObjectByName(yaffs_Root(dev),"direct");
+       if(!d)
+       {
+               d = yaffs_MknodDirectory(yaffs_Root(dev),"direct",0,0,0);
+       }
        yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
        yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
        
@@ -285,15 +515,179 @@ void TestTime(yaffs_Device *dev)
        x = yaffs_RenameObject(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME,NULL,"Renamed");
        yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
 
+       f = yaffs_MknodFile(yaffs_Root(dev),"pfile",0,0,0);
+       if(f)
+       {
+               yaffs_WriteDataToFile(f,testStr,0,strlen(testStr));
+       }
+
+       yaffs_Link(yaffs_Root(dev),"phl4",f);
+}
+
+void TestTimeDeleteFocussed(yaffs_Device *dev)
+{
+       yaffs_Object *f;
+       yaffs_Object *lnf;
+       
+       
+       int x;
+       int i;
+       int b;
+       int written;
+       
+       
+       printf("Exisiting objects\n");
+       yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
+       printf("Exisiting objects in lost+found\n");
+       lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
+       yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
+
+       printf("Start\n");
+       
+       
+       
+
+       f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
+       if(f)
+       {
+               printf("Found\n");
+       }
+       else
+       {
+               f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
+               printf("Created\n");
+       }
+       
+       
+       x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
+       
+       for(i = 0; i < 100000; i+=20)
+       { 
+       
+               b++;
+               if(b & 1)
+                       written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
+               else
+                       written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
+       }
+       
+       
+
+       yaffs_FlushFile(f,1);
+               
+
+       printf("Unlink file: %d\n",yaffs_Unlink(yaffs_Root(dev),"Rename"));
+       
+       yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
+       
+}
+
+void TestTimeTnodeFocussed(yaffs_Device *dev)
+{
+       yaffs_Object *f;
+       yaffs_Object *lnf;
+       
+       
+       int x;
+       int i;
+       int b;
+       int written;
+       
+       
+       printf("Exisiting objects\n");
+       yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
+       printf("Exisiting objects in lost+found\n");
+       lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
+       yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
+
+       printf("Start\n");
+       
+       
+       
+
+       f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
+       if(f)
+       {
+               printf("Found\n");
+       }
+       else
+       {
+               f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
+               printf("Created\n");
+       }
+       
+       
+       x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
+       
+       for(i = 0; i < 10000; i+=20)
+       {
+       
+               b++;
+               if(b & 1)
+                       written = yaffs_WriteDataToFile(f,testStr,0,strlen(testStr));
+               else
+                       written = yaffs_WriteDataToFile(f,testStr2,0,strlen(testStr2));
+       }
+       
+}
+void TestTimeBackgroundDeleteFocussed(yaffs_Device *dev)
+{
+       yaffs_Object *f;
+       yaffs_Object *lnf;
+       
+       
+       int x;
+       int i,j;
+       int b;
+       int written;
+       
+       
+       printf("Exisiting objects\n");
+       yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
+       printf("Exisiting objects in lost+found\n");
+       lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
+       yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
+
+       printf("Start\n");
+       
+       
+       for(j = 0; j < 20; j++)
+       {
+               printf("Run %d\n",j);
+
+               f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
+               if(f)
+               {
+                       printf("Found\n");
+               }
+               else
+               {
+                       f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
+                       printf("Created\n");
+               }
+       
+               printf("@@@@@@@ Run %d, object %d\n",j,f->objectId);
+       
+               for(i = 0; i < 1000000; i+=20)
+               {
+       
+                       written = yaffs_WriteDataToFile(f,testStr,i,100);
+               }
+               
+               yaffs_FlushFile(f,1);
+               
+               yaffs_DeleteFile(f);
+       }
+       
 }
 
 int main(int argc,char *argv[])
 {
-       device.nBlocks = (2 * 1024 * 1024) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
-       device.startBlock = 1;  // Don't use block 0
-       device.endBlock = device.nBlocks - 1;
 
+       int nBlocks;
+       
 #if YAFFS_FILEEM       
+       nBlocks =(2 * 1024 * 1024) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK) ;
        device.writeChunkToNAND = yaffs_FEWriteChunkToNAND;
        device.readChunkFromNAND = yaffs_FEReadChunkFromNAND;
        device.eraseBlockInNAND = yaffs_FEEraseBlockInNAND;
@@ -301,6 +695,7 @@ int main(int argc,char *argv[])
 
        printf("Testing on file emulation\n");
 #else
+       nBlocks = (2 * 1024 * 1024) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
        device.writeChunkToNAND = nandemul_WriteChunkToNAND;
        device.readChunkFromNAND = nandemul_ReadChunkFromNAND;
        device.eraseBlockInNAND = nandemul_EraseBlockInNAND;
@@ -309,11 +704,28 @@ int main(int argc,char *argv[])
        printf("Testing on RAM emulation\n");
 #endif
 
+#ifdef YAFFS_START
+       device.startBlock = YAFFS_START;  // Don't use block 0
+       device.endBlock = YAFFS_END;
+#else
+       device.startBlock = 1;  // Don't use block 0
+       device.endBlock = nBlocks;
+#endif
+
+       device.nShortOpCaches = 10;
+
+
        yaffs_GutsInitialise(&device);
        
        // yaffs_GutsTest();
        
-       TestTime(&device);
+       TestTimeBackgroundDeleteFocussed(&device);
+       
+       printf("Cache hits %d\n",device.cacheHits);
+       printf("Retired blocks %d\n",device.nRetiredBlocks);
+       
+       printf("Deletions %d\n",device.nDeletions);
+       printf("Unmarked deletions %d\n",device.nUnmarkedDeletions);
        
        exit(0);
 }