X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs%2F.git;a=blobdiff_plain;f=yaffsdev.c;h=f325b78c1099972b23056c2b2c13429499b268d0;hp=64368f449852501b44ca423e0312e1fb50eb367e;hb=3b2905b66368db2b05df750b5abf4b41c6efcfbd;hpb=cefeada5db633fd3c37cde66e2e62c73052c18bd diff --git a/yaffsdev.c b/yaffsdev.c index 64368f4..f325b78 100644 --- a/yaffsdev.c +++ b/yaffsdev.c @@ -14,25 +14,29 @@ */ #include "yaffsinterface.h" +#include "yportenv.h" + +#if YAFFS_FILEEM +#include "yaffs_fileem.h" +#else #include "yaffs_nandemul.h" +#endif + #include "yaffs_guts.h" #include #include #include +#include +#include - +unsigned yaffs_traceMask = 0xFFFFFFFF; yaffs_Device device; - - - - - char *testStr = "this is a test string"; char *testStr2 = "abcdefghijklmnopqrstuvwxyz1234567890"; @@ -107,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); @@ -118,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; @@ -150,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) @@ -164,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) @@ -177,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); @@ -204,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); @@ -213,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); @@ -280,24 +515,217 @@ 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; + device.initialiseNAND = yaffs_FEInitialiseNAND; + + 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; device.initialiseNAND = nandemul_InitialiseNAND; + 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); }