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);
+
+}
+
int h;
int n;
int result;
+ int f;
char str[50];
while ((result = yaffs_write(h,xx,600)) == 600)
{
- //printf(".");
+ f = yaffs_freespace("/boot");
}
result = yaffs_close(h);
printf(" close %d\n",result);
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;
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;
// 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");
}
+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();
}