From: Charles Manning Date: Mon, 13 Feb 2012 02:47:12 +0000 (+1300) Subject: Merge branch 'big-files': Merge in large file support X-Git-Tag: pre-driver-refactoring~34 X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=commitdiff_plain;h=ce0a5fb9849b6dc0d1347709b28d3a34eefec662 Merge branch 'big-files': Merge in large file support Signed-off-by: Charles Manning --- ce0a5fb9849b6dc0d1347709b28d3a34eefec662 diff --cc direct/basic-test/dtest.c index 3535423,0b67b7a..4953830 --- a/direct/basic-test/dtest.c +++ b/direct/basic-test/dtest.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; diff --cc yaffs_vfs_multi.c index fdb0137,8f6e4b5..db9f737 --- a/yaffs_vfs_multi.c +++ b/yaffs_vfs_multi.c @@@ -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 */