Merge branch 'big-files': Merge in large file support
authorCharles Manning <cdhmanning@gmail.com>
Mon, 13 Feb 2012 02:47:12 +0000 (15:47 +1300)
committerCharles Manning <cdhmanning@gmail.com>
Mon, 13 Feb 2012 02:47:12 +0000 (15:47 +1300)
Signed-off-by: Charles Manning <cdhmanning@gmail.com>
1  2 
direct/basic-test/dtest.c
direct/yaffsfs.c
yaffs_guts.h
yaffs_vfs_multi.c

@@@ -2755,60 -2756,170 +2756,223 @@@ void link_follow_test(const char *mount
  
  }
  
 +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 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;
  
@@@ -2874,12 -2985,10 +3038,15 @@@ int main(int argc, char *argv[]
  
         //test_flash_traffic("yaffs2");
         // link_follow_test("/yaffs2");
 +       //basic_utime_test("/yaffs2");
 +
 +       //max_files_test("/yaffs2");
 +       
 +       start_twice("/yaffs2");
  
 -       large_file_test("/yaffs2");
++       //large_file_test("/yaffs2");
+        //basic_utime_test("/yaffs2");
  
         return 0;
  
Simple merge
diff --cc yaffs_guts.h
Simple merge
@@@ -1336,12 -1325,12 +1331,12 @@@ static void yaffs_fill_inode_from_obj(s
                inode->i_size = yaffs_get_obj_length(obj);
                inode->i_blocks = (inode->i_size + 511) >> 9;
  
 -              inode->i_nlink = yaffs_get_obj_link_count(obj);
 +              set_nlink(inode, yaffs_get_obj_link_count(obj));
  
                yaffs_trace(YAFFS_TRACE_OS,
-                       "yaffs_fill_inode mode %x uid %d gid %d size %d count %d",
+                       "yaffs_fill_inode mode %x uid %d gid %d size %lld count %d",
                        inode->i_mode, inode->i_uid, inode->i_gid,
-                       (int)inode->i_size, atomic_read(&inode->i_count));
+                       inode->i_size, atomic_read(&inode->i_count));
  
                switch (obj->yst_mode & S_IFMT) {
                default:        /* fifo, device or socket */