X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Fbasic-test%2Fdtest.c;h=e57691903d369e416652e22db5a94ae122e32beb;hp=c56e5b2a76063c5e7cd88062ed90956ad6a54685;hb=2369fadda0bee21c2ddb7a7596be7a5df578757e;hpb=9b9fd2ac90990fed4990feec36ab1ec55fc78926 diff --git a/direct/basic-test/dtest.c b/direct/basic-test/dtest.c index c56e5b2..e576919 100644 --- a/direct/basic-test/dtest.c +++ b/direct/basic-test/dtest.c @@ -1,7 +1,7 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. + * YAFFS: Yet another FFS. A NAND-flash specific file system. * - * Copyright (C) 2002-2010 Aleph One Ltd. + * Copyright (C) 2002-2011 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning @@ -25,7 +25,7 @@ #include "yaffs_guts.h" /* Only for dumping device innards */ -extern int yaffs_traceMask; +extern int yaffs_trace_mask; void dumpDir(const char *dname); @@ -36,7 +36,7 @@ void copy_in_a_file(const char *yaffsName,const char *inName) int ni,no; inh = open(inName,O_RDONLY); outh = yaffs_open(yaffsName, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + while((ni = read(inh,buffer,100)) > 0) { no = yaffs_write(outh,buffer,ni); @@ -44,9 +44,9 @@ void copy_in_a_file(const char *yaffsName,const char *inName) { printf("problem writing yaffs file\n"); } - + } - + yaffs_close(outh); close(inh); } @@ -58,19 +58,19 @@ void make_a_file(const char *yaffsName,char bval,int sizeOfFile) unsigned char buffer[100]; outh = yaffs_open(yaffsName, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + memset(buffer,bval,100); - + do{ i = sizeOfFile; if(i > 100) i = 100; sizeOfFile -= i; - + yaffs_write(outh,buffer,i); - + } while (sizeOfFile > 0); - - + + yaffs_close(outh); } @@ -83,7 +83,7 @@ void make_pattern_file(char *fn,int size) outh = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); yaffs_lseek(outh,size-1,SEEK_SET); yaffs_write(outh,"A",1); - + for(i = 0; i < size; i+=256) { marker = ~i; @@ -91,7 +91,7 @@ void make_pattern_file(char *fn,int size) yaffs_write(outh,&marker,sizeof(marker)); } yaffs_close(outh); - + } int check_pattern_file(char *fn) @@ -101,10 +101,10 @@ int check_pattern_file(char *fn) int i; int size; int ok = 1; - + h = yaffs_open(fn, O_RDWR,0); size = yaffs_lseek(h,0,SEEK_END); - + for(i = 0; i < size; i+=256) { yaffs_lseek(h,i,SEEK_SET); @@ -130,16 +130,16 @@ int dump_file_data(char *fn) int i = 0; int ok = 1; unsigned char b; - + h = yaffs_open(fn, O_RDWR,0); - + printf("%s\n",fn); while(yaffs_read(h,&b,1)> 0) { printf("%02x",b); i++; - if(i > 32) + if(i > 32) { printf("\n"); i = 0;; @@ -157,7 +157,7 @@ void dump_file(const char *fn) int i; int size; int h; - + h = yaffs_open(fn,O_RDONLY,0); if(h < 0) { @@ -169,7 +169,7 @@ void dump_file(const char *fn) printf("*****\nDump file %s size %d\n",fn,size); for(i = 0; i < size; i++) { - + } } } @@ -183,7 +183,7 @@ void create_file_of_size(const char *fn,int syze) char xx[200]; h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + while (syze > 0) { sprintf(xx,"%s %8d",fn,iteration); @@ -203,23 +203,23 @@ void verify_file_of_size(const char *fn,int syze) { int h; int result; - + char xx[200]; char yy[200]; int l; - + int iterations = (syze + strlen(fn) -1)/ strlen(fn); - + h = yaffs_open(fn, O_RDONLY, S_IREAD | S_IWRITE); - + while (iterations > 0) { sprintf(xx,"%s %8d",fn,iterations); l = strlen(xx); - + result = yaffs_read(h,yy,l); yy[l] = 0; - + if(strcmp(xx,yy)){ printf("=====>>>>> verification of file %s failed near position %lld\n",fn,(long long)yaffs_lseek(h,0,SEEK_CUR)); } @@ -231,20 +231,20 @@ void verify_file_of_size(const char *fn,int syze) void create_resized_file_of_size(const char *fn,int syze1,int reSyze, int syze2) { int h; - + int iterations; - + h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + iterations = (syze1 + strlen(fn) -1)/ strlen(fn); while (iterations > 0) { yaffs_write(h,fn,strlen(fn)); iterations--; } - + yaffs_ftruncate(h,reSyze); - + yaffs_lseek(h,0,SEEK_SET); iterations = (syze2 + strlen(fn) -1)/ strlen(fn); while (iterations > 0) @@ -252,7 +252,7 @@ void create_resized_file_of_size(const char *fn,int syze1,int reSyze, int syze2) yaffs_write(h,fn,strlen(fn)); iterations--; } - + yaffs_close (h); } @@ -270,28 +270,28 @@ void do_some_file_stuff(const char *path) yaffs_unlink(fn); sprintf(fn,"%s/%s",path,"f2"); - + create_resized_file_of_size(fn,10000,3000,4000); } void yaffs_backward_scan_test(const char *path) { char fn[100]; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(path); - + do_some_file_stuff(path); - + sprintf(fn,"%s/ddd",path); - + yaffs_mkdir(fn,0); - + do_some_file_stuff(fn); - + yaffs_unmount(path); - + yaffs_mount(path); } @@ -299,7 +299,7 @@ void null_name_test(const char *path) { char fn[100]; int h; - yaffs_StartUp(); + yaffs_start_up(); yaffs_mount(path); @@ -319,16 +319,16 @@ void yaffs_device_flush_test(const char *path) char fn[100]; int h; int i; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(path); - + do_some_file_stuff(path); - + // Open and add some data to a few files for(i = 0; i < 10; i++) { - + sprintf(fn,"%s/ff%d",path,i); h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IWRITE | S_IREAD); @@ -336,7 +336,7 @@ void yaffs_device_flush_test(const char *path) yaffs_write(h,xxzz,2000); } yaffs_unmount(path); - + yaffs_mount(path); } @@ -346,10 +346,10 @@ void short_scan_test(const char *path, int fsize, int niterations) { int i; char fn[100]; - + sprintf(fn,"%s/%s",path,"f1"); - - yaffs_StartUp(); + + yaffs_start_up(); for(i = 0; i < niterations; i++) { printf("\n*****************\nIteration %d\n",i); @@ -369,13 +369,13 @@ void scan_pattern_test(const char *path, int fsize, int niterations) int j; char fn[3][100]; int result; - + sprintf(fn[0],"%s/%s",path,"f0"); sprintf(fn[1],"%s/%s",path,"f1"); sprintf(fn[2],"%s/%s",path,"f2"); - - yaffs_StartUp(); - + + yaffs_start_up(); + for(i = 0; i < niterations; i++) { printf("\n*****************\nIteration %d\n",i); @@ -386,7 +386,7 @@ void scan_pattern_test(const char *path, int fsize, int niterations) { result = dump_file_data(fn[j]); result = check_pattern_file(fn[j]); - make_pattern_file(fn[j],fsize); + make_pattern_file(fn[j],fsize); result = dump_file_data(fn[j]); result = check_pattern_file(fn[j]); } @@ -401,17 +401,17 @@ void fill_disk(const char *path,int nfiles) int result; int f; - static char xx[600]; + static char xx[600]; char str[50]; - + for(n = 0; n < nfiles; n++) { sprintf(str,"%s/%d",path,n); - + h = yaffs_open(str, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + printf("writing file %s handle %d ",str, h); - + while ((result = yaffs_write(h,xx,600)) == 600) { f = yaffs_freespace(path); @@ -426,12 +426,12 @@ void fill_disk_and_delete(const char *path, int nfiles, int ncycles) int i,j; char str[50]; int result; - + for(i = 0; i < ncycles; i++) { printf("@@@@@@@@@@@@@@ cycle %d\n",i); fill_disk(path,nfiles); - + for(j = 0; j < nfiles; j++) { sprintf(str,"%s/%d",path,j); @@ -448,9 +448,9 @@ void fill_files(const char *path,int flags, int maxIterations,int siz) int j; char str[50]; int h; - + i = 0; - + do{ sprintf(str,"%s/%d",path,i); h = yaffs_open(str, O_CREAT | O_TRUNC | O_RDWR,S_IREAD | S_IWRITE); @@ -462,14 +462,14 @@ void fill_files(const char *path,int flags, int maxIterations,int siz) yaffs_write(h,str,1); } } - + if( flags & 1) { yaffs_unlink(str); } i++; } while(h >= 0 && i < maxIterations); - + if(flags & 2) { i = 0; @@ -486,9 +486,9 @@ void leave_unlinked_file(const char *path,int maxIterations,int siz) int i; char str[50]; int h; - + i = 0; - + do{ sprintf(str,"%s/%d",path,i); printf("create %s\n",str); @@ -499,7 +499,7 @@ void leave_unlinked_file(const char *path,int maxIterations,int siz) } i++; } while(h < 0 && i < maxIterations); - + if(h >= 0) { for(i = 0; i < siz; i++) @@ -507,7 +507,7 @@ void leave_unlinked_file(const char *path,int maxIterations,int siz) yaffs_write(h,str,1); } } - + printf("Leaving file %s open\n",str); } @@ -518,9 +518,9 @@ void dumpDirFollow(const char *dname) yaffs_dirent *de; struct yaffs_stat s; char str[100]; - + d = yaffs_opendir(dname); - + if(!d) { printf("opendir failed\n"); @@ -530,10 +530,10 @@ void dumpDirFollow(const char *dname) while((de = yaffs_readdir(d)) != NULL) { sprintf(str,"%s/%s",dname,de->d_name); - - yaffs_stat(str,&s); - - printf("%s ino %d length %d mode %X ",de->d_name,(int)s.st_ino,(int)s.st_size,s.st_mode); + + yaffs_lstat(str,&s); + + printf("%s ino %lld length %d mode %X ",de->d_name,(int)s.st_ino,s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { case S_IFREG: printf("data file"); break; @@ -542,18 +542,18 @@ void dumpDirFollow(const char *dname) if(yaffs_readlink(str,str,100) < 0) printf("no alias"); else - printf("\"%s\"",str); + printf("\"%s\"",str); break; default: printf("unknown"); break; } - - printf("\n"); + + printf("\n"); } - + yaffs_closedir(d); } printf("\n"); - + printf("Free space in %s is %d\n\n",dname,(int)yaffs_freespace(dname)); } @@ -565,9 +565,9 @@ void dump_directory_tree_worker(const char *dname,int recursive) yaffs_dirent *de; struct yaffs_stat s; char str[1000]; - + d = yaffs_opendir(dname); - + if(!d) { printf("opendir failed\n"); @@ -577,10 +577,11 @@ void dump_directory_tree_worker(const char *dname,int recursive) while((de = yaffs_readdir(d)) != NULL) { sprintf(str,"%s/%s",dname,de->d_name); - + yaffs_lstat(str,&s); - - printf("%s inode %d obj %x length %d mode %X ",str,s.st_ino,de->d_dont_use,(int)s.st_size,s.st_mode); + + printf("%s inode %d obj %x length %lld mode %X ", + str,s.st_ino,de->d_dont_use, s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { case S_IFREG: printf("data file"); break; @@ -589,18 +590,18 @@ void dump_directory_tree_worker(const char *dname,int recursive) if(yaffs_readlink(str,str,100) < 0) printf("no alias"); else - printf("\"%s\"",str); + printf("\"%s\"",str); break; default: printf("unknown"); break; } - + printf("\n"); if((s.st_mode & S_IFMT) == S_IFDIR && recursive) dump_directory_tree_worker(str,1); - + } - + yaffs_closedir(d); } @@ -623,11 +624,11 @@ void dumpDir(const char *dname) static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expectedResult) { int fd; - + if(yaffs_chmod(path,tmode)< 0) printf("chmod failed\n"); - + fd = yaffs_open(path,tflags,0); - + if((fd >= 0) != (expectedResult > 0)) { printf("Permissions check %x %x %d failed\n",tmode,tflags,expectedResult); @@ -636,11 +637,11 @@ static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expe { printf("Permissions check %x %x %d OK\n",tmode,tflags,expectedResult); } - - + + yaffs_close(fd); - - + + } int long_test(int argc, char *argv[]) @@ -649,20 +650,20 @@ int long_test(int argc, char *argv[]) int f; int r; char buffer[20]; - + char str[100]; - + int h; mode_t temp_mode; struct yaffs_stat ystat; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount("/boot"); yaffs_mount("/data"); yaffs_mount("/flash"); yaffs_mount("/ram"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /data\n"); @@ -672,36 +673,36 @@ int long_test(int argc, char *argv[]) //leave_unlinked_file("/flash",20000,0); //leave_unlinked_file("/data",20000,0); - + leave_unlinked_file("/ram",20,0); - + f = yaffs_open("/boot/b1", O_RDONLY,0); - + printf("open /boot/b1 readonly, f=%d\n",f); - + f = yaffs_open("/boot/b1", O_CREAT,S_IREAD | S_IWRITE); - + printf("open /boot/b1 O_CREAT, f=%d\n",f); - - + + r = yaffs_write(f,"hello",1); printf("write %d attempted to write to a read-only file\n",r); - + r = yaffs_close(f); - + printf("close %d\n",r); f = yaffs_open("/boot/b1", O_RDWR,0); - + printf("open /boot/b1 O_RDWR,f=%d\n",f); - - + + r = yaffs_write(f,"hello",2); printf("write %d attempted to write to a writeable file\n",r); r = yaffs_write(f,"world",3); printf("write %d attempted to write to a writeable file\n",r); - + r= yaffs_lseek(f,0,SEEK_END); printf("seek end %d\n",r); memset(buffer,0,20); @@ -718,75 +719,75 @@ int long_test(int argc, char *argv[]) // Check values reading at end. // A read past end of file should return 0 for 0 bytes read. - + r= yaffs_lseek(f,0,SEEK_END); r = yaffs_read(f,buffer,10); - printf("read at end returned %d\n",r); + printf("read at end returned %d\n",r); r= yaffs_lseek(f,500,SEEK_END); r = yaffs_read(f,buffer,10); - printf("read past end returned %d\n",r); - + printf("read past end returned %d\n",r); + r = yaffs_close(f); - + printf("close %d\n",r); - + copy_in_a_file("/boot/yyfile","xxx"); - + // Create a file with a long name - + copy_in_a_file("/boot/file with a long name","xxx"); - - + + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check stat - r = yaffs_stat("/boot/file with a long name",&ystat); - + r = yaffs_lstat("/boot/file with a long name",&ystat); + // Check rename - + r = yaffs_rename("/boot/file with a long name","/boot/r1"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); - + // Check unlink r = yaffs_unlink("/boot/r1"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check mkdir - + r = yaffs_mkdir("/boot/directory1",0); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); - // add a file to the directory + // add a file to the directory copy_in_a_file("/boot/directory1/file with a long name","xxx"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); - + // Attempt to delete directory (should fail) - + r = yaffs_rmdir("/boot/directory1"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); - + // Delete file first, then rmdir should work r = yaffs_unlink("/boot/directory1/file with a long name"); r = yaffs_rmdir("/boot/directory1"); - - + + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); @@ -794,19 +795,19 @@ int long_test(int argc, char *argv[]) #if 0 fill_disk_and_delete("/boot",20,20); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); #endif yaffs_symlink("yyfile","/boot/slink"); - + yaffs_readlink("/boot/slink",str,100); printf("symlink alias is %s\n",str); - - - - + + + + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot (using stat instead of lstat)\n"); @@ -815,30 +816,30 @@ int long_test(int argc, char *argv[]) dumpDir("/boot/directory1"); h = yaffs_open("/boot/slink",O_RDWR,0); - + printf("file length is %d\n",(int)yaffs_lseek(h,0,SEEK_END)); - + yaffs_close(h); - + yaffs_unlink("/boot/slink"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); - + // Check chmod - - yaffs_stat("/boot/yyfile",&ystat); + + yaffs_lstat("/boot/yyfile",&ystat); temp_mode = ystat.st_mode; - + yaffs_chmod("/boot/yyfile",0x55555); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); - + yaffs_chmod("/boot/yyfile",temp_mode); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); - + // Permission checks... PermissionsCheck("/boot/yyfile",0, O_WRONLY,0); PermissionsCheck("/boot/yyfile",0, O_RDONLY,0); @@ -851,44 +852,44 @@ int long_test(int argc, char *argv[]) PermissionsCheck("/boot/yyfile",S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDONLY,0); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDWR,0); - + PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDWR,1); yaffs_chmod("/boot/yyfile",temp_mode); - + //create a zero-length file and unlink it (test for scan bug) - + h = yaffs_open("/boot/zlf",O_CREAT | O_TRUNC | O_RDWR,0); yaffs_close(h); - + yaffs_unlink("/boot/zlf"); - - - yaffs_DumpDevStruct("/boot"); - + + + yaffs_dump_dev("/boot"); + fill_disk_and_delete("/boot",20,20); - - yaffs_DumpDevStruct("/boot"); - + + yaffs_dump_dev("/boot"); + fill_files("/boot",1,10000,0); fill_files("/boot",1,10000,5000); fill_files("/boot",2,10000,0); fill_files("/boot",2,10000,5000); - + leave_unlinked_file("/data",20000,0); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); - - yaffs_DumpDevStruct("/boot"); - yaffs_DumpDevStruct("/data"); - - - + + yaffs_dump_dev("/boot"); + yaffs_dump_dev("/data"); + + + return 0; } @@ -905,26 +906,26 @@ int huge_directory_test_on_path(char *path) int total = 0; int lastTotal = 0; - + char str[100]; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(path); - + // Create a large number of files - + for(i = 0; i < 2000; i++) { sprintf(str,"%s/%d",path,i); - + f = yaffs_open(str,O_CREAT,S_IREAD | S_IWRITE); yaffs_close(f); } - - - + + + d = yaffs_opendir(path); i = 0; if (d) { @@ -943,10 +944,10 @@ int huge_directory_test_on_path(char *path) break; } } - + yaffs_closedir(d); } - + return 0; } @@ -962,34 +963,34 @@ void rename_over_test(const char *mountpt) char a[100]; char b[100]; char c[100]; - + sprintf(a,"%s/a",mountpt); sprintf(b,"%s/b",mountpt); sprintf(c,"%s/c",mountpt); - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(mountpt); - + printf("Existing files\n"); dumpDirFollow(mountpt); - - - + + + i = yaffs_open(c,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); printf("File c handle is %d\n",i); yaffs_close(i); - i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); + i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); yaffs_close(i); i = yaffs_open(b,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); yaffs_close(i); yaffs_rename(a,b); // rename over yaffs_rename(b,a); // rename back again (not renaimng over) yaffs_rename(a,b); // rename back again (not renaimng over) - - + + yaffs_unmount(mountpt); - + } @@ -1000,46 +1001,46 @@ int resize_stress_test(const char *path) int r; char aname[100]; char bname[100]; - + char abuffer[1000]; char bbuffer[1000]; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(path); - + sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); - + memset(abuffer,'a',1000); memset(bbuffer,'b',1000); - + a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + printf(" %s %d %s %d\n",aname,a,bname,b); - + x = 0; - + for(j = 0; j < 100; j++) { yaffs_lseek(a,0,SEEK_END); - + for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); - + if(x & 0x16) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); - + syz -= 500; if(syz < 0) syz = 0; yaffs_ftruncate(a,syz); - + } else { @@ -1048,12 +1049,12 @@ int resize_stress_test(const char *path) r = yaffs_write(a,abuffer,1000); } x++; - + } } - + return 0; - + } @@ -1062,16 +1063,16 @@ int overwrite_test(const char *path) char aname[100]; char bname[100]; int i; - int j; + int j; int a; int b; - yaffs_StartUp(); - + yaffs_start_up(); + yaffs_mount(path); - + sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); - + b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); for(j= 0; j < 500; j++){ yaffs_write(b,bname,100); @@ -1080,32 +1081,32 @@ int overwrite_test(const char *path) yaffs_write(a,&a,sizeof(a)); yaffs_close(a); } - + return 0; - + } int root_perm_remount(const char *path) { struct yaffs_stat s; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(path); - - yaffs_stat(path,&s); + + yaffs_lstat(path,&s); printf("root perms after mount %x\n",s.st_mode); - + yaffs_chmod(path, 0777); - yaffs_stat(path,&s); + yaffs_lstat(path,&s); printf("root perms after setting to 0777 is %x\n",s.st_mode); - + yaffs_unmount(path); - + return 0; - + } @@ -1116,54 +1117,54 @@ int resize_stress_test_no_grow_complex(const char *path,int iters) int r; char aname[100]; char bname[100]; - + char abuffer[1000]; char bbuffer[1000]; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(path); - + sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); - + memset(abuffer,'a',1000); memset(bbuffer,'b',1000); - + a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + printf(" %s %d %s %d\n",aname,a,bname,b); - + x = 0; - + for(j = 0; j < iters; j++) { yaffs_lseek(a,0,SEEK_END); - + for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); - + if(!(x%20)) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); - + while(syz > 4000) { - + syz -= 2050; if(syz < 0) syz = 0; yaffs_ftruncate(a,syz); syz = yaffs_lseek(a,0,SEEK_END); printf("shrink to %d\n",syz); } - - + + } else { @@ -1172,16 +1173,16 @@ int resize_stress_test_no_grow_complex(const char *path,int iters) r = yaffs_write(a,abuffer,1000); } x++; - - + + } - + printf("file size is %lld\n",(long long)yaffs_lseek(a,0,SEEK_END)); } - + return 0; - + } int resize_stress_test_no_grow(const char *path,int iters) @@ -1191,53 +1192,53 @@ int resize_stress_test_no_grow(const char *path,int iters) int r; char aname[100]; char bname[100]; - + char abuffer[1000]; char bbuffer[1000]; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(path); - + sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); - + memset(abuffer,'a',1000); memset(bbuffer,'b',1000); - + a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + printf(" %s %d %s %d\n",aname,a,bname,b); - + x = 0; - + for(j = 0; j < iters; j++) { yaffs_lseek(a,0,SEEK_END); - + for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); - + if(!(x%20)) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); - + while(syz > 4000) { - + syz -= 2050; if(syz < 0) syz = 0; yaffs_ftruncate(a,syz); syz = yaffs_lseek(a,0,SEEK_END); printf("shrink to %d\n",syz); } - - + + } else { @@ -1246,34 +1247,34 @@ int resize_stress_test_no_grow(const char *path,int iters) r = yaffs_write(a,abuffer,1000); } x++; - - + + } printf("file size is %lld\n",(long long)yaffs_lseek(a,0,SEEK_END)); } - + return 0; - + } int directory_rename_test(void) { int r; - yaffs_StartUp(); - + yaffs_start_up(); + yaffs_mount("/ram"); yaffs_mkdir("/ram/a",0); yaffs_mkdir("/ram/a/b",0); yaffs_mkdir("/ram/c",0); - + printf("\nDirectory look-up of /ram\n"); dumpDir("/ram"); dumpDir("/ram/a"); dumpDir("/ram/a/b"); printf("Do rename (should fail)\n"); - + r = yaffs_rename("/ram/a","/ram/a/b/d"); printf("\nDirectory look-up of /ram\n"); dumpDir("/ram"); @@ -1281,16 +1282,16 @@ int directory_rename_test(void) dumpDir("/ram/a/b"); printf("Do rename (should not fail)\n"); - + r = yaffs_rename("/ram/c","/ram/a/b/d"); printf("\nDirectory look-up of /ram\n"); dumpDir("/ram"); dumpDir("/ram/a"); dumpDir("/ram/a/b"); - - + + return 1; - + } int cache_read_test(void) @@ -1299,11 +1300,11 @@ int cache_read_test(void) int i; int sizeOfFiles = 500000; char buffer[100]; - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount("/boot"); - + make_a_file("/boot/a",'a',sizeOfFiles); make_a_file("/boot/b",'b',sizeOfFiles); @@ -1319,58 +1320,58 @@ int cache_read_test(void) yaffs_read(b,buffer,i); yaffs_write(c,buffer,i); } while(sizeOfFiles > 0); - - - - return 1; - -} + + + + return 1; + +} int cache_bypass_bug_test(void) { // This test reporoduces a bug whereby YAFFS caching *was* buypassed // resulting in erroneous reads after writes. // This bug has been fixed. - + int a; char buffer1[1000]; char buffer2[1000]; - + memset(buffer1,0,sizeof(buffer1)); memset(buffer2,0,sizeof(buffer2)); - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount("/boot"); - + // Create a file of 2000 bytes. make_a_file("/boot/a",'X',2000); a = yaffs_open("/boot/a",O_RDWR, S_IREAD | S_IWRITE); - + // Write a short sequence to the file. // This will go into the cache. yaffs_lseek(a,0,SEEK_SET); - yaffs_write(a,"abcdefghijklmnopqrstuvwxyz",20); + yaffs_write(a,"abcdefghijklmnopqrstuvwxyz",20); // Read a short sequence from the file. // This will come from the cache. yaffs_lseek(a,0,SEEK_SET); - yaffs_read(a,buffer1,30); + yaffs_read(a,buffer1,30); // Read a page size sequence from the file. yaffs_lseek(a,0,SEEK_SET); - yaffs_read(a,buffer2,512); - + yaffs_read(a,buffer2,512); + printf("buffer 1 %s\n",buffer1); printf("buffer 2 %s\n",buffer2); - + if(strncmp(buffer1,buffer2,20)) { printf("Cache bypass bug detected!!!!!\n"); } - - + + return 1; } @@ -1378,13 +1379,13 @@ int cache_bypass_bug_test(void) int free_space_check(void) { int f; - - yaffs_StartUp(); + + yaffs_start_up(); yaffs_mount("/boot"); fill_disk("/boot/",2); f = yaffs_freespace("/boot"); - - printf("%d free when disk full\n",f); + + printf("%d free when disk full\n",f); return 1; } @@ -1397,25 +1398,25 @@ int truncate_test(void) char y[10]; - yaffs_StartUp(); + yaffs_start_up(); yaffs_mount("/boot"); yaffs_unlink("/boot/trunctest"); - + a = yaffs_open("/boot/trunctest", O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + yaffs_write(a,"abcdefghijklmnopqrstuvwzyz",26); - + yaffs_ftruncate(a,3); l= yaffs_lseek(a,0,SEEK_END); - + printf("truncated length is %d\n",l); yaffs_lseek(a,5,SEEK_SET); yaffs_write(a,"1",1); yaffs_lseek(a,0,SEEK_SET); - + r = yaffs_read(a,y,10); printf("read %d bytes:",r); @@ -1435,39 +1436,39 @@ int truncate_test(void) void fill_disk_test(const char *mountpt) { int i; - yaffs_StartUp(); - + yaffs_start_up(); + for(i = 0; i < 5; i++) { yaffs_mount(mountpt); fill_disk_and_delete(mountpt,100,i+1); yaffs_unmount(mountpt); } - + } void fill_files_test(const char *mountpt) { int i; - yaffs_StartUp(); - + yaffs_start_up(); + for(i = 0; i < 5; i++) { yaffs_mount(mountpt); fill_files(mountpt,2,3,100); yaffs_unmount(mountpt); } - + } void fill_empty_files_test(const char *mountpt) { int i; - yaffs_StartUp(); + yaffs_start_up(); char name[100]; int result = 0; - + int d,f; for(i = 0; i < 5; i++) @@ -1477,7 +1478,7 @@ void fill_empty_files_test(const char *mountpt) sprintf(name,"%s/%d",mountpt,d); result= yaffs_mkdir(name,0); printf("creating directory %s result %d\n",name,result); - + for(f = 0; result >= 0 && f < 100; f++){ sprintf(name,"%s/%d/%d",mountpt,d,f); result= yaffs_open(name,O_CREAT, 0); @@ -1487,54 +1488,54 @@ void fill_empty_files_test(const char *mountpt) } yaffs_unmount(mountpt); } - + } void long_name_test(const char *mountpt) { int i; - yaffs_StartUp(); + yaffs_start_up(); char fullName[1000]; char name[300]; int result = 0; - + int f; - + // Make a 256 byte name memset(name,0,sizeof(name)); for(i = 0; i < 256; i++) name[i] = '0' + i % 10; - + sprintf(fullName,"%s/%s",mountpt,name); for(i = 0; i < 1; i++) { yaffs_mount(mountpt); - + printf("Files at start\n"); dumpDir(mountpt); - + printf("Creating file %s\n",fullName); - + f = yaffs_open(fullName,O_CREAT | O_RDWR,0); yaffs_close(f); - + printf("Result %d\n",f); - + printf("Files\n"); dumpDir(mountpt); - + printf("Deleting %s\n",fullName); result = yaffs_unlink(fullName); printf("Result %d\n",result); - + printf("Files\n"); - + dumpDir(mountpt); - + yaffs_unmount(mountpt); } - + } @@ -1543,34 +1544,34 @@ void lookup_test(const char *mountpt) int i; int h; char a[100]; - + yaffs_DIR *d; yaffs_dirent *de; - yaffs_StartUp(); - + yaffs_start_up(); + yaffs_mount(mountpt); - + d = yaffs_opendir(mountpt); - + if(!d) { printf("opendir failed\n"); } else { - + for(i = 0; (de = yaffs_readdir(d)) != NULL; i++) { printf("unlinking %s\n",de->d_name); yaffs_unlink(de->d_name); } - + printf("%d files deleted\n",i); } - - + + for(i = 0; i < 2000; i++){ sprintf(a,"%s/%d",mountpt,i); h = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, 0); @@ -1581,23 +1582,23 @@ void lookup_test(const char *mountpt) for(i = 0; (de = yaffs_readdir(d)) != NULL; i++) { printf("%d %s\n",i,de->d_name); - } - + } + printf("%d files listed\n\n\n",i); - + yaffs_rewinddir(d); yaffs_readdir(d); yaffs_readdir(d); yaffs_readdir(d); - + for(i = 0; i < 2000; i++){ sprintf(a,"%s/%d",mountpt,i); yaffs_unlink(a); } - - + + yaffs_unmount(mountpt); - + } void link_test0(const char *mountpt) @@ -1605,12 +1606,12 @@ void link_test0(const char *mountpt) char namea[300]; char nameb[300]; int result = 0; - - yaffs_StartUp(); + + yaffs_start_up(); yaffs_mount(mountpt); - - + + sprintf(namea,"%s/a",mountpt); sprintf(nameb,"%s/b",mountpt); @@ -1624,7 +1625,7 @@ void link_test0(const char *mountpt) yaffs_unlink(nameb); printf("b unlinked\n"); dumpDir(mountpt); - + result = yaffs_open(namea,O_CREAT| O_RDWR,0666); yaffs_close(result); printf("a created\n"); @@ -1655,18 +1656,18 @@ void link_test1(const char *mountpt) sprintf(a,"%s/aaa",mountpt); sprintf(b,"%s/bbb",mountpt); sprintf(c,"%s/ccc",mountpt); - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(mountpt); - - + + h = yaffs_open(a, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); for(i = 0; i < 100; i++) yaffs_write(h,a,100); - + yaffs_close(h); - + yaffs_unlink(b); yaffs_unlink(c); yaffs_link(a,b); @@ -1674,12 +1675,12 @@ void link_test1(const char *mountpt) yaffs_unlink(b); yaffs_unlink(c); yaffs_unlink(a); - - + + yaffs_unmount(mountpt); yaffs_mount(mountpt); - - printf("link test done\n"); + + printf("link test done\n"); } void handle_test(const char *mountpt) @@ -1690,9 +1691,9 @@ void handle_test(const char *mountpt) char a[100]; sprintf(a,"%s/aaa",mountpt); - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(mountpt); for(cycle = 0; cycle < 5; cycle++){ @@ -1703,13 +1704,13 @@ void handle_test(const char *mountpt) printf("%d handle %d\n",i,h); i++; } while(h >= 0); - + while(i >= -1) { yaffs_close(i); i--; } } - + yaffs_unmount(mountpt); } @@ -1718,41 +1719,41 @@ void freespace_test(const char *mountpt) int i; int h; char a[100]; - + int f0; int f1; int f2; int f3; sprintf(a,"%s/aaa",mountpt); - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(mountpt); - + f0 = yaffs_freespace(mountpt); - + h = yaffs_open(a, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + for(i = 0; i < 100; i++) yaffs_write(h,a,100); - + yaffs_close(h); - + f1 = yaffs_freespace(mountpt); - + yaffs_unlink(a); - + f2 = yaffs_freespace(mountpt); - - + + yaffs_unmount(mountpt); yaffs_mount(mountpt); - + f3 = yaffs_freespace(mountpt); - + printf("%d\n%d\n%d\n%d\n",f0, f1,f2,f3); - - + + } void simple_rw_test(const char *mountpt) @@ -1760,49 +1761,49 @@ void simple_rw_test(const char *mountpt) int i; int h; char a[100]; - + int x; int result; sprintf(a,"%s/aaa",mountpt); - - yaffs_StartUp(); - + + yaffs_start_up(); + yaffs_mount(mountpt); - + yaffs_unlink(a); - + h = yaffs_open(a,O_CREAT| O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + for(i = 100000;i < 200000; i++){ result = yaffs_write(h,&i,sizeof(i)); - + if(result != 4) { printf("write error\n"); exit(1); } } - + //yaffs_close(h); - + // h = yaffs_open(a,O_RDWR, S_IREAD | S_IWRITE); - - + + yaffs_lseek(h,0,SEEK_SET); - + for(i = 100000; i < 200000; i++){ result = yaffs_read(h,&x,sizeof(x)); - + if(result != 4 || x != i){ printf("read error %d %x %x\n",i,result,x); } } - + printf("Simple rw test passed\n"); - - - + + + } @@ -1810,30 +1811,30 @@ void scan_deleted_files_test(const char *mountpt) { char fn[100]; char sub[100]; - + const char *p; - + int i; int j; int k; int h; - + sprintf(sub,"%s/sdir",mountpt); - yaffs_StartUp(); - + yaffs_start_up(); + for(j = 0; j < 10; j++) { printf("\n\n>>>>>>> Run %d <<<<<<<<<<<<<\n\n",j); yaffs_mount(mountpt); yaffs_mkdir(sub,0); - - + + p = (j & 0) ? mountpt: sub; - + for(i = 0; i < 100; i++) { - sprintf(fn,"%s/%d",p,i); - + sprintf(fn,"%s/%d",p,i); + if(i & 1) { h = yaffs_open(fn,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); @@ -1844,22 +1845,22 @@ void scan_deleted_files_test(const char *mountpt) else yaffs_mkdir(fn,0); } - + for(i = 0; i < 10; i++) { - sprintf(fn,"%s/%d",p,i); - if(i & 1) + sprintf(fn,"%s/%d",p,i); + if(i & 1) yaffs_unlink(fn); else yaffs_rmdir(fn); - + } - + yaffs_unmount(mountpt); } - - - + + + } @@ -1877,35 +1878,35 @@ void write_200k_file(const char *fn, const char *fdel, const char *fdel1) int h1; int i; int offs; - + h1 = yaffs_open(fn, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + for(i = 0; i < 100000; i+= 10000) { write_10k(h1); } - + offs = yaffs_lseek(h1,0,SEEK_CUR); if( offs != 100000) { printf("Could not write file\n"); } - + yaffs_unlink(fdel); for(i = 0; i < 100000; i+= 10000) { write_10k(h1); } - + offs = yaffs_lseek(h1,0,SEEK_CUR); if( offs != 200000) { printf("Could not write file\n"); } - + yaffs_close(h1); yaffs_unlink(fdel1); - + } @@ -1916,9 +1917,9 @@ void verify_200k_file(const char *fn) char x[11]; const char *s="0123456789"; int errCount = 0; - + h1 = yaffs_open(fn, O_RDONLY, 0); - + for(i = 0; i < 200000 && errCount < 10; i+= 10) { yaffs_read(h1,x,10); @@ -1930,9 +1931,9 @@ void verify_200k_file(const char *fn) } if(errCount >= 10) printf("Too many errors... aborted\n"); - - yaffs_close(h1); - + + yaffs_close(h1); + } @@ -1942,23 +1943,23 @@ void check_resize_gc_bug(const char *mountpt) char a[30]; char b[30]; char c[30]; - + int i; - + sprintf(a,"%s/a",mountpt); sprintf(b,"%s/b",mountpt); sprintf(c,"%s/c",mountpt); - - - - yaffs_StartUp(); + + + + yaffs_start_up(); yaffs_mount(mountpt); yaffs_unlink(a); yaffs_unlink(b); - + for(i = 0; i < 50; i++) - { + { printf("A\n");write_200k_file(a,"",c); printf("B\n");verify_200k_file(a); printf("C\n");write_200k_file(b,a,c); @@ -1968,7 +1969,7 @@ void check_resize_gc_bug(const char *mountpt) printf("E\n");verify_200k_file(a); printf("F\n");verify_200k_file(b); } - + } @@ -1976,51 +1977,51 @@ void multi_mount_test(const char *mountpt,int nmounts) { char a[30]; - + int i; int j; - + sprintf(a,"%s/a",mountpt); - yaffs_StartUp(); - + yaffs_start_up(); + for(i = 0; i < nmounts; i++){ int h0; int h1; int len0; int len1; - + static char xx[1000]; - + printf("############### Iteration %d Start\n",i); - if(1 || i == 0 || i == 5) + if(1 || i == 0 || i == 5) yaffs_mount(mountpt); dump_directory_tree(mountpt); - - + + yaffs_mkdir(a,0); - + sprintf(xx,"%s/0",a); h0 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - + sprintf(xx,"%s/1",a); h1 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); -#if 0 +#if 0 for(j = 0; j < 200; j++){ yaffs_write(h0,xx,1000); yaffs_write(h1,xx,1000); } #else while(yaffs_write(h0,xx,1000) > 0){ - + yaffs_write(h1,xx,1000); } #endif len0 = yaffs_lseek(h0,0,SEEK_END); len1 = yaffs_lseek(h1,0,SEEK_END); - + yaffs_lseek(h0,0,SEEK_SET); yaffs_lseek(h1,0,SEEK_SET); @@ -2028,12 +2029,12 @@ void multi_mount_test(const char *mountpt,int nmounts) yaffs_read(h0,xx,1000); yaffs_read(h1,xx,1000); } - - + + // yaffs_truncate(h0,0); yaffs_close(h0); yaffs_close(h1); - + printf("########### %d\n",i); dump_directory_tree(mountpt); @@ -2047,7 +2048,7 @@ void small_mount_test(const char *mountpt,int nmounts) { char a[30]; - + int i; int j; @@ -2056,46 +2057,46 @@ void small_mount_test(const char *mountpt,int nmounts) int len0; int len1; int nread; - + sprintf(a,"%s/a",mountpt); - yaffs_StartUp(); - - - + yaffs_start_up(); + + + for(i = 0; i < nmounts; i++){ - + static char xx[1000]; - + printf("############### Iteration %d Start\n",i); - if(1 || i == 0 || i == 5) + if(1 || i == 0 || i == 5) yaffs_mount(mountpt); dump_directory_tree(mountpt); - + yaffs_mkdir(a,0); - + sprintf(xx,"%s/0",a); if(i ==0){ - + h0 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); for(j = 0; j < 130; j++) yaffs_write(h0,xx,1000); yaffs_close(h0); } - + h0 = yaffs_open(xx,O_RDONLY,0); - + sprintf(xx,"%s/1",a); h1 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - + while((nread = yaffs_read(h0,xx,1000)) > 0) yaffs_write(h1,xx,nread); - - + + len0 = yaffs_lseek(h0,0,SEEK_END); len1 = yaffs_lseek(h1,0,SEEK_END); - + yaffs_lseek(h0,0,SEEK_SET); yaffs_lseek(h1,0,SEEK_SET); @@ -2103,10 +2104,10 @@ void small_mount_test(const char *mountpt,int nmounts) yaffs_read(h0,xx,1000); yaffs_read(h1,xx,1000); } - + yaffs_close(h0); yaffs_close(h1); - + printf("########### %d\n",i); dump_directory_tree(mountpt); @@ -2128,42 +2129,42 @@ void small_overwrite_test(const char *mountpt,int nmounts) int h0; int h1; - + sprintf(a,"%s/a",mountpt); - yaffs_StartUp(); - - - + yaffs_start_up(); + + + for(i = 0; i < nmounts; i++){ - + static char xx[8000]; - + printf("############### Iteration %d Start\n",i); if(1) yaffs_mount(mountpt); dump_directory_tree(mountpt); - + yaffs_mkdir(a,0); - + sprintf(xx,"%s/0",a); h0 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); sprintf(xx,"%s/1",a); h1 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - + for(j = 0; j < 1000000; j+=1000){ yaffs_ftruncate(h0,j); yaffs_lseek(h0,j,SEEK_SET); yaffs_write(h0,xx,7000); yaffs_write(h1,xx,7000); - + if(early_exit) exit(0); } - + yaffs_close(h0); - + printf("########### %d\n",i); dump_directory_tree(mountpt); @@ -2177,36 +2178,36 @@ void seek_overwrite_test(const char *mountpt,int nmounts) { static char xx[5000]; char a[30]; - + int i; int j; int h0; - + sprintf(a,"%s/f",mountpt); - yaffs_StartUp(); - + yaffs_start_up(); + yaffs_mount(mountpt); - - + + for(i = 0; i < nmounts; i++){ - + h0 = yaffs_open(a, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - + for(j = 0; j < 100000; j++){ yaffs_lseek(h0,0,SEEK_SET); yaffs_write(h0,xx,5000); yaffs_lseek(h0,0x100000,SEEK_SET); yaffs_write(h0,xx,5000); - + if(early_exit) exit(0); } - + yaffs_close(h0); - + } } @@ -2222,33 +2223,33 @@ void checkpoint_fill_test(const char *mountpt,int nmounts) char a[50]; char b[50]; char c[50]; - + int i; int j; int h; - + sprintf(a,"%s/a",mountpt); - - - - yaffs_StartUp(); - + + + + yaffs_start_up(); + for(i = 0; i < nmounts; i++){ printf("############### Iteration %d Start\n",i); yaffs_mount(mountpt); dump_directory_tree(mountpt); yaffs_mkdir(a,0); - + sprintf(b,"%s/zz",a); - + h = yaffs_open(b,O_CREAT | O_RDWR,S_IREAD |S_IWRITE); - - + + while(yaffs_write(h,c,50) == 50){} - + yaffs_close(h); - + for(j = 0; j < 2; j++){ printf("touch %d\n",j); yaffs_touch(b); @@ -2256,7 +2257,7 @@ void checkpoint_fill_test(const char *mountpt,int nmounts) yaffs_mount(mountpt); } - dump_directory_tree(mountpt); + dump_directory_tree(mountpt); yaffs_unmount(mountpt); } } @@ -2275,7 +2276,7 @@ int make_file2(const char *name1, const char *name2,int syz) h1 = yaffs_open(name1,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); if(name2) h2 = yaffs_open(name2,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + while(syz > 0 && n > 0){ i = (syz > 2500) ? 2500 : syz; n = yaffs_write(h1,xx,i); @@ -2299,14 +2300,14 @@ void checkpoint_upgrade_test(const char *mountpt,int nmounts) char d[50]; int j; - + sprintf(a,"%s/a",mountpt); - - - + + + printf("Create start condition\n"); - yaffs_StartUp(); + yaffs_start_up(); yaffs_mount(mountpt); yaffs_mkdir(a,0); sprintf(b,"%s/zz",a); @@ -2315,20 +2316,20 @@ void checkpoint_upgrade_test(const char *mountpt,int nmounts) sprintf(d,"%s/aa",a); make_file2(d,NULL,500000000); dump_directory_tree(mountpt); - + printf("Umount/mount attempt full\n"); yaffs_unmount(mountpt); - + yaffs_mount(mountpt); - + printf("unlink small file\n"); yaffs_unlink(c); dump_directory_tree(mountpt); - + printf("Umount/mount attempt\n"); yaffs_unmount(mountpt); yaffs_mount(mountpt); - + for(j = 0; j < 500; j++){ printf("***** touch %d\n",j); dump_directory_tree(mountpt); @@ -2345,26 +2346,26 @@ void checkpoint_upgrade_test(const char *mountpt,int nmounts) yaffs_mount(mountpt); } } - + void huge_array_test(const char *mountpt,int n) { char a[50]; - + int i; int space; - + int fnum; - + sprintf(a,"mount point %s",mountpt); - - - yaffs_StartUp(); + + + yaffs_start_up(); yaffs_mount(mountpt); - + while(n>0){ n--; fnum = 0; @@ -2377,9 +2378,9 @@ void huge_array_test(const char *mountpt,int n) printf("verifying file %s\n",a); verify_file_of_size(a,10000000); } - + printf("\n\n verification/deletion\n\n"); - + for(i = 0; i < fnum; i++){ sprintf(a,"%s/file%d",mountpt,i); printf("verifying file %s\n",a); @@ -2388,8 +2389,8 @@ void huge_array_test(const char *mountpt,int n) yaffs_unlink(a); } printf("\n\n done \n\n"); - - + + } } @@ -2398,7 +2399,7 @@ void random_write(int h) { static char buffer[12000]; int n; - + n = random() & 0x1FFF; yaffs_write(h,buffer,n); } @@ -2423,38 +2424,38 @@ void random_truncate(int h, char * name) } -#define NSMALLFILES 10 +#define NSMALLFILES 10 void random_small_file_test(const char *mountpt,int iterations) { char a[NSMALLFILES][50]; - + int i; int n; int h[NSMALLFILES]; int r; - - - yaffs_StartUp(); + + + yaffs_start_up(); yaffs_mount(mountpt); - + for(i = 0; i < NSMALLFILES; i++){ h[i]=-1; strcpy(a[i],""); } - + for(n = 0; n < iterations; n++){ - + for(i = 0; i < NSMALLFILES; i++) { r = random(); - + if(strlen(a[i]) == 0){ sprintf(a[i],"%s/%dx%d",mountpt,n,i); h[i] = yaffs_open(a[i],O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); } - + if(h[i] < -1) printf("Could not open yaffs file %d %d error %d\n",n,i,h[i]); else { @@ -2483,22 +2484,22 @@ void random_small_file_test(const char *mountpt,int iterations) } } } - + } - + for(i = 0; i < NSMALLFILES; i++) yaffs_close(h[i]); - + yaffs_unmount(mountpt); } void rmdir_test(const char *mountpt) { char name[100]; - yaffs_StartUp(); - + yaffs_start_up(); + yaffs_mount(mountpt); - + strcpy(name,mountpt); strcat(name,"/"); strcat(name,"hello"); @@ -2516,7 +2517,7 @@ static void print_xattrib_val(const char *path, const char *name) n = yaffs_getxattr(path,name,buffer,sizeof(buffer)); if(n >= 0){ - __u8 *b = (__u8 *)buffer; + u8 *b = (u8 *)buffer; printf("%d bytes:",n); if(n > 10) @@ -2549,6 +2550,50 @@ static void list_xattr(const char *path) printf("end\n"); } +void basic_utime_test(const char *mountpt) +{ + char name[100]; + int h; + int result; + int val1; + struct yaffs_utimbuf utb; + struct yaffs_stat st; + + yaffs_start_up(); + + yaffs_mount(mountpt); + + strcpy(name,mountpt); + strcat(name,"/"); + strcat(name,"xfile"); + + yaffs_unlink(name); + + printf("created\n"); + h = yaffs_open(name,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); + + yaffs_fstat(h,&st); printf(" times %u %u %u\n",st.yst_atime, st.yst_ctime, st.yst_mtime); + + utb.actime = 1000; + utb.modtime = 2000; + result = yaffs_futime(h,&utb); + printf("futime to a 1000 m 2000 result %d\n",result); + yaffs_fstat(h,&st); printf(" times %u %u %u\n",st.yst_atime, st.yst_ctime, st.yst_mtime); + + + utb.actime = 5000; + utb.modtime = 8000; + result = yaffs_utime(name, &utb); + printf("utime to a 5000 m 8000 result %d\n",result); + yaffs_fstat(h,&st); printf(" times %u %u %u\n",st.yst_atime, st.yst_ctime, st.yst_mtime); + + result = yaffs_utime(name, NULL); + printf("utime to NULL result %d\n",result); + yaffs_fstat(h,&st); printf(" times %u %u %u\n",st.yst_atime, st.yst_ctime, st.yst_mtime); + + +} + void basic_xattr_test(const char *mountpt) { char name[100]; @@ -2556,7 +2601,7 @@ void basic_xattr_test(const char *mountpt) int result; int val1; - yaffs_StartUp(); + yaffs_start_up(); yaffs_mount(mountpt); @@ -2606,7 +2651,7 @@ void big_xattr_test(const char *mountpt) int result; char val[1000]; - yaffs_StartUp(); + yaffs_start_up(); yaffs_mount(mountpt); @@ -2642,15 +2687,15 @@ void big_xattr_test(const char *mountpt) } -void dump_dev_stats(yaffs_Device *dev, const char * str) +void dump_dev_stats(struct yaffs_dev *dev, const char * str) { printf("%s\n",str); printf( "space free %d erased %d " "nand reads %d writes %d erases %d " "gc all %d passive %d oldestdirty %d blocks %d copies %d \n", - dev->nFreeChunks, dev->nErasedBlocks * dev->param.nChunksPerBlock, - dev->nPageReads, dev->nPageWrites, dev->nBlockErasures, - dev->allGCs, dev->passiveGCs, dev->oldestDirtyGCs, dev->nGCBlocks, dev->nGCCopies); + dev->n_free_chunks, dev->n_erased_blocks * dev->param.chunks_per_block, + dev->n_page_reads, dev->n_page_writes, dev->n_erasures, + dev->all_gcs, dev->passive_gc_count, dev->oldest_dirty_gc_count, dev->n_gc_blocks, dev->n_gc_copies); } void test_flash_traffic(const char *mountpt) @@ -2658,14 +2703,14 @@ void test_flash_traffic(const char *mountpt) char name0[100]; char name1[100]; int i; - yaffs_Device *dev; + struct yaffs_dev *dev; - yaffs_traceMask = 0; + yaffs_trace_mask = 0; - yaffs_StartUp(); + yaffs_start_up(); yaffs_mount(mountpt); - + dev = yaffs_getdev(mountpt); strcpy(name0,mountpt); @@ -2683,6 +2728,303 @@ void test_flash_traffic(const char *mountpt) } +void link_follow_test(const char *mountpt) +{ + char fn[100]; + char sn[100]; + char hn[100]; + int result; + int h; + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + + sprintf(fn,"%s/file",mountpt); + sprintf(sn,"%s/sym",mountpt); + sprintf(hn,"%s/hl-sym",mountpt); + + h = yaffs_open(fn,O_CREAT| O_RDWR, S_IREAD | S_IWRITE); + result = yaffs_close(h); + + result = yaffs_symlink(fn,sn); + result = yaffs_link(sn,hn); + + h =yaffs_open(hn,O_RDWR,0); + +} + +void max_files_test(const char *mountpt) +{ + char fn[100]; + char sn[100]; + char hn[100]; + int result; + int h; + int i; + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + + for(i = 0; i < 5000; i++) { + sprintf(fn,"%s/file%d", mountpt, i); + yaffs_unlink(fn); + h = yaffs_open(fn,O_CREAT| O_RDWR, S_IREAD | S_IWRITE); + if(h < 0) + printf("File %s not created\n", fn); + yaffs_write(h,fn,100); + result = yaffs_close(h); + } + for(i = 0; i < 5; i++){ + sprintf(fn,"%s/file%d",mountpt, i); + yaffs_unlink(fn); + } + + for(i = 1000; i < 1010; i++){ + sprintf(fn,"%s/file%d",mountpt, i); + h = yaffs_open(fn,O_CREAT| O_RDWR, S_IREAD | S_IWRITE); + yaffs_write(h,fn,100); + if(h < 0) + printf("File %s not created\n", fn); + result = yaffs_close(h); + } + + h =yaffs_open(hn,O_RDWR,0); + +} +void case_insensitive_test(const char *mountpt) +{ + char fn[100]; + char fn2[100]; + char buffer[100]; + int ret; + struct yaffs_stat s; + int h; + char *x; + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + dump_directory_tree(mountpt); + + sprintf(fn,"%s/Abc.Txt",mountpt); + yaffs_unlink(fn); + h = yaffs_open(fn, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); + + ret = yaffs_write(h,fn, strlen(fn) + 1); + + ret = yaffs_close(h); + + dump_directory_tree(mountpt); + + + strcpy(fn2, fn); + x = fn2; + while(*x) { + *x = toupper(*x); + x++; + } + + h = yaffs_open(fn2, O_RDONLY, 0); + ret = yaffs_read(h, buffer, 100); + + if (ret != strlen(fn) + 1 || memcmp(buffer, fn, ret)){ + printf("wrong file read\n"); + } else { + printf("File %s is the same as file %s\n", fn, fn2); + } + + ret = yaffs_stat(fn2, &s); + + printf("renaming\n"); + + ret = yaffs_rename(fn, fn2); + dump_directory_tree(mountpt); + +} + +void start_twice(const char *mountpt) +{ + printf("About to do first yaffs_start\n"); + yaffs_start_up(); + printf("started\n"); + printf("First mount returns %d\n", yaffs_mount(mountpt)); + printf("About to do second yaffs_start\n"); + yaffs_start_up(); + printf("started\n"); + printf("Second mount returns %d\n", yaffs_mount(mountpt)); +} + +#define N_WRITES 2000 +#define STRIDE 2000 + +#define BUFFER_N 1100 +unsigned xxbuffer[BUFFER_N]; + + +void set_buffer(int n) +{ + int i; + for(i = 0; i < BUFFER_N; i++) + xxbuffer[i] = i + n; +} + +void write_big_sparse_file(int h) +{ + int i; + loff_t offset = 0; + loff_t pos; + int n = sizeof(xxbuffer); + int wrote; + + for(i = 0; i < N_WRITES; i++) { + printf("writing at %lld\n", offset); + set_buffer(i); + pos = yaffs_lseek(h, offset, SEEK_SET); + if(pos != offset) { + printf("mismatched seek pos %lld offset %lld\n", + pos, offset); + perror("lseek64"); + exit(1); + } + wrote = yaffs_write(h, xxbuffer, n); + + if(wrote != n) { + printf("mismatched write wrote %d n %d\n", wrote, n); + exit(1); + } + + offset += (STRIDE * sizeof(xxbuffer)); + } + + yaffs_ftruncate(h, offset); + +} + + + + +void verify_big_sparse_file(int h) +{ + unsigned check_buffer[BUFFER_N]; + int i; + loff_t offset = 0; + loff_t pos; + int n = sizeof(check_buffer); + int result; + const char * check_type; + int checks_failed = 0; + int checks_passed = 0; + + for(i = 0; i < N_WRITES * STRIDE; i++) { + if(i % STRIDE) { + check_type = "zero"; + memset(xxbuffer,0, n); + } else { + check_type = "buffer"; + set_buffer(i/STRIDE); + } + //printf("%s checking %lld\n", check_type, offset); + pos = yaffs_lseek(h, offset, SEEK_SET); + if(pos != offset) { + printf("mismatched seek pos %lld offset %lld\n", + pos, offset); + perror("lseek64"); + exit(1); + } + result = yaffs_read(h, check_buffer, n); + + if(result != n) { + printf("mismatched read result %d n %d\n", result, n); + exit(1); + } + + + + + if(memcmp(xxbuffer, check_buffer, n)) { + int j; + + printf("buffer at %lld mismatches\n", pos); + printf("xxbuffer "); + for(j = 0; j < 20; j++) + printf(" %d",xxbuffer[j]); + printf("\n"); + printf("check_buffer "); + for(j = 0; j < 20; j++) + printf(" %d",check_buffer[j]); + printf("\n"); + + checks_failed++; + } else { + checks_passed++; + } + + offset += sizeof(xxbuffer); + } + + printf("%d checks passed, %d checks failed\n", checks_passed, checks_failed); + +} + + +void large_file_test(const char *mountpt) +{ + int handle; + char fullname[100]; + + yaffs_trace_mask = 0; + + yaffs_start_up(); + + yaffs_mount(mountpt); + printf("mounted\n"); + dumpDir(mountpt); + + sprintf(fullname, "%s/%s", mountpt, "big-test-file"); + + handle = yaffs_open(fullname, O_RDONLY, 0); + + handle = yaffs_open(fullname, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); + + if(handle < 0) { + perror("opening file"); + exit(1); + } + + write_big_sparse_file(handle); + verify_big_sparse_file(handle); + + yaffs_close(handle); + + printf("Job done\n"); + yaffs_unmount(mountpt); + + yaffs_mount(mountpt); + printf("mounted again\n"); + dumpDir(mountpt); + handle = yaffs_open(fullname, O_RDONLY, 0); + verify_big_sparse_file(handle); + yaffs_unmount(mountpt); + + + yaffs_mount_common(mountpt, 0, 1); + printf("mounted with no checkpt\n"); + dumpDir(mountpt); + handle = yaffs_open(fullname, O_RDONLY, 0); + verify_big_sparse_file(handle); + yaffs_unmount(mountpt); + +} + + int random_seed; int simulate_power_failure; @@ -2690,23 +3032,23 @@ int main(int argc, char *argv[]) { random_seed = time(NULL); //return long_test(argc,argv); - + //return cache_read_test(); - + // resize_stress_test_no_grow("/flash/flash",20); //root_perm_remount("/flash/flash"); - + //huge_directory_test_on_path("/ram2k"); - + //yaffs_backward_scan_test("/flash/flash"); // yaffs_device_flush_test("/flash/flash"); //rename_over_test("//////////////////flash///////////////////yaffs1///////////"); - + //fill_empty_files_test("/yaffs2/"); //resize_stress_test("/yaffs2"); //overwrite_test("/yaffs2"); - + //long_name_test("/yaffs2"); //link_test0("/yaffs2"); //link_test1("yaffs2"); @@ -2719,12 +3061,12 @@ int main(int argc, char *argv[]) //checkpoint_upgrade_test("/flash/flash",20); //small_overwrite_test("/flash/flash",1000); //checkpoint_fill_test("/flash/flash",20); - // random_small_file_test("/flash/flash",10000); + //random_small_file_test("/flash/flash",10000); // huge_array_test("/flash/flash",10); // handle_test("yaffs2/"); - + //long_test_on_path("/ram2k"); // long_test_on_path("/flash"); //simple_rw_test("/flash/flash"); @@ -2732,22 +3074,33 @@ int main(int argc, char *argv[]) // rename_over_test("/flash"); //lookup_test("/flash"); //freespace_test("/flash/flash"); - + //link_test("/flash/flash"); - + // cache_bypass_bug_test(); - + //free_space_check(); - + //check_resize_gc_bug("/flash"); - + //basic_xattr_test("/yaffs2"); //big_xattr_test("/yaffs2"); //null_name_test("yaffs2"); - test_flash_traffic("yaffs2"); + //test_flash_traffic("yaffs2"); + // link_follow_test("/yaffs2"); + //basic_utime_test("/yaffs2"); + + //max_files_test("/yaffs2"); + + start_twice("/yaffs2"); + + //large_file_test("/yaffs2"); + + //basic_utime_test("/yaffs2"); + //case_insensitive_test("/yaffs2"); return 0; - + }