⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yaffsdev.c

📁 一个 yaffs2 日志文件系统 支持NAND FLASH等
💻 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 + -