2 * YAFFS: Yet another FFS. A NAND-flash specific file system.
5 * Copyright (C) 2002 Aleph One Ltd.
6 * for Toby Churchill Ltd and Brightstar Engineering
8 * Created by Charles Manning <charles@aleph1.co.uk>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
16 #include "yaffsinterface.h"
18 #include "yaffs_fileem.h"
20 #include "yaffs_nandemul.h"
23 #include "yaffs_guts.h"
41 char *testStr = "this is a test string";
43 char *testStr2 = "abcdefghijklmnopqrstuvwxyz1234567890";
45 void TestTimexxx(yaffs_Device *dev)
54 f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
61 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
66 x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
71 void TestTimeasasas(yaffs_Device *dev)
84 f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
91 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
96 x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
100 for(i = 0; i < 10000; i+=20)
105 written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
107 written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
111 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
117 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
119 yaffs_ReadDataFromFile(f,data,1000,50);
122 printf("Read data is \"%s\"\n",data);
127 yaffs_ResizeFile(f,2000);
138 void TestTime(yaffs_Device *dev)
147 yaffs_Object *d, *df;
158 printf("Exisiting objects\n");
159 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
160 printf("Exisiting objects in lost+found\n");
161 lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
162 yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
169 f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
176 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
181 x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
183 for(i = 0; i < 100000; i+=20)
188 written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
190 written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
193 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
199 printf("File length is %d\n",yaffs_GetObjectFileLength(f));
201 sl = yaffs_MknodSymLink(yaffs_Root(dev),"sym-link",0,0,0,"/tmp/alias");
204 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
206 printf("\n\nsymlink alias is \"%s\"\n",alias = yaffs_GetSymlinkAlias(sl));
210 printf("Unlink symlink %d\n",yaffs_Unlink(yaffs_Root(dev),"sym-link"));
213 yaffs_ReadDataFromFile(f,data,1000,50);
216 printf("Read data is \"%s\"\n",data);
221 yaffs_ResizeFile(f,2000);
225 lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
232 printf("Unlink file: %d\n",yaffs_Unlink(yaffs_Root(dev),"Rename"));
234 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
236 // Create a directory and play with it
239 printf("Create directory and play with it\n");
241 d = yaffs_MknodDirectory(yaffs_Root(dev),"direct",0,0,0);
242 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
243 yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
245 printf("Make file in directory\n");
247 df = yaffs_MknodFile(d,"file-in-directory",0,0,0);
248 yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
251 // Do some stuff with hardlinks
253 // NB Deleting hardlinked objects can mess up pointers to hardlinks.
254 // The mechanism is as follows:
255 // * If you unlink a file,softlink or directory that has one or more hardlinks,
256 // then the object is renamed to one of the hardlinks and that hardlink is unlinked.
257 // This means that a pointer to a hardlink so deleted will point to an invalid address.
258 // Thus, make sure that pointers to hardlinks are immediately dereferenced.
261 printf("Hard link tests\n");
263 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
264 hl1 = yaffs_Link(yaffs_Root(dev),"HardLink 1",f);
265 hl2 = yaffs_Link(yaffs_Root(dev),"HardLink 2",f);
266 hl3 = yaffs_Link(yaffs_Root(dev),"HardLink 3",hl2);
268 printf("\n\nHard links created\n");
269 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
271 yaffs_Unlink(yaffs_Root(dev),"HardLink 1");
272 printf("\n\nHard link deleted\n");
273 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
275 yaffs_Unlink(yaffs_Root(dev),"Name1");
276 printf("\n\nHard linked file deleted\n");
277 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
279 yaffs_Unlink(yaffs_Root(dev),"HardLink 2");
280 printf("\n\nHard link 2 deleted\n");
281 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
283 yaffs_Unlink(yaffs_Root(dev),"HardLink 3");
285 printf("\n\nHard link 3 deleted\n");
286 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
288 // NB We don't allow unlinking or rename of the root or lost+found
289 // We allow setting attributes, but these must not be written to
290 // NAND since they are not real objects.
292 printf("Attempt to rename lost+found - should have failed\n");
293 x = yaffs_RenameObject(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME,NULL,"Renamed");
294 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
296 f = yaffs_MknodFile(yaffs_Root(dev),"pfile",0,0,0);
297 yaffs_WriteDataToFile(f,testStr,0,strlen(testStr));
299 yaffs_Link(yaffs_Root(dev),"phl4",f);
302 int main(int argc,char *argv[])
304 device.nBlocks = (2 * 1024 * 1024) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
305 device.startBlock = 1; // Don't use block 0
306 device.endBlock = device.nBlocks - 1;
309 device.writeChunkToNAND = yaffs_FEWriteChunkToNAND;
310 device.readChunkFromNAND = yaffs_FEReadChunkFromNAND;
311 device.eraseBlockInNAND = yaffs_FEEraseBlockInNAND;
312 device.initialiseNAND = yaffs_FEInitialiseNAND;
314 printf("Testing on file emulation\n");
316 device.writeChunkToNAND = nandemul_WriteChunkToNAND;
317 device.readChunkFromNAND = nandemul_ReadChunkFromNAND;
318 device.eraseBlockInNAND = nandemul_EraseBlockInNAND;
319 device.initialiseNAND = nandemul_InitialiseNAND;
321 printf("Testing on RAM emulation\n");
324 yaffs_GutsInitialise(&device);