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"
20 #include "yaffs_fileem.h"
22 #include "yaffs_nandemul.h"
25 #include "yaffs_guts.h"
35 char *testStr = "this is a test string";
37 char *testStr2 = "abcdefghijklmnopqrstuvwxyz1234567890";
39 void TestTimexxx(yaffs_Device *dev)
48 f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
55 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
60 x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
65 void TestTimeasasas(yaffs_Device *dev)
78 f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
85 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
90 x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
94 for(i = 0; i < 10000; i+=20)
99 written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
101 written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
105 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
111 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
113 yaffs_ReadDataFromFile(f,data,1000,50);
116 printf("Read data is \"%s\"\n",data);
120 printf("Resize to 3000\n");
121 yaffs_ResizeFile(f,3000);
122 printf("Resize to 2048\n");
123 yaffs_ResizeFile(f,2048);
134 void TestTime(yaffs_Device *dev)
143 yaffs_Object *d, *df;
154 printf("Exisiting objects\n");
155 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
156 printf("Exisiting objects in lost+found\n");
157 lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
158 yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
165 f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
172 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
177 x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
179 for(i = 0; i < 100000; i+=20)
184 written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
186 written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
189 yaffs_ReadDataFromFile(f,data,1000,50);
192 printf("Read data is \"%s\"\n",data);
194 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
195 yaffs_ReadDataFromFile(f,data,1000,50);
198 printf("Read data is \"%s\"\n",data);
203 yaffs_ReadDataFromFile(f,data,1000,50);
206 printf("Read data is \"%s\"\n",data);
208 printf("File length is %d\n",yaffs_GetObjectFileLength(f));
210 sl = yaffs_MknodSymLink(yaffs_Root(dev),"sym-link",0,0,0,"/tmp/alias");
211 yaffs_ReadDataFromFile(f,data,1000,50);
214 printf("Read data is \"%s\"\n",data);
217 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
219 printf("\n\nsymlink alias is \"%s\"\n",alias = yaffs_GetSymlinkAlias(sl));
223 printf("Unlink symlink %d\n",yaffs_Unlink(yaffs_Root(dev),"sym-link"));
226 yaffs_ReadDataFromFile(f,data,1000,50);
229 printf("Read data is \"%s\"\n",data);
233 printf("Resize 3000\n");
234 yaffs_ResizeFile(f,3000);
236 printf("Resize 2050\n");
237 yaffs_ResizeFile(f,2050);
238 printf("Resize 2049\n");
239 yaffs_ResizeFile(f,2049);
240 printf("Resize 2048\n");
241 yaffs_ResizeFile(f,2048);
244 printf("Resize 2000\n");
245 yaffs_ResizeFile(f,2000);
249 lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
256 printf("Unlink file: %d\n",yaffs_Unlink(yaffs_Root(dev),"Rename"));
258 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
260 // Create a directory and play with it
263 printf("Create directory and play with it\n");
265 d = yaffs_MknodDirectory(yaffs_Root(dev),"direct",0,0,0);
266 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
267 yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
269 printf("Make file in directory\n");
271 df = yaffs_MknodFile(d,"file-in-directory",0,0,0);
272 yaffs_ApplyToDirectoryChildren(d,yaffs_DumpObject);
275 // Do some stuff with hardlinks
277 // NB Deleting hardlinked objects can mess up pointers to hardlinks.
278 // The mechanism is as follows:
279 // * If you unlink a file,softlink or directory that has one or more hardlinks,
280 // then the object is renamed to one of the hardlinks and that hardlink is unlinked.
281 // This means that a pointer to a hardlink so deleted will point to an invalid address.
282 // Thus, make sure that pointers to hardlinks are immediately dereferenced.
285 printf("Hard link tests\n");
287 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
288 hl1 = yaffs_Link(yaffs_Root(dev),"HardLink 1",f);
289 hl2 = yaffs_Link(yaffs_Root(dev),"HardLink 2",f);
290 hl3 = yaffs_Link(yaffs_Root(dev),"HardLink 3",hl2);
292 printf("\n\nHard links created\n");
293 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
295 yaffs_Unlink(yaffs_Root(dev),"HardLink 1");
296 printf("\n\nHard link deleted\n");
297 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
299 yaffs_Unlink(yaffs_Root(dev),"Name1");
300 printf("\n\nHard linked file deleted\n");
301 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
303 yaffs_Unlink(yaffs_Root(dev),"HardLink 2");
304 printf("\n\nHard link 2 deleted\n");
305 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
307 yaffs_Unlink(yaffs_Root(dev),"HardLink 3");
309 printf("\n\nHard link 3 deleted\n");
310 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
312 // NB We don't allow unlinking or rename of the root or lost+found
313 // We allow setting attributes, but these must not be written to
314 // NAND since they are not real objects.
316 printf("Attempt to rename lost+found - should have failed\n");
317 x = yaffs_RenameObject(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME,NULL,"Renamed");
318 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
320 f = yaffs_MknodFile(yaffs_Root(dev),"pfile",0,0,0);
321 yaffs_WriteDataToFile(f,testStr,0,strlen(testStr));
323 yaffs_Link(yaffs_Root(dev),"phl4",f);
326 void TestTimeDeleteFocussed(yaffs_Device *dev)
338 printf("Exisiting objects\n");
339 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
340 printf("Exisiting objects in lost+found\n");
341 lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
342 yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
349 f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
356 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
361 x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
363 for(i = 0; i < 100000; i+=20)
368 written = yaffs_WriteDataToFile(f,testStr,i,strlen(testStr));
370 written = yaffs_WriteDataToFile(f,testStr2,i,strlen(testStr2));
378 printf("Unlink file: %d\n",yaffs_Unlink(yaffs_Root(dev),"Rename"));
380 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
384 void TestTimeTnodeFocussed(yaffs_Device *dev)
396 printf("Exisiting objects\n");
397 yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject);
398 printf("Exisiting objects in lost+found\n");
399 lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME);
400 yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject);
407 f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1");
414 f = yaffs_MknodFile(yaffs_Root(dev),"Name1",0,0,0);
419 x = yaffs_RenameObject(yaffs_Root(dev),"Name1",NULL,"Rename");
421 for(i = 0; i < 10000; i+=20)
426 written = yaffs_WriteDataToFile(f,testStr,0,strlen(testStr));
428 written = yaffs_WriteDataToFile(f,testStr2,0,strlen(testStr2));
433 int main(int argc,char *argv[])
437 device.nBlocks = (64 * 1024 * 1024) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
438 device.writeChunkToNAND = yaffs_FEWriteChunkToNAND;
439 device.readChunkFromNAND = yaffs_FEReadChunkFromNAND;
440 device.eraseBlockInNAND = yaffs_FEEraseBlockInNAND;
441 device.initialiseNAND = yaffs_FEInitialiseNAND;
443 printf("Testing on file emulation\n");
445 device.nBlocks = (2 * 1024 * 1024) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
446 device.writeChunkToNAND = nandemul_WriteChunkToNAND;
447 device.readChunkFromNAND = nandemul_ReadChunkFromNAND;
448 device.eraseBlockInNAND = nandemul_EraseBlockInNAND;
449 device.initialiseNAND = nandemul_InitialiseNAND;
451 printf("Testing on RAM emulation\n");
454 device.startBlock = 1; // Don't use block 0
455 device.endBlock = device.nBlocks - 1;
457 yaffs_GutsInitialise(&device);