📄 yaffsdev.c
字号:
/* * YAFFS: Yet another FFS. A NAND-flash specific file system. * yaffsdev.c * * Copyright (C) 2002 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning <charles@aleph1.co.uk> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */ #include "yaffsinterface.h"#include "yportenv.h"#if YAFFS_FILEEM #include "yaffs_fileem.h"#else#include "yaffs_nandemul.h" #endif#include "yaffs_guts.h"#include <stdlib.h>#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";void TestTimexxx(yaffs_Device *dev){ yaffs_Object *f; int x; 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"); }void TestTimeasasas(yaffs_Device *dev){ yaffs_Object *f; int x; int i; int b; char data[200]; int written; 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,i,strlen(testStr)); else written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2)); } yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); printf("Flush\n"); yaffs_FlushFile(f,1); yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); yaffs_ReadDataFromFile(f,data,1000,50); data[50] = 0; printf("Read data is \"%s\"\n",data); yaffs_DumpObject(f); printf("Resize to 3000\n"); yaffs_ResizeFile(f,3000); printf("Resize to 2048\n"); yaffs_ResizeFile(f,2048); yaffs_DumpObject(f); yaffs_FlushFile(f,1); }void TestTimeBigDeletes(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"); 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) 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); }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,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); printf("\n\nsymlink alias is \"%s\"\n",alias = yaffs_GetSymlinkAlias(sl)); free(alias); printf("Unlink symlink %d\n",yaffs_Unlink(yaffs_Root(dev),"sym-link")); yaffs_ReadDataFromFile(f,data,1000,50); data[50] = 0; printf("Read data is \"%s\"\n",data); yaffs_DumpObject(f); 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); lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME); 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("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); printf("Make file in directory\n"); df = yaffs_MknodFile(d,"file-in-directory",0,0,0); yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject); // Do some stuff with hardlinks // // NB Deleting hardlinked objects can mess up pointers to hardlinks. // The mechanism is as follows: // * If you unlink a file,softlink or directory that has one or more hardlinks, // then the object is renamed to one of the hardlinks and that hardlink is unlinked. // This means that a pointer to a hardlink so deleted will point to an invalid address. // Thus, make sure that pointers to hardlinks are immediately dereferenced. printf("Hard link tests\n"); f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0); hl1 = yaffs_Link(yaffs_Root(dev),"HardLink 1",f); hl2 = yaffs_Link(yaffs_Root(dev),"HardLink 2",f); hl3 = yaffs_Link(yaffs_Root(dev),"HardLink 3",hl2); printf("\n\nHard links created\n"); yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); yaffs_Unlink(yaffs_Root(dev),"HardLink 1"); printf("\n\nHard link deleted\n"); yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); yaffs_Unlink(yaffs_Root(dev),"Name1"); printf("\n\nHard linked file deleted\n"); yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); yaffs_Unlink(yaffs_Root(dev),"HardLink 2"); printf("\n\nHard link 2 deleted\n"); yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); yaffs_Unlink(yaffs_Root(dev),"HardLink 3"); printf("\n\nHard link 3 deleted\n"); yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); // NB We don't allow unlinking or rename of the root or lost+found // We allow setting attributes, but these must not be written to // NAND since they are not real objects. printf("Attempt to rename lost+found - should have failed\n"); 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[]){ 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(); 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -