X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs%2F.git;a=blobdiff_plain;f=direct%2Fdtest.c;h=6f32cb53d81ac028a86c20f00f08ae4df32de1db;hp=de1eaa2d66fb7776ca60bcf2e1220b6c799b0a38;hb=f312fc5a4e1e46509129caf3d7fd2edafc743d15;hpb=2724e648ea75872c7638f52420679b2d3682ebb4 diff --git a/direct/dtest.c b/direct/dtest.c index de1eaa2..6f32cb5 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); + +} + @@ -555,10 +579,94 @@ 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 main(int argc, char *argv[]) { //return long_test(argc,argv); - return directory_rename_test(); + //return cache_read_test(); + + return cache_bypass_bug_test(); }