X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=direct%2Fdtest.c;h=921b066d2c1c15f24451ba1c49a5b65c84996f8d;hb=HEAD;hp=de1eaa2d66fb7776ca60bcf2e1220b6c799b0a38;hpb=d48b3f2cc376fdf9201ae430baba8532c01b05b1;p=yaffs%2F.git diff --git a/direct/dtest.c b/direct/dtest.c index de1eaa2..921b066 100644 --- a/direct/dtest.c +++ b/direct/dtest.c @@ -32,6 +32,30 @@ void copy_in_a_file(char *yaffsName,char *inName) close(inh); } +void make_a_file(char *yaffsName,char bval,int sizeOfFile) +{ + int outh; + int i; + 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); + +} + @@ -40,6 +64,7 @@ void fill_disk(char *path,int nfiles) int h; int n; int result; + int f; char str[50]; @@ -53,7 +78,7 @@ void fill_disk(char *path,int nfiles) while ((result = yaffs_write(h,xx,600)) == 600) { - //printf("."); + f = yaffs_freespace("/boot"); } result = yaffs_close(h); printf(" close %d\n",result); @@ -173,8 +198,8 @@ void dumpDirFollow(const char *dname) yaffs_stat(str,&s); - printf("%s length %d mode %X ",de->d_name,s.st_size,s.st_mode); - switch(s.st_mode & S_IFMT) + printf("%s length %d mode %X ",de->d_name,s.yst_size,s.yst_mode); + switch(s.yst_mode & S_IFMT) { case S_IFREG: printf("data file"); break; case S_IFDIR: printf("directory"); break; @@ -218,8 +243,8 @@ void dumpDir(const char *dname) yaffs_lstat(str,&s); - printf("%s length %d mode %X ",de->d_name,s.st_size,s.st_mode); - switch(s.st_mode & S_IFMT) + printf("%s length %d mode %X ",de->d_name,s.yst_size,s.yst_mode); + switch(s.yst_mode & S_IFMT) { case S_IFREG: printf("data file"); break; case S_IFDIR: printf("directory"); break; @@ -453,7 +478,7 @@ int long_test(int argc, char *argv[]) // Check chmod yaffs_stat("/boot/yyfile",&ystat); - temp_mode = ystat.st_mode; + temp_mode = ystat.yst_mode; yaffs_chmod("/boot/yyfile",0x55555); printf("\nDirectory look-up of /boot\n"); @@ -555,10 +580,138 @@ int directory_rename_test(void) } +int cache_read_test(void) +{ + int a,b,c; + int i; + int sizeOfFiles = 500000; + char buffer[100]; + + yaffs_StartUp(); + + yaffs_mount("/boot"); + + make_a_file("/boot/a",'a',sizeOfFiles); + make_a_file("/boot/b",'b',sizeOfFiles); + + a = yaffs_open("/boot/a",O_RDONLY,0); + b = yaffs_open("/boot/b",O_RDONLY,0); + c = yaffs_open("/boot/c", O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); + + do{ + i = sizeOfFiles; + if (i > 100) i = 100; + sizeOfFiles -= i; + yaffs_read(a,buffer,i); + yaffs_read(b,buffer,i); + yaffs_write(c,buffer,i); + } while(sizeOfFiles > 0); + + + + return 1; + +} + +int cache_bypass_bug_test(void) +{ + // This test reporoduces a bug whereby YAFFS caching is buypassed + // resulting in erroneous reads after writes. + int a; + int i; + char buffer1[1000]; + char buffer2[1000]; + + memset(buffer1,0,sizeof(buffer1)); + memset(buffer2,0,sizeof(buffer2)); + + yaffs_StartUp(); + + 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); + + // Read a short sequence from the file. + // This will come from the cache. + yaffs_lseek(a,0,SEEK_SET); + yaffs_read(a,buffer1,30); + + // Read a page size sequence from the file. + yaffs_lseek(a,0,SEEK_SET); + 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; +} + + +int free_space_check(void) +{ + int f; + + yaffs_StartUp(); + yaffs_mount("/boot"); + fill_disk("/boot/",2); + f = yaffs_freespace("/boot"); + + printf("%d free when disk full\n",f); + return 1; +} + + +int BeatsTest(void) +{ + int h; + char b[2000]; + int freeSpace; + int fsize; + yaffs_StartUp(); + yaffs_mount("/ram"); + + h = yaffs_open("/ram/f1", O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); + + freeSpace = yaffs_freespace("/ram"); + printf("start free space %d\n",freeSpace); + + while(yaffs_write(h,b,600) > 0) { + fsize = yaffs_lseek(h,0,SEEK_CUR); + freeSpace = yaffs_freespace("/ram"); + printf(" %d = %d + %d\n",fsize + freeSpace,fsize,freeSpace); + } + yaffs_close(h); + + freeSpace = yaffs_freespace("/ram"); + + return 1; + +} + int main(int argc, char *argv[]) { //return long_test(argc,argv); - return directory_rename_test(); + //return cache_read_test(); + + //return cache_bypass_bug_test(); + + // return free_space_check(); + + return BeatsTest(); }