From 9c35dd427cec7ce855ed5816f12b241d2d5f8ba2 Mon Sep 17 00:00:00 2001 From: Timothy Manning Date: Wed, 26 Jan 2011 11:28:00 +1300 Subject: yaffs Added a new test for yaffs functions via linux command calls. Signed-off-by: Timothy Manning --- direct/timothy_tests/linux_tests/Makefile | 113 +++++++++++++ direct/timothy_tests/linux_tests/README.txt | 22 +++ direct/timothy_tests/linux_tests/lib.c | 109 ++++++++++++ direct/timothy_tests/linux_tests/lib.h | 44 +++++ direct/timothy_tests/linux_tests/linux_test.c | 235 ++++++++++++++++++++++++++ direct/timothy_tests/linux_tests/linux_test.h | 43 +++++ direct/timothy_tests/linux_tests/mkdir_link | Bin 7262 -> 0 bytes direct/timothy_tests/linux_tests/mkdir_link.c | 18 -- direct/timothy_tests/linux_tests/mkdir_link.h | 0 direct/timothy_tests/linux_tests/rename | Bin 7220 -> 0 bytes direct/timothy_tests/linux_tests/rename.c | 17 -- direct/timothy_tests/linux_tests/rename.h | 0 12 files changed, 566 insertions(+), 35 deletions(-) create mode 100644 direct/timothy_tests/linux_tests/Makefile create mode 100644 direct/timothy_tests/linux_tests/README.txt create mode 100644 direct/timothy_tests/linux_tests/lib.c create mode 100644 direct/timothy_tests/linux_tests/lib.h create mode 100644 direct/timothy_tests/linux_tests/linux_test.c create mode 100644 direct/timothy_tests/linux_tests/linux_test.h delete mode 100755 direct/timothy_tests/linux_tests/mkdir_link delete mode 100644 direct/timothy_tests/linux_tests/mkdir_link.c delete mode 100644 direct/timothy_tests/linux_tests/mkdir_link.h delete mode 100755 direct/timothy_tests/linux_tests/rename delete mode 100644 direct/timothy_tests/linux_tests/rename.c delete mode 100644 direct/timothy_tests/linux_tests/rename.h diff --git a/direct/timothy_tests/linux_tests/Makefile b/direct/timothy_tests/linux_tests/Makefile new file mode 100644 index 0000000..6910788 --- /dev/null +++ b/direct/timothy_tests/linux_tests/Makefile @@ -0,0 +1,113 @@ +# Makefile for YAFFS direct stress tests +# +# +# YAFFS: Yet another Flash File System. A NAND-flash specific file system. +# +# Copyright (C) 2003-2010 Aleph One Ltd. +# +# +# Created by Charles Manning +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# NB Warning this Makefile does not include header dependencies. +# +# $Id: Makefile,v 1.7 2010-02-25 22:34:47 charles Exp $ + +#EXTRA_COMPILE_FLAGS = -DYAFFS_IGNORE_TAGS_ECC + +CFLAGS = -DCONFIG_YAFFS_DIRECT -DCONFIG_YAFFS_YAFFS2 +CFLAGS += -DCONFIG_YAFFS_PROVIDE_DEFS -DCONFIG_YAFFSFS_PROVIDE_VALUES +CFLAGS += -Wall -g $(EXTRA_COMPILE_FLAGS) -Wstrict-aliasing +#CFLAGS += -fno-strict-aliasing +CFLAGS += -O0 +CFLAGS += -Wextra -Wpointer-arith +#CFLAGS += -DCONFIG_YAFFS_VALGRIND_TEST + +#CFLAGS+= -Wshadow -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wmissing-declarations +#CFLAGS+= -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline + + +COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ + yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ + yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ + yaffs_tagscompat.o yaffs_packedtags2.o yaffs_tagsvalidity.o yaffs_nand.o \ + yaffs_checkptrw.o yaffs_qsort.o\ + yaffs_nameval.o yaffs_attribs.o \ + yaffs_norif1.o ynorsim.o \ + yaffs_allocator.o \ + yaffs_bitmap.o \ + yaffs_yaffs1.o \ + yaffs_yaffs2.o \ + yaffs_verify.o \ + yaffs_error.o + +# yaffs_checkptrwtest.o\ + +TESTFILES = linux_test.o lib.o + + + + +YAFFSTESTOBJS = $(COMMONTESTOBJS) $(TESTFILES) + + +ALLOBJS = $(sort $(YAFFSTESTOBJS)) $(PYTHONOBJS) + +YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ + yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ + yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ + yaffs_tagsvalidity.c yaffs_tagsvalidity.h yaffs_checkptrw.h yaffs_checkptrw.c \ + yaffs_nameval.c yaffs_nameval.h \ + yaffs_trace.h yaffs_attribs.h \ + yaffs_allocator.c yaffs_allocator.h \ + yaffs_yaffs1.c yaffs_yaffs1.h \ + yaffs_yaffs2.c yaffs_yaffs2.h \ + yaffs_bitmap.c yaffs_bitmap.h \ + yaffs_verify.c yaffs_verify.h + +YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ + yaffsfs.h ydirectenv.h \ + yaffs_flashif.c yaffscfg.h yaffs_qsort.c \ + yaffs_nandemul2k.h yaffs_list.h \ + yaffs_attribs.c yaffs_osglue.h \ + yaffs_nandif.c yaffs_nandif.h yportenv.h \ + yaffs_hweight.h yaffs_hweight.c \ + yaffs_error.c + + +DIRECTEXTRASYMLINKS = yaffscfg2k.c yaffs_fileem2k.c yaffs_fileem2k.h\ + yaffs_fileem.c yaffs_norif1.c yaffs_norif1.h \ + yaffs_ramdisk.c yaffs_ramdisk.h yaffs_ramem2k.c \ + ynorsim.h ynorsim.c yaffs_osglue.c + +SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS) $(DIRECTEXTRASYMLINKS) $(PYTONOSYMLINKS) +#all: directtest2k boottest + +all: linux_test + +$(ALLOBJS): %.o: %.c + gcc -c $(CFLAGS) -o $@ $< + +$(PYTONOSYMLINKS): + ln -s ../../python/$@ $@ + +$(YAFFSSYMLINKS): + ln -s ../../../$@ $@ + +$(YAFFSDIRECTSYMLINKS): + ln -s ../../$@ $@ + +$(DIRECTEXTRASYMLINKS): + ln -s ../../basic-test/$@ $@ + + +linux_test: $(SYMLINKS) $(ALLOBJS) + gcc $(CFLLAG) -o $@ $(ALLOBJS) + + + +clean: + rm -f linux_test $(ALLOBJS) core $(SYMLINKS) diff --git a/direct/timothy_tests/linux_tests/README.txt b/direct/timothy_tests/linux_tests/README.txt new file mode 100644 index 0000000..41c2812 --- /dev/null +++ b/direct/timothy_tests/linux_tests/README.txt @@ -0,0 +1,22 @@ + +How to initilise the nandsim + +$ make + +$ sudo -s +...password.. +# now have a root shell +$ ./linux-tests/initnandsim 128MiB-2048 +$ insmod yaffs2multi.ko +$ mkdir /mnt/y +$ mount -t yaffs2 /dev/mtdblock0 /mnt/y + +How to change the permissions on the nandsim partition +$ sudo chmod a+wr /mnt/y/ +#check the permission change +$ touch /mnt/y/test_file + +How to clean the folder +$ rm -rf /mnt/y + +The test must me run in sudo to work diff --git a/direct/timothy_tests/linux_tests/lib.c b/direct/timothy_tests/linux_tests/lib.c new file mode 100644 index 0000000..c5adae7 --- /dev/null +++ b/direct/timothy_tests/linux_tests/lib.c @@ -0,0 +1,109 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2010 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "lib.h" +static char message[200]; +static int PRINT_LEVEL = 3; + +node * linked_list_add_node(int pos,node *head_node) +{ + node *new_node=NULL; + if (pos==HEAD){ + new_node=malloc(sizeof(node)); + memset(new_node, NULL, sizeof(node)); + new_node->string=NULL; + new_node->next=head_node; + return new_node; + } + return NULL; +} + +void node_print_pointers(node *current_node) +{ + while (current_node != NULL){ + sprintf(message,"current_node: %p, string: %s next_node: %p\n",current_node,current_node->string,current_node->next); + print_message(3,message); + current_node=current_node->next; + } +} + +int delete_linked_list(node *head_node) +{ + node *next_node=NULL; + node *current_node=head_node; + + while (current_node != NULL){ + next_node=current_node->next; + free(current_node); + current_node=next_node; + } + + return 1; +} + +char * generate_random_string(unsigned int length) +{ + char string[length+1]; + unsigned int x; + for (x=0;x<(length-1);x++) + { + string[x]=(rand() % NAME_RANGE)+65; + } + string[x]='\0'; + return string; +} +void set_print_level(int new_level) +{ + PRINT_LEVEL=new_level; +} +int get_print_level(void) +{ + return PRINT_LEVEL; +} +void print_message(char print_level,char *message) +{ + if (print_level <= PRINT_LEVEL){ + printf(message); + } +} +unsigned int random_int(void) +{ + return (random()%4294967295); +} + +void check_function(int output) +{ + if (output>=0){ + print_message(3,"test_passed\n"); + } else { + print_message(3,"test_failed\n"); + get_error_linux(); + } +} + +void get_error_linux(void) +{ + int error_code=0; + char message[30]; + message[0]='\0'; + + error_code=errno; + sprintf(message,"linux_error code %d\n",error_code); + print_message(1,message); + + strcpy(message,"error is"); + perror(message); +// sprintf(message,"error is : %s\n",yaffs_error_to_str(error_code)); + //perror(message); + //print_message(1,message); +} diff --git a/direct/timothy_tests/linux_tests/lib.h b/direct/timothy_tests/linux_tests/lib.h new file mode 100644 index 0000000..22f6bc3 --- /dev/null +++ b/direct/timothy_tests/linux_tests/lib.h @@ -0,0 +1,44 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2010 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __lib_h__ +#define __lib_h__ +#include +#include +#include +#include "yaffsfs.h" + +#define NAME_RANGE 10 +#define ROOT_PATH "/mnt/y/" +#define FILE_NAME_LENGTH 3 +#define HEAD 0 +#define TAIL 1 + +typedef struct node_temp{ + char *string; + struct node_temp *next; +}node; + +int delete_linked_list(node *head_node); +node * linked_list_add_node(int pos,node *head_node); +unsigned int random_int(void); +char * generate_random_string(unsigned int length); +void get_error_linux(void); +void check_function(int output); +void print_message(char print_level, char *message); +void set_print_level(int new_level); +int get_print_level(void); +void node_print_pointers(node *current_node); +#endif diff --git a/direct/timothy_tests/linux_tests/linux_test.c b/direct/timothy_tests/linux_tests/linux_test.c new file mode 100644 index 0000000..cb3a300 --- /dev/null +++ b/direct/timothy_tests/linux_tests/linux_test.c @@ -0,0 +1,235 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2010 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "linux_test.h" + +int random_seed; +int simulate_power_failure = 1; + +char message[400]; //this is used for storing print messages. + +int main() +{ + dir_struct *scanned_dir=NULL; + int output=0; + int break_bool=0; + int x=5; + while( 1){ + while (break_bool!=1){ + //printf("x %d\n",x); + x--; + if (x<0 &&(break_bool!=1)){ + output=mkdir_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=rmdir_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=mknod_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=symlink_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=link_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + output=rename_test(); + break_bool=1; + } + x--; + if (x<0 &&(break_bool!=1)){ + scanned_dir=scan_dir(); + + output=remount_test(); + check_dir(scanned_dir); + scanned_dir=NULL; //the scanned dir has been freed in check_dir. + break_bool=1; + } + } + //printf("resetting x\n"); + check_function(output); + break_bool=0; + x=(rand()% 99); + } + return 0; +} + +dir_struct * scan_dir(void) +{ + struct dirent *dir_data; + dir_struct *dir=NULL; + dir=malloc(sizeof(dir_struct)); + memset(dir, NULL, sizeof(dir_struct)); + DIR *open_dir=NULL; + + + open_dir=opendir(ROOT_PATH); + dir_data=readdir(open_dir); + while(dir_data){ + dir->path_list=linked_list_add_node(HEAD,dir->path_list); + dir->path_list->string=malloc(strlen(dir_data->d_name)+1); + strcpy(dir->path_list->string,dir_data->d_name); + sprintf(message,"opened file: %s\n",dir->path_list->string); + print_message(3,message); + dir_data=readdir(open_dir); + } + closedir(open_dir); + node_print_pointers(dir->path_list); + return dir; +} + +int check_dir(dir_struct *old_dir) +{ + dir_struct *new_dir=scan_dir(); + node *new_list=new_dir->path_list; + node *old_list=old_dir->path_list; + int exit_loop=0; + print_message(3,"checking dir\n"); + for (;old_list!= NULL;old_list=old_list->next){ + + for (;(new_list=NULL) && (exit_loop !=1);new_list=new_list->next){ + sprintf(message,"comparing %s and %s\n",old_list->string,new_list->string); + print_message(3,message); + if (strcmp( new_list->string ,old_list->string)==0){ + //files match -now compare the modes and contents of the files. + //and set the paths to NULL. + exit_loop=1; + } + /*if (new_list->next==NULL){ + print_message(3,"next is null\n"); + + }*/ + } + if (exit_loop !=1){ + //failed to find a matching file + sprintf(message,"a file has disappeared: %s\n",old_list->string); + print_message(3,message); + + } + new_list=new_dir->path_list; + exit_loop=0; + } + //now check if there are any old unmatched files + + //free both data structs + delete_linked_list(old_dir->path_list); + delete_linked_list(new_dir->path_list); + new_dir->path_list=NULL; + old_dir->path_list=NULL; + free(old_dir); + free(new_dir); +} + +int remount_test(void) +{ + int output; + print_message(3,"\nunmounting\n"); + output=umount2("/mnt/y",MNT_FORCE); + check_function(output); + print_message(3,"mounting\n"); + mount("/dev/mtdblock0","/mnt/y","yaffs2",0,NULL); + check_function(output); +} + +int mkdir_test(void) +{ + + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int mode=0,output=0; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + mode = ((S_IREAD|S_IWRITE)&random_int()); + sprintf(message,"\nmaking directory: %s, with mode %d\n",string,mode); + print_message(3,message); + output= mkdir(string,mode); + return output; +} + +int rmdir_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int output=0; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + + sprintf(message,"\nremoving directory: %s\n",string); + print_message(3,message); + output= rmdir(string); + return output; +} +int symlink_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + char string2[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int output; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + strcpy(string2,ROOT_PATH); + strcat(string2,generate_random_string(FILE_NAME_LENGTH)); + sprintf(message,"\nsymlink from: %s, to %s\n",string,string2); + print_message(3,message); + output= symlink(string,string2); + return output; +} +int rename_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + char string2[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int output; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + strcpy(string2,ROOT_PATH); + strcat(string2,generate_random_string(FILE_NAME_LENGTH)); + sprintf(message,"\nrenaming from: %s, to %s\n",string,string2); + print_message(3,message); + output= rename(string,string2); + return output; +} +int link_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + char string2[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int output=0; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + strcpy(string2,ROOT_PATH); + strcat(string2,generate_random_string(FILE_NAME_LENGTH)); + sprintf(message,"\nlink from: %s, to %s\n",string,string2); + print_message(3,message); + output= link(string,string2); + return output; +} +int mknod_test(void) +{ + char string[FILE_NAME_LENGTH+strlen(ROOT_PATH)]; + int mode=0,dev=0,output=0; + strcpy(string,ROOT_PATH); + strcat(string,generate_random_string(FILE_NAME_LENGTH)); + mode = ((S_IREAD|S_IWRITE)&random_int()); + dev = random_int(); + sprintf(message,"\nmaking node: %s, with mode %d, dev %d\n",string,mode,dev); + print_message(3,message); + output= mknod(string,mode,dev); + return output; +} diff --git a/direct/timothy_tests/linux_tests/linux_test.h b/direct/timothy_tests/linux_tests/linux_test.h new file mode 100644 index 0000000..58e3ccb --- /dev/null +++ b/direct/timothy_tests/linux_tests/linux_test.h @@ -0,0 +1,43 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2010 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __linux_test_h__ +#define __linux_test_h__ +#include +#include +#include "yaffsfs.h" +#include +#include +#include +#include +#include "lib.h" +#include + + +typedef struct dir_struct_temp{ + node *path_list; + int number_of_items; +}dir_struct; + +int check_dir(dir_struct *old_dir); +dir_struct * scan_dir(void); +int link_test(void); +int symlink_test(void); +int mknod_test(void); +int mkdir_test(void); +int rename_test(void); +int rmdir_test(void); +int remount_test(void); +#endif diff --git a/direct/timothy_tests/linux_tests/mkdir_link b/direct/timothy_tests/linux_tests/mkdir_link deleted file mode 100755 index 7f92f37..0000000 Binary files a/direct/timothy_tests/linux_tests/mkdir_link and /dev/null differ diff --git a/direct/timothy_tests/linux_tests/mkdir_link.c b/direct/timothy_tests/linux_tests/mkdir_link.c deleted file mode 100644 index d466958..0000000 --- a/direct/timothy_tests/linux_tests/mkdir_link.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - - -int main() -{ - int output=0; - int error_code =0 ; - output =symlink("timothy/home/tests/new_dir" "timothy/home/test/new_dir_link"); - output=mkdir("timothy/home/test/new_dir_link" ); - printf("output %d\n",output); - if (output <0 ) { - error_code = errno; - printf("error code %d\n",error_code); - printf("Error description is : %s\n",strerror(errno)); - } - return 0; -} diff --git a/direct/timothy_tests/linux_tests/mkdir_link.h b/direct/timothy_tests/linux_tests/mkdir_link.h deleted file mode 100644 index e69de29..0000000 diff --git a/direct/timothy_tests/linux_tests/rename b/direct/timothy_tests/linux_tests/rename deleted file mode 100755 index a168978..0000000 Binary files a/direct/timothy_tests/linux_tests/rename and /dev/null differ diff --git a/direct/timothy_tests/linux_tests/rename.c b/direct/timothy_tests/linux_tests/rename.c deleted file mode 100644 index 9c40c2f..0000000 --- a/direct/timothy_tests/linux_tests/rename.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - - -int main() -{ - int output=0; - int error_code =0 ; - output=rename( "/home/timothy/test/cat/","/home/timothy/test/dog/"); - printf("output %d\n",output); - if (output <0 ) { - error_code = errno; - printf("error code %d\n",error_code); - printf("Error description is : %s\n",strerror(errno)); - } - return 0; -} diff --git a/direct/timothy_tests/linux_tests/rename.h b/direct/timothy_tests/linux_tests/rename.h deleted file mode 100644 index e69de29..0000000 -- cgit v1.2.3 From 79333a6e009cc468a6c15ff1077f3bc389fd85e9 Mon Sep 17 00:00:00 2001 From: Timothy Manning Date: Fri, 28 Jan 2011 12:14:38 +1300 Subject: yaffs Finshed direct/timothy_tests/linux_test. Signed-off-by: Timothy Manning --- direct/timothy_tests/linux_tests/lib.c | 11 +++ direct/timothy_tests/linux_tests/lib.h | 2 + direct/timothy_tests/linux_tests/linux_test.c | 98 ++++++++++++++++++++++++--- direct/timothy_tests/linux_tests/linux_test.h | 3 +- 4 files changed, 104 insertions(+), 10 deletions(-) diff --git a/direct/timothy_tests/linux_tests/lib.c b/direct/timothy_tests/linux_tests/lib.c index c5adae7..ffc9b05 100644 --- a/direct/timothy_tests/linux_tests/lib.c +++ b/direct/timothy_tests/linux_tests/lib.c @@ -14,6 +14,17 @@ #include "lib.h" static char message[200]; static int PRINT_LEVEL = 3; +static int exit_on_error_val =1; + +int get_exit_on_error(void) +{ + return exit_on_error_val; +} + +void set_exit_on_error(int val) +{ + exit_on_error_val=val; +} node * linked_list_add_node(int pos,node *head_node) { diff --git a/direct/timothy_tests/linux_tests/lib.h b/direct/timothy_tests/linux_tests/lib.h index 22f6bc3..a47a1b8 100644 --- a/direct/timothy_tests/linux_tests/lib.h +++ b/direct/timothy_tests/linux_tests/lib.h @@ -31,6 +31,8 @@ typedef struct node_temp{ struct node_temp *next; }node; +int get_exit_on_error(void); +void set_exit_on_error(int val); int delete_linked_list(node *head_node); node * linked_list_add_node(int pos,node *head_node); unsigned int random_int(void); diff --git a/direct/timothy_tests/linux_tests/linux_test.c b/direct/timothy_tests/linux_tests/linux_test.c index cb3a300..88732ad 100644 --- a/direct/timothy_tests/linux_tests/linux_test.c +++ b/direct/timothy_tests/linux_tests/linux_test.c @@ -18,12 +18,76 @@ int simulate_power_failure = 1; char message[400]; //this is used for storing print messages. -int main() + + +const struct option long_options[]={ + {"help", 0,NULL,'h'}, + + + {"print_level", 1,NULL,'p'}, + {"quiet", 0,NULL,'q'}, + + {"seed", 1,NULL,'s'}, + + {"verbose", 0,NULL,'v'} +}; + +const char short_options[]="hp:qs:v"; + + +void init(int argc, char *argv[]) +{ + char dir[200]; + dir[0]='\0'; + int x=-1; + char message[100]; + int new_option; + + x=(unsigned)time(NULL); + sprintf(message,"seeding srand with: %d\n",x); + print_message(2,message); + srand(x); + yaffs_set_trace(0); + + + do { + new_option=getopt_long(argc,argv,short_options,long_options,NULL); + if (new_option=='h'){ + printf("mirror_tests help\n"); + printf("arguments:\n"); + printf("\t-p [NUMBER] //sets the print level for mirror_tests.\n"); + printf("\t-v //verbose mode everything is printed\n"); + printf("\t-q //quiet mode nothing is printed.\n"); + printf("\t-s [number] //seeds rand with the number\n"); + + exit(0); + + } else if (new_option=='p'){ + set_print_level(atoi(optarg)); + } else if (new_option=='v'){ + set_print_level(5); + } else if (new_option=='q'){ + set_print_level(-1); + } else if (new_option=='s'){ + srand(atoi(argv[x+1])); + + } else if (new_option==-1){ + + } else if (new_option=='?') { + printf("bad argument\n"); + exit(0); + } + }while(new_option!=-1); +} + +int main(int argc, char *argv[]) { dir_struct *scanned_dir=NULL; int output=0; int break_bool=0; int x=5; + + init(argc,argv); while( 1){ while (break_bool!=1){ //printf("x %d\n",x); @@ -80,7 +144,7 @@ dir_struct * scan_dir(void) struct dirent *dir_data; dir_struct *dir=NULL; dir=malloc(sizeof(dir_struct)); - memset(dir, NULL, sizeof(dir_struct)); + memset(dir, 0, sizeof(dir_struct)); DIR *open_dir=NULL; @@ -95,22 +159,24 @@ dir_struct * scan_dir(void) dir_data=readdir(open_dir); } closedir(open_dir); - node_print_pointers(dir->path_list); + //node_print_pointers(dir->path_list); return dir; } int check_dir(dir_struct *old_dir) { + print_message(3,"scanning new dir\n"); dir_struct *new_dir=scan_dir(); node *new_list=new_dir->path_list; node *old_list=old_dir->path_list; - int exit_loop=0; + int exit_loop=0,error=0; print_message(3,"checking dir\n"); for (;old_list!= NULL;old_list=old_list->next){ - - for (;(new_list=NULL) && (exit_loop !=1);new_list=new_list->next){ - sprintf(message,"comparing %s and %s\n",old_list->string,new_list->string); - print_message(3,message); + //sprintf(message,"new_list=!NULL= %d, exit_loop !=1 = %d\n",(new_list!=NULL),(exit_loop !=1)); + //print_message(3,message); + for (;(new_list!=NULL) && (exit_loop !=1);new_list=new_list->next){ + //sprintf(message,"comparing %s and %s\n",old_list->string,new_list->string); + //print_message(3,message); if (strcmp( new_list->string ,old_list->string)==0){ //files match -now compare the modes and contents of the files. //and set the paths to NULL. @@ -125,6 +191,7 @@ int check_dir(dir_struct *old_dir) //failed to find a matching file sprintf(message,"a file has disappeared: %s\n",old_list->string); print_message(3,message); + error=1; } new_list=new_dir->path_list; @@ -139,17 +206,30 @@ int check_dir(dir_struct *old_dir) old_dir->path_list=NULL; free(old_dir); free(new_dir); + if (error ==1){ + print_message(3,"checking dir failed\n"); + if (get_exit_on_error()==1){ + print_message(3,"exiting_program\n"); + exit(0); + } + } + + else if (error !=1){ + print_message(3,"checking dir passed\n"); + } + return error; } int remount_test(void) { int output; print_message(3,"\nunmounting\n"); - output=umount2("/mnt/y",MNT_FORCE); + output=umount2("/mnt/y",1); check_function(output); print_message(3,"mounting\n"); mount("/dev/mtdblock0","/mnt/y","yaffs2",0,NULL); check_function(output); + return output; } int mkdir_test(void) diff --git a/direct/timothy_tests/linux_tests/linux_test.h b/direct/timothy_tests/linux_tests/linux_test.h index 58e3ccb..472449c 100644 --- a/direct/timothy_tests/linux_tests/linux_test.h +++ b/direct/timothy_tests/linux_tests/linux_test.h @@ -24,7 +24,8 @@ #include #include "lib.h" #include - +#include +#include typedef struct dir_struct_temp{ node *path_list; -- cgit v1.2.3 From 8cbfc1e273db791447911631e80c0495c6171ca8 Mon Sep 17 00:00:00 2001 From: Timothy Manning Date: Fri, 28 Jan 2011 12:56:51 +1300 Subject: yaffs Fixing some minor warnings in direct/timothy_tests/linux_tests Signed-off-by: Timothy Manning --- direct/timothy_tests/linux_tests/README.txt | 10 +++++++++- direct/timothy_tests/linux_tests/lib.c | 13 ++++++++----- direct/timothy_tests/linux_tests/lib.h | 4 ++-- direct/timothy_tests/linux_tests/linux_test.c | 4 ++-- direct/timothy_tests/linux_tests/linux_test.h | 2 +- 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/direct/timothy_tests/linux_tests/README.txt b/direct/timothy_tests/linux_tests/README.txt index 41c2812..0c3fa84 100644 --- a/direct/timothy_tests/linux_tests/README.txt +++ b/direct/timothy_tests/linux_tests/README.txt @@ -11,12 +11,20 @@ $ insmod yaffs2multi.ko $ mkdir /mnt/y $ mount -t yaffs2 /dev/mtdblock0 /mnt/y + + How to change the permissions on the nandsim partition + $ sudo chmod a+wr /mnt/y/ #check the permission change $ touch /mnt/y/test_file How to clean the folder + $ rm -rf /mnt/y -The test must me run in sudo to work + +The test must be run in sudo to work + +$ make +$ sudo ./linux_test diff --git a/direct/timothy_tests/linux_tests/lib.c b/direct/timothy_tests/linux_tests/lib.c index ffc9b05..5f43904 100644 --- a/direct/timothy_tests/linux_tests/lib.c +++ b/direct/timothy_tests/linux_tests/lib.c @@ -15,6 +15,8 @@ static char message[200]; static int PRINT_LEVEL = 3; static int exit_on_error_val =1; +char string[FILE_NAME_LENGTH+1]; + int get_exit_on_error(void) { @@ -31,7 +33,7 @@ node * linked_list_add_node(int pos,node *head_node) node *new_node=NULL; if (pos==HEAD){ new_node=malloc(sizeof(node)); - memset(new_node, NULL, sizeof(node)); + memset(new_node, 0, sizeof(node)); new_node->string=NULL; new_node->next=head_node; return new_node; @@ -64,7 +66,7 @@ int delete_linked_list(node *head_node) char * generate_random_string(unsigned int length) { - char string[length+1]; + unsigned int x; for (x=0;x<(length-1);x++) { @@ -73,6 +75,7 @@ char * generate_random_string(unsigned int length) string[x]='\0'; return string; } + void set_print_level(int new_level) { PRINT_LEVEL=new_level; @@ -84,12 +87,12 @@ int get_print_level(void) void print_message(char print_level,char *message) { if (print_level <= PRINT_LEVEL){ - printf(message); + printf("%s",message); } } -unsigned int random_int(void) +int random_int(void) { - return (random()%4294967295); + return (random()%1000000); } void check_function(int output) diff --git a/direct/timothy_tests/linux_tests/lib.h b/direct/timothy_tests/linux_tests/lib.h index a47a1b8..fa0cfbe 100644 --- a/direct/timothy_tests/linux_tests/lib.h +++ b/direct/timothy_tests/linux_tests/lib.h @@ -18,7 +18,7 @@ #include #include #include -#include "yaffsfs.h" +#include #define NAME_RANGE 10 #define ROOT_PATH "/mnt/y/" @@ -35,7 +35,7 @@ int get_exit_on_error(void); void set_exit_on_error(int val); int delete_linked_list(node *head_node); node * linked_list_add_node(int pos,node *head_node); -unsigned int random_int(void); +int random_int(void); char * generate_random_string(unsigned int length); void get_error_linux(void); void check_function(int output); diff --git a/direct/timothy_tests/linux_tests/linux_test.c b/direct/timothy_tests/linux_tests/linux_test.c index 88732ad..429e74f 100644 --- a/direct/timothy_tests/linux_tests/linux_test.c +++ b/direct/timothy_tests/linux_tests/linux_test.c @@ -47,7 +47,7 @@ void init(int argc, char *argv[]) sprintf(message,"seeding srand with: %d\n",x); print_message(2,message); srand(x); - yaffs_set_trace(0); + do { @@ -155,7 +155,7 @@ dir_struct * scan_dir(void) dir->path_list->string=malloc(strlen(dir_data->d_name)+1); strcpy(dir->path_list->string,dir_data->d_name); sprintf(message,"opened file: %s\n",dir->path_list->string); - print_message(3,message); + print_message(5,message); dir_data=readdir(open_dir); } closedir(open_dir); diff --git a/direct/timothy_tests/linux_tests/linux_test.h b/direct/timothy_tests/linux_tests/linux_test.h index 472449c..97a6348 100644 --- a/direct/timothy_tests/linux_tests/linux_test.h +++ b/direct/timothy_tests/linux_tests/linux_test.h @@ -16,8 +16,8 @@ #ifndef __linux_test_h__ #define __linux_test_h__ #include +#include #include -#include "yaffsfs.h" #include #include #include -- cgit v1.2.3 From 9dd7bc3106f6b5b677dd7ffc008518dfcd155726 Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Fri, 5 Aug 2011 13:05:02 +1200 Subject: Add summary code to python tester Makefile Signed-off-by: Charles Manning --- direct/python/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/direct/python/Makefile b/direct/python/Makefile index 35f14fb..e0b10e7 100644 --- a/direct/python/Makefile +++ b/direct/python/Makefile @@ -37,6 +37,7 @@ COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o\ yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ yaffs_checkptrw.o yaffs_qsort.o\ yaffs_nameval.o \ + yaffs_summary.o \ yaffs_allocator.o \ yaffs_norif1.o ynorsim.o \ yaffs_bitmap.o \ @@ -53,6 +54,7 @@ YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscomp yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ yaffs_checkptrw.h yaffs_checkptrw.c \ + yaffs_summary.c yaffs_summary.h \ yaffs_nameval.c yaffs_nameval.h yaffs_attribs.h \ yaffs_trace.h \ yaffs_allocator.c yaffs_allocator.h \ -- cgit v1.2.3 From ffb9a41a909210075adf0c529becca54109b2d80 Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Fri, 5 Aug 2011 13:06:49 +1200 Subject: Add yaffs_utime and related code Some changes to white spaces came along for the ride... Signed-off-by: Charles Manning --- direct/basic-test/dtest.c | 1119 ++++++++++++++++++++------------------ direct/basic-test/yaffs_osglue.c | 2 +- direct/python/examples.py | 7 +- direct/yaffsfs.c | 243 ++++++--- direct/yaffsfs.h | 25 +- 5 files changed, 770 insertions(+), 626 deletions(-) diff --git a/direct/basic-test/dtest.c b/direct/basic-test/dtest.c index 97e8fbe..fa48158 100644 --- a/direct/basic-test/dtest.c +++ b/direct/basic-test/dtest.c @@ -1,5 +1,5 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. + * YAFFS: Yet another FFS. A NAND-flash specific file system. * * Copyright (C) 2002-2011 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering @@ -36,7 +36,7 @@ void copy_in_a_file(const char *yaffsName,const char *inName) int ni,no; inh = open(inName,O_RDONLY); outh = yaffs_open(yaffsName, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + while((ni = read(inh,buffer,100)) > 0) { no = yaffs_write(outh,buffer,ni); @@ -44,9 +44,9 @@ void copy_in_a_file(const char *yaffsName,const char *inName) { printf("problem writing yaffs file\n"); } - + } - + yaffs_close(outh); close(inh); } @@ -58,19 +58,19 @@ void make_a_file(const char *yaffsName,char bval,int sizeOfFile) 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); } @@ -83,7 +83,7 @@ void make_pattern_file(char *fn,int size) outh = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); yaffs_lseek(outh,size-1,SEEK_SET); yaffs_write(outh,"A",1); - + for(i = 0; i < size; i+=256) { marker = ~i; @@ -91,7 +91,7 @@ void make_pattern_file(char *fn,int size) yaffs_write(outh,&marker,sizeof(marker)); } yaffs_close(outh); - + } int check_pattern_file(char *fn) @@ -101,10 +101,10 @@ int check_pattern_file(char *fn) int i; int size; int ok = 1; - + h = yaffs_open(fn, O_RDWR,0); size = yaffs_lseek(h,0,SEEK_END); - + for(i = 0; i < size; i+=256) { yaffs_lseek(h,i,SEEK_SET); @@ -130,16 +130,16 @@ int dump_file_data(char *fn) int i = 0; int ok = 1; unsigned char b; - + h = yaffs_open(fn, O_RDWR,0); - + printf("%s\n",fn); while(yaffs_read(h,&b,1)> 0) { printf("%02x",b); i++; - if(i > 32) + if(i > 32) { printf("\n"); i = 0;; @@ -157,7 +157,7 @@ void dump_file(const char *fn) int i; int size; int h; - + h = yaffs_open(fn,O_RDONLY,0); if(h < 0) { @@ -169,7 +169,7 @@ void dump_file(const char *fn) printf("*****\nDump file %s size %d\n",fn,size); for(i = 0; i < size; i++) { - + } } } @@ -183,7 +183,7 @@ void create_file_of_size(const char *fn,int syze) char xx[200]; h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + while (syze > 0) { sprintf(xx,"%s %8d",fn,iteration); @@ -203,23 +203,23 @@ void verify_file_of_size(const char *fn,int syze) { int h; int result; - + char xx[200]; char yy[200]; int l; - + int iterations = (syze + strlen(fn) -1)/ strlen(fn); - + h = yaffs_open(fn, O_RDONLY, S_IREAD | S_IWRITE); - + while (iterations > 0) { sprintf(xx,"%s %8d",fn,iterations); l = strlen(xx); - + result = yaffs_read(h,yy,l); yy[l] = 0; - + if(strcmp(xx,yy)){ printf("=====>>>>> verification of file %s failed near position %lld\n",fn,(long long)yaffs_lseek(h,0,SEEK_CUR)); } @@ -231,20 +231,20 @@ void verify_file_of_size(const char *fn,int syze) void create_resized_file_of_size(const char *fn,int syze1,int reSyze, int syze2) { int h; - + int iterations; - + h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + iterations = (syze1 + strlen(fn) -1)/ strlen(fn); while (iterations > 0) { yaffs_write(h,fn,strlen(fn)); iterations--; } - + yaffs_ftruncate(h,reSyze); - + yaffs_lseek(h,0,SEEK_SET); iterations = (syze2 + strlen(fn) -1)/ strlen(fn); while (iterations > 0) @@ -252,7 +252,7 @@ void create_resized_file_of_size(const char *fn,int syze1,int reSyze, int syze2) yaffs_write(h,fn,strlen(fn)); iterations--; } - + yaffs_close (h); } @@ -270,28 +270,28 @@ void do_some_file_stuff(const char *path) yaffs_unlink(fn); sprintf(fn,"%s/%s",path,"f2"); - + create_resized_file_of_size(fn,10000,3000,4000); } void yaffs_backward_scan_test(const char *path) { char fn[100]; - - yaffs_start_up(); - + + yaffs_start_up(); + yaffs_mount(path); - + do_some_file_stuff(path); - + sprintf(fn,"%s/ddd",path); - + yaffs_mkdir(fn,0); - + do_some_file_stuff(fn); - + yaffs_unmount(path); - + yaffs_mount(path); } @@ -319,16 +319,16 @@ void yaffs_device_flush_test(const char *path) char fn[100]; int h; int i; - - yaffs_start_up(); - + + yaffs_start_up(); + yaffs_mount(path); - + do_some_file_stuff(path); - + // Open and add some data to a few files for(i = 0; i < 10; i++) { - + sprintf(fn,"%s/ff%d",path,i); h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IWRITE | S_IREAD); @@ -336,7 +336,7 @@ void yaffs_device_flush_test(const char *path) yaffs_write(h,xxzz,2000); } yaffs_unmount(path); - + yaffs_mount(path); } @@ -346,9 +346,9 @@ void short_scan_test(const char *path, int fsize, int niterations) { int i; char fn[100]; - + sprintf(fn,"%s/%s",path,"f1"); - + yaffs_start_up(); for(i = 0; i < niterations; i++) { @@ -369,13 +369,13 @@ void scan_pattern_test(const char *path, int fsize, int niterations) int j; char fn[3][100]; int result; - + sprintf(fn[0],"%s/%s",path,"f0"); sprintf(fn[1],"%s/%s",path,"f1"); sprintf(fn[2],"%s/%s",path,"f2"); - + yaffs_start_up(); - + for(i = 0; i < niterations; i++) { printf("\n*****************\nIteration %d\n",i); @@ -386,7 +386,7 @@ void scan_pattern_test(const char *path, int fsize, int niterations) { result = dump_file_data(fn[j]); result = check_pattern_file(fn[j]); - make_pattern_file(fn[j],fsize); + make_pattern_file(fn[j],fsize); result = dump_file_data(fn[j]); result = check_pattern_file(fn[j]); } @@ -401,17 +401,17 @@ void fill_disk(const char *path,int nfiles) int result; int f; - static char xx[600]; + static char xx[600]; char str[50]; - + for(n = 0; n < nfiles; n++) { sprintf(str,"%s/%d",path,n); - + h = yaffs_open(str, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE); - + printf("writing file %s handle %d ",str, h); - + while ((result = yaffs_write(h,xx,600)) == 600) { f = yaffs_freespace(path); @@ -426,12 +426,12 @@ void fill_disk_and_delete(const char *path, int nfiles, int ncycles) int i,j; char str[50]; int result; - + for(i = 0; i < ncycles; i++) { printf("@@@@@@@@@@@@@@ cycle %d\n",i); fill_disk(path,nfiles); - + for(j = 0; j < nfiles; j++) { sprintf(str,"%s/%d",path,j); @@ -448,9 +448,9 @@ void fill_files(const char *path,int flags, int maxIterations,int siz) int j; char str[50]; int h; - + i = 0; - + do{ sprintf(str,"%s/%d",path,i); h = yaffs_open(str, O_CREAT | O_TRUNC | O_RDWR,S_IREAD | S_IWRITE); @@ -462,14 +462,14 @@ void fill_files(const char *path,int flags, int maxIterations,int siz) yaffs_write(h,str,1); } } - + if( flags & 1) { yaffs_unlink(str); } i++; } while(h >= 0 && i < maxIterations); - + if(flags & 2) { i = 0; @@ -486,9 +486,9 @@ void leave_unlinked_file(const char *path,int maxIterations,int siz) int i; char str[50]; int h; - + i = 0; - + do{ sprintf(str,"%s/%d",path,i); printf("create %s\n",str); @@ -499,7 +499,7 @@ void leave_unlinked_file(const char *path,int maxIterations,int siz) } i++; } while(h < 0 && i < maxIterations); - + if(h >= 0) { for(i = 0; i < siz; i++) @@ -507,7 +507,7 @@ void leave_unlinked_file(const char *path,int maxIterations,int siz) yaffs_write(h,str,1); } } - + printf("Leaving file %s open\n",str); } @@ -518,9 +518,9 @@ void dumpDirFollow(const char *dname) yaffs_dirent *de; struct yaffs_stat s; char str[100]; - + d = yaffs_opendir(dname); - + if(!d) { printf("opendir failed\n"); @@ -530,9 +530,9 @@ void dumpDirFollow(const char *dname) while((de = yaffs_readdir(d)) != NULL) { sprintf(str,"%s/%s",dname,de->d_name); - + yaffs_lstat(str,&s); - + printf("%s ino %d length %d mode %X ",de->d_name,(int)s.st_ino,(int)s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { @@ -542,18 +542,18 @@ void dumpDirFollow(const char *dname) if(yaffs_readlink(str,str,100) < 0) printf("no alias"); else - printf("\"%s\"",str); + printf("\"%s\"",str); break; default: printf("unknown"); break; } - - printf("\n"); + + printf("\n"); } - + yaffs_closedir(d); } printf("\n"); - + printf("Free space in %s is %d\n\n",dname,(int)yaffs_freespace(dname)); } @@ -565,9 +565,9 @@ void dump_directory_tree_worker(const char *dname,int recursive) yaffs_dirent *de; struct yaffs_stat s; char str[1000]; - + d = yaffs_opendir(dname); - + if(!d) { printf("opendir failed\n"); @@ -577,9 +577,9 @@ void dump_directory_tree_worker(const char *dname,int recursive) while((de = yaffs_readdir(d)) != NULL) { sprintf(str,"%s/%s",dname,de->d_name); - + yaffs_lstat(str,&s); - + printf("%s inode %d obj %x length %d mode %X ",str,s.st_ino,de->d_dont_use,(int)s.st_size,s.st_mode); switch(s.st_mode & S_IFMT) { @@ -589,18 +589,18 @@ void dump_directory_tree_worker(const char *dname,int recursive) if(yaffs_readlink(str,str,100) < 0) printf("no alias"); else - printf("\"%s\"",str); + printf("\"%s\"",str); break; default: printf("unknown"); break; } - + printf("\n"); if((s.st_mode & S_IFMT) == S_IFDIR && recursive) dump_directory_tree_worker(str,1); - + } - + yaffs_closedir(d); } @@ -623,11 +623,11 @@ void dumpDir(const char *dname) static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expectedResult) { int fd; - + if(yaffs_chmod(path,tmode)< 0) printf("chmod failed\n"); - + fd = yaffs_open(path,tflags,0); - + if((fd >= 0) != (expectedResult > 0)) { printf("Permissions check %x %x %d failed\n",tmode,tflags,expectedResult); @@ -636,11 +636,11 @@ static void PermissionsCheck(const char *path, mode_t tmode, int tflags,int expe { printf("Permissions check %x %x %d OK\n",tmode,tflags,expectedResult); } - - + + yaffs_close(fd); - - + + } int long_test(int argc, char *argv[]) @@ -649,20 +649,20 @@ int long_test(int argc, char *argv[]) int f; int r; char buffer[20]; - + char str[100]; - + int h; mode_t temp_mode; struct yaffs_stat ystat; - + yaffs_start_up(); - + yaffs_mount("/boot"); yaffs_mount("/data"); yaffs_mount("/flash"); yaffs_mount("/ram"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /data\n"); @@ -672,36 +672,36 @@ int long_test(int argc, char *argv[]) //leave_unlinked_file("/flash",20000,0); //leave_unlinked_file("/data",20000,0); - + leave_unlinked_file("/ram",20,0); - + f = yaffs_open("/boot/b1", O_RDONLY,0); - + printf("open /boot/b1 readonly, f=%d\n",f); - + f = yaffs_open("/boot/b1", O_CREAT,S_IREAD | S_IWRITE); - + printf("open /boot/b1 O_CREAT, f=%d\n",f); - - + + r = yaffs_write(f,"hello",1); printf("write %d attempted to write to a read-only file\n",r); - + r = yaffs_close(f); - + printf("close %d\n",r); f = yaffs_open("/boot/b1", O_RDWR,0); - + printf("open /boot/b1 O_RDWR,f=%d\n",f); - - + + r = yaffs_write(f,"hello",2); printf("write %d attempted to write to a writeable file\n",r); r = yaffs_write(f,"world",3); printf("write %d attempted to write to a writeable file\n",r); - + r= yaffs_lseek(f,0,SEEK_END); printf("seek end %d\n",r); memset(buffer,0,20); @@ -718,75 +718,75 @@ int long_test(int argc, char *argv[]) // Check values reading at end. // A read past end of file should return 0 for 0 bytes read. - + r= yaffs_lseek(f,0,SEEK_END); r = yaffs_read(f,buffer,10); - printf("read at end returned %d\n",r); + printf("read at end returned %d\n",r); r= yaffs_lseek(f,500,SEEK_END); r = yaffs_read(f,buffer,10); - printf("read past end returned %d\n",r); - + printf("read past end returned %d\n",r); + r = yaffs_close(f); - + printf("close %d\n",r); - + copy_in_a_file("/boot/yyfile","xxx"); - + // Create a file with a long name - + copy_in_a_file("/boot/file with a long name","xxx"); - - + + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check stat r = yaffs_lstat("/boot/file with a long name",&ystat); - + // Check rename - + r = yaffs_rename("/boot/file with a long name","/boot/r1"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); - + // Check unlink r = yaffs_unlink("/boot/r1"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); // Check mkdir - + r = yaffs_mkdir("/boot/directory1",0); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); - // add a file to the directory + // add a file to the directory copy_in_a_file("/boot/directory1/file with a long name","xxx"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); - + // Attempt to delete directory (should fail) - + r = yaffs_rmdir("/boot/directory1"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); dumpDir("/boot/directory1"); - + // Delete file first, then rmdir should work r = yaffs_unlink("/boot/directory1/file with a long name"); r = yaffs_rmdir("/boot/directory1"); - - + + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot/directory1\n"); @@ -794,19 +794,19 @@ int long_test(int argc, char *argv[]) #if 0 fill_disk_and_delete("/boot",20,20); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); #endif yaffs_symlink("yyfile","/boot/slink"); - + yaffs_readlink("/boot/slink",str,100); printf("symlink alias is %s\n",str); - - - - + + + + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); printf("\nDirectory look-up of /boot (using stat instead of lstat)\n"); @@ -815,30 +815,30 @@ int long_test(int argc, char *argv[]) dumpDir("/boot/directory1"); h = yaffs_open("/boot/slink",O_RDWR,0); - + printf("file length is %d\n",(int)yaffs_lseek(h,0,SEEK_END)); - + yaffs_close(h); - + yaffs_unlink("/boot/slink"); - + printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); - + // Check chmod - + yaffs_lstat("/boot/yyfile",&ystat); temp_mode = ystat.st_mode; - + yaffs_chmod("/boot/yyfile",0x55555); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); - + yaffs_chmod("/boot/yyfile",temp_mode); printf("\nDirectory look-up of /boot\n"); dumpDir("/boot"); - + // Permission checks... PermissionsCheck("/boot/yyfile",0, O_WRONLY,0); PermissionsCheck("/boot/yyfile",0, O_RDONLY,0); @@ -851,44 +851,44 @@ int long_test(int argc, char *argv[]) PermissionsCheck("/boot/yyfile",S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDONLY,0); PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDWR,0); - + PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_WRONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDONLY,1); PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDWR,1); yaffs_chmod("/boot/yyfile",temp_mode); - + //create a zero-length file and unlink it (test for scan bug) - + h = yaffs_open("/boot/zlf",O_CREAT | O_TRUNC | O_RDWR,0); yaffs_close(h); - + yaffs_unlink("/boot/zlf"); - - + + yaffs_dump_dev("/boot"); - + fill_disk_and_delete("/boot",20,20); - + yaffs_dump_dev("/boot"); - + fill_files("/boot",1,10000,0); fill_files("/boot",1,10000,5000); fill_files("/boot",2,10000,0); fill_files("/boot",2,10000,5000); - + leave_unlinked_file("/data",20000,0); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); leave_unlinked_file("/data",20000,5000); - + yaffs_dump_dev("/boot"); yaffs_dump_dev("/data"); - - - + + + return 0; } @@ -905,26 +905,26 @@ int huge_directory_test_on_path(char *path) int total = 0; int lastTotal = 0; - + char str[100]; - + yaffs_start_up(); - + yaffs_mount(path); - + // Create a large number of files - + for(i = 0; i < 2000; i++) { sprintf(str,"%s/%d",path,i); - + f = yaffs_open(str,O_CREAT,S_IREAD | S_IWRITE); yaffs_close(f); } - - - + + + d = yaffs_opendir(path); i = 0; if (d) { @@ -943,10 +943,10 @@ int huge_directory_test_on_path(char *path) break; } } - + yaffs_closedir(d); } - + return 0; } @@ -962,34 +962,34 @@ void rename_over_test(const char *mountpt) char a[100]; char b[100]; char c[100]; - + sprintf(a,"%s/a",mountpt); sprintf(b,"%s/b",mountpt); sprintf(c,"%s/c",mountpt); - + yaffs_start_up(); - + yaffs_mount(mountpt); - + printf("Existing files\n"); dumpDirFollow(mountpt); - - - + + + i = yaffs_open(c,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); printf("File c handle is %d\n",i); yaffs_close(i); - i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); + i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); yaffs_close(i); i = yaffs_open(b,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); yaffs_close(i); yaffs_rename(a,b); // rename over yaffs_rename(b,a); // rename back again (not renaimng over) yaffs_rename(a,b); // rename back again (not renaimng over) - - + + yaffs_unmount(mountpt); - + } @@ -1000,46 +1000,46 @@ int resize_stress_test(const char *path) int r; char aname[100]; char bname[100]; - + char abuffer[1000]; char bbuffer[1000]; - + yaffs_start_up(); - + yaffs_mount(path); - + sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); - + memset(abuffer,'a',1000); memset(bbuffer,'b',1000); - + a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + printf(" %s %d %s %d\n",aname,a,bname,b); - + x = 0; - + for(j = 0; j < 100; j++) { yaffs_lseek(a,0,SEEK_END); - + for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); - + if(x & 0x16) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); - + syz -= 500; if(syz < 0) syz = 0; yaffs_ftruncate(a,syz); - + } else { @@ -1048,12 +1048,12 @@ int resize_stress_test(const char *path) r = yaffs_write(a,abuffer,1000); } x++; - + } } - + return 0; - + } @@ -1062,16 +1062,16 @@ int overwrite_test(const char *path) char aname[100]; char bname[100]; int i; - int j; + int j; int a; int b; yaffs_start_up(); - + yaffs_mount(path); - + sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); - + b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); for(j= 0; j < 500; j++){ yaffs_write(b,bname,100); @@ -1080,32 +1080,32 @@ int overwrite_test(const char *path) yaffs_write(a,&a,sizeof(a)); yaffs_close(a); } - + return 0; - + } int root_perm_remount(const char *path) { struct yaffs_stat s; - + yaffs_start_up(); - + yaffs_mount(path); - + yaffs_lstat(path,&s); printf("root perms after mount %x\n",s.st_mode); - + yaffs_chmod(path, 0777); yaffs_lstat(path,&s); printf("root perms after setting to 0777 is %x\n",s.st_mode); - + yaffs_unmount(path); - + return 0; - + } @@ -1116,54 +1116,54 @@ int resize_stress_test_no_grow_complex(const char *path,int iters) int r; char aname[100]; char bname[100]; - + char abuffer[1000]; char bbuffer[1000]; - + yaffs_start_up(); - + yaffs_mount(path); - + sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); - + memset(abuffer,'a',1000); memset(bbuffer,'b',1000); - + a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + printf(" %s %d %s %d\n",aname,a,bname,b); - + x = 0; - + for(j = 0; j < iters; j++) { yaffs_lseek(a,0,SEEK_END); - + for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); - + if(!(x%20)) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); - + while(syz > 4000) { - + syz -= 2050; if(syz < 0) syz = 0; yaffs_ftruncate(a,syz); syz = yaffs_lseek(a,0,SEEK_END); printf("shrink to %d\n",syz); } - - + + } else { @@ -1172,16 +1172,16 @@ int resize_stress_test_no_grow_complex(const char *path,int iters) r = yaffs_write(a,abuffer,1000); } x++; - - + + } - + printf("file size is %lld\n",(long long)yaffs_lseek(a,0,SEEK_END)); } - + return 0; - + } int resize_stress_test_no_grow(const char *path,int iters) @@ -1191,53 +1191,53 @@ int resize_stress_test_no_grow(const char *path,int iters) int r; char aname[100]; char bname[100]; - + char abuffer[1000]; char bbuffer[1000]; - + yaffs_start_up(); - + yaffs_mount(path); - + sprintf(aname,"%s%s",path,"/a"); sprintf(bname,"%s%s",path,"/b"); - + memset(abuffer,'a',1000); memset(bbuffer,'b',1000); - + a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + printf(" %s %d %s %d\n",aname,a,bname,b); - + x = 0; - + for(j = 0; j < iters; j++) { yaffs_lseek(a,0,SEEK_END); - + for(i = 0; i <20000; i++) { //r = yaffs_lseek(b,i,SEEK_SET); //r = yaffs_write(b,bbuffer,1000); - + if(!(x%20)) { // shrink int syz = yaffs_lseek(a,0,SEEK_END); - + while(syz > 4000) { - + syz -= 2050; if(syz < 0) syz = 0; yaffs_ftruncate(a,syz); syz = yaffs_lseek(a,0,SEEK_END); printf("shrink to %d\n",syz); } - - + + } else { @@ -1246,34 +1246,34 @@ int resize_stress_test_no_grow(const char *path,int iters) r = yaffs_write(a,abuffer,1000); } x++; - - + + } printf("file size is %lld\n",(long long)yaffs_lseek(a,0,SEEK_END)); } - + return 0; - + } int directory_rename_test(void) { int r; yaffs_start_up(); - + yaffs_mount("/ram"); yaffs_mkdir("/ram/a",0); yaffs_mkdir("/ram/a/b",0); yaffs_mkdir("/ram/c",0); - + printf("\nDirectory look-up of /ram\n"); dumpDir("/ram"); dumpDir("/ram/a"); dumpDir("/ram/a/b"); printf("Do rename (should fail)\n"); - + r = yaffs_rename("/ram/a","/ram/a/b/d"); printf("\nDirectory look-up of /ram\n"); dumpDir("/ram"); @@ -1281,16 +1281,16 @@ int directory_rename_test(void) dumpDir("/ram/a/b"); printf("Do rename (should not fail)\n"); - + r = yaffs_rename("/ram/c","/ram/a/b/d"); printf("\nDirectory look-up of /ram\n"); dumpDir("/ram"); dumpDir("/ram/a"); dumpDir("/ram/a/b"); - - + + return 1; - + } int cache_read_test(void) @@ -1299,11 +1299,11 @@ int cache_read_test(void) int i; int sizeOfFiles = 500000; char buffer[100]; - + yaffs_start_up(); - + yaffs_mount("/boot"); - + make_a_file("/boot/a",'a',sizeOfFiles); make_a_file("/boot/b",'b',sizeOfFiles); @@ -1319,11 +1319,11 @@ int cache_read_test(void) yaffs_read(b,buffer,i); yaffs_write(c,buffer,i); } while(sizeOfFiles > 0); - - - + + + return 1; - + } int cache_bypass_bug_test(void) @@ -1331,46 +1331,46 @@ int cache_bypass_bug_test(void) // This test reporoduces a bug whereby YAFFS caching *was* buypassed // resulting in erroneous reads after writes. // This bug has been fixed. - + int a; char buffer1[1000]; char buffer2[1000]; - + memset(buffer1,0,sizeof(buffer1)); memset(buffer2,0,sizeof(buffer2)); - + yaffs_start_up(); - + 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); + 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); + yaffs_read(a,buffer1,30); // Read a page size sequence from the file. yaffs_lseek(a,0,SEEK_SET); - yaffs_read(a,buffer2,512); - + 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; } @@ -1378,13 +1378,13 @@ int cache_bypass_bug_test(void) int free_space_check(void) { int f; - + yaffs_start_up(); yaffs_mount("/boot"); fill_disk("/boot/",2); f = yaffs_freespace("/boot"); - - printf("%d free when disk full\n",f); + + printf("%d free when disk full\n",f); return 1; } @@ -1401,21 +1401,21 @@ int truncate_test(void) yaffs_mount("/boot"); yaffs_unlink("/boot/trunctest"); - + a = yaffs_open("/boot/trunctest", O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + yaffs_write(a,"abcdefghijklmnopqrstuvwzyz",26); - + yaffs_ftruncate(a,3); l= yaffs_lseek(a,0,SEEK_END); - + printf("truncated length is %d\n",l); yaffs_lseek(a,5,SEEK_SET); yaffs_write(a,"1",1); yaffs_lseek(a,0,SEEK_SET); - + r = yaffs_read(a,y,10); printf("read %d bytes:",r); @@ -1436,14 +1436,14 @@ void fill_disk_test(const char *mountpt) { int i; yaffs_start_up(); - + for(i = 0; i < 5; i++) { yaffs_mount(mountpt); fill_disk_and_delete(mountpt,100,i+1); yaffs_unmount(mountpt); } - + } @@ -1451,14 +1451,14 @@ void fill_files_test(const char *mountpt) { int i; yaffs_start_up(); - + for(i = 0; i < 5; i++) { yaffs_mount(mountpt); fill_files(mountpt,2,3,100); yaffs_unmount(mountpt); } - + } void fill_empty_files_test(const char *mountpt) @@ -1467,7 +1467,7 @@ void fill_empty_files_test(const char *mountpt) yaffs_start_up(); char name[100]; int result = 0; - + int d,f; for(i = 0; i < 5; i++) @@ -1477,7 +1477,7 @@ void fill_empty_files_test(const char *mountpt) sprintf(name,"%s/%d",mountpt,d); result= yaffs_mkdir(name,0); printf("creating directory %s result %d\n",name,result); - + for(f = 0; result >= 0 && f < 100; f++){ sprintf(name,"%s/%d/%d",mountpt,d,f); result= yaffs_open(name,O_CREAT, 0); @@ -1487,7 +1487,7 @@ void fill_empty_files_test(const char *mountpt) } yaffs_unmount(mountpt); } - + } void long_name_test(const char *mountpt) @@ -1497,44 +1497,44 @@ void long_name_test(const char *mountpt) char fullName[1000]; char name[300]; int result = 0; - + int f; - + // Make a 256 byte name memset(name,0,sizeof(name)); for(i = 0; i < 256; i++) name[i] = '0' + i % 10; - + sprintf(fullName,"%s/%s",mountpt,name); for(i = 0; i < 1; i++) { yaffs_mount(mountpt); - + printf("Files at start\n"); dumpDir(mountpt); - + printf("Creating file %s\n",fullName); - + f = yaffs_open(fullName,O_CREAT | O_RDWR,0); yaffs_close(f); - + printf("Result %d\n",f); - + printf("Files\n"); dumpDir(mountpt); - + printf("Deleting %s\n",fullName); result = yaffs_unlink(fullName); printf("Result %d\n",result); - + printf("Files\n"); - + dumpDir(mountpt); - + yaffs_unmount(mountpt); } - + } @@ -1543,34 +1543,34 @@ void lookup_test(const char *mountpt) int i; int h; char a[100]; - + yaffs_DIR *d; yaffs_dirent *de; yaffs_start_up(); - + yaffs_mount(mountpt); - + d = yaffs_opendir(mountpt); - + if(!d) { printf("opendir failed\n"); } else { - + for(i = 0; (de = yaffs_readdir(d)) != NULL; i++) { printf("unlinking %s\n",de->d_name); yaffs_unlink(de->d_name); } - + printf("%d files deleted\n",i); } - - + + for(i = 0; i < 2000; i++){ sprintf(a,"%s/%d",mountpt,i); h = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, 0); @@ -1581,23 +1581,23 @@ void lookup_test(const char *mountpt) for(i = 0; (de = yaffs_readdir(d)) != NULL; i++) { printf("%d %s\n",i,de->d_name); - } - + } + printf("%d files listed\n\n\n",i); - + yaffs_rewinddir(d); yaffs_readdir(d); yaffs_readdir(d); yaffs_readdir(d); - + for(i = 0; i < 2000; i++){ sprintf(a,"%s/%d",mountpt,i); yaffs_unlink(a); } - - + + yaffs_unmount(mountpt); - + } void link_test0(const char *mountpt) @@ -1605,12 +1605,12 @@ void link_test0(const char *mountpt) char namea[300]; char nameb[300]; int result = 0; - + yaffs_start_up(); yaffs_mount(mountpt); - - + + sprintf(namea,"%s/a",mountpt); sprintf(nameb,"%s/b",mountpt); @@ -1624,7 +1624,7 @@ void link_test0(const char *mountpt) yaffs_unlink(nameb); printf("b unlinked\n"); dumpDir(mountpt); - + result = yaffs_open(namea,O_CREAT| O_RDWR,0666); yaffs_close(result); printf("a created\n"); @@ -1655,18 +1655,18 @@ void link_test1(const char *mountpt) sprintf(a,"%s/aaa",mountpt); sprintf(b,"%s/bbb",mountpt); sprintf(c,"%s/ccc",mountpt); - + yaffs_start_up(); - + yaffs_mount(mountpt); - - + + h = yaffs_open(a, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); for(i = 0; i < 100; i++) yaffs_write(h,a,100); - + yaffs_close(h); - + yaffs_unlink(b); yaffs_unlink(c); yaffs_link(a,b); @@ -1674,12 +1674,12 @@ void link_test1(const char *mountpt) yaffs_unlink(b); yaffs_unlink(c); yaffs_unlink(a); - - + + yaffs_unmount(mountpt); yaffs_mount(mountpt); - - printf("link test done\n"); + + printf("link test done\n"); } void handle_test(const char *mountpt) @@ -1690,9 +1690,9 @@ void handle_test(const char *mountpt) char a[100]; sprintf(a,"%s/aaa",mountpt); - + yaffs_start_up(); - + yaffs_mount(mountpt); for(cycle = 0; cycle < 5; cycle++){ @@ -1703,13 +1703,13 @@ void handle_test(const char *mountpt) printf("%d handle %d\n",i,h); i++; } while(h >= 0); - + while(i >= -1) { yaffs_close(i); i--; } } - + yaffs_unmount(mountpt); } @@ -1718,41 +1718,41 @@ void freespace_test(const char *mountpt) int i; int h; char a[100]; - + int f0; int f1; int f2; int f3; sprintf(a,"%s/aaa",mountpt); - + yaffs_start_up(); - + yaffs_mount(mountpt); - + f0 = yaffs_freespace(mountpt); - + h = yaffs_open(a, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + for(i = 0; i < 100; i++) yaffs_write(h,a,100); - + yaffs_close(h); - + f1 = yaffs_freespace(mountpt); - + yaffs_unlink(a); - + f2 = yaffs_freespace(mountpt); - - + + yaffs_unmount(mountpt); yaffs_mount(mountpt); - + f3 = yaffs_freespace(mountpt); - + printf("%d\n%d\n%d\n%d\n",f0, f1,f2,f3); - - + + } void simple_rw_test(const char *mountpt) @@ -1760,49 +1760,49 @@ void simple_rw_test(const char *mountpt) int i; int h; char a[100]; - + int x; int result; sprintf(a,"%s/aaa",mountpt); - + yaffs_start_up(); - + yaffs_mount(mountpt); - + yaffs_unlink(a); - + h = yaffs_open(a,O_CREAT| O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + for(i = 100000;i < 200000; i++){ result = yaffs_write(h,&i,sizeof(i)); - + if(result != 4) { printf("write error\n"); exit(1); } } - + //yaffs_close(h); - + // h = yaffs_open(a,O_RDWR, S_IREAD | S_IWRITE); - - + + yaffs_lseek(h,0,SEEK_SET); - + for(i = 100000; i < 200000; i++){ result = yaffs_read(h,&x,sizeof(x)); - + if(result != 4 || x != i){ printf("read error %d %x %x\n",i,result,x); } } - + printf("Simple rw test passed\n"); - - - + + + } @@ -1810,30 +1810,30 @@ void scan_deleted_files_test(const char *mountpt) { char fn[100]; char sub[100]; - + const char *p; - + int i; int j; int k; int h; - + sprintf(sub,"%s/sdir",mountpt); yaffs_start_up(); - + for(j = 0; j < 10; j++) { printf("\n\n>>>>>>> Run %d <<<<<<<<<<<<<\n\n",j); yaffs_mount(mountpt); yaffs_mkdir(sub,0); - - + + p = (j & 0) ? mountpt: sub; - + for(i = 0; i < 100; i++) { - sprintf(fn,"%s/%d",p,i); - + sprintf(fn,"%s/%d",p,i); + if(i & 1) { h = yaffs_open(fn,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); @@ -1844,22 +1844,22 @@ void scan_deleted_files_test(const char *mountpt) else yaffs_mkdir(fn,0); } - + for(i = 0; i < 10; i++) { - sprintf(fn,"%s/%d",p,i); - if(i & 1) + sprintf(fn,"%s/%d",p,i); + if(i & 1) yaffs_unlink(fn); else yaffs_rmdir(fn); - + } - + yaffs_unmount(mountpt); } - - - + + + } @@ -1877,35 +1877,35 @@ void write_200k_file(const char *fn, const char *fdel, const char *fdel1) int h1; int i; int offs; - + h1 = yaffs_open(fn, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + for(i = 0; i < 100000; i+= 10000) { write_10k(h1); } - + offs = yaffs_lseek(h1,0,SEEK_CUR); if( offs != 100000) { printf("Could not write file\n"); } - + yaffs_unlink(fdel); for(i = 0; i < 100000; i+= 10000) { write_10k(h1); } - + offs = yaffs_lseek(h1,0,SEEK_CUR); if( offs != 200000) { printf("Could not write file\n"); } - + yaffs_close(h1); yaffs_unlink(fdel1); - + } @@ -1916,9 +1916,9 @@ void verify_200k_file(const char *fn) char x[11]; const char *s="0123456789"; int errCount = 0; - + h1 = yaffs_open(fn, O_RDONLY, 0); - + for(i = 0; i < 200000 && errCount < 10; i+= 10) { yaffs_read(h1,x,10); @@ -1930,9 +1930,9 @@ void verify_200k_file(const char *fn) } if(errCount >= 10) printf("Too many errors... aborted\n"); - - yaffs_close(h1); - + + yaffs_close(h1); + } @@ -1942,23 +1942,23 @@ void check_resize_gc_bug(const char *mountpt) char a[30]; char b[30]; char c[30]; - + int i; - + sprintf(a,"%s/a",mountpt); sprintf(b,"%s/b",mountpt); sprintf(c,"%s/c",mountpt); - - - + + + yaffs_start_up(); yaffs_mount(mountpt); yaffs_unlink(a); yaffs_unlink(b); - + for(i = 0; i < 50; i++) - { + { printf("A\n");write_200k_file(a,"",c); printf("B\n");verify_200k_file(a); printf("C\n");write_200k_file(b,a,c); @@ -1968,7 +1968,7 @@ void check_resize_gc_bug(const char *mountpt) printf("E\n");verify_200k_file(a); printf("F\n");verify_200k_file(b); } - + } @@ -1976,51 +1976,51 @@ void multi_mount_test(const char *mountpt,int nmounts) { char a[30]; - + int i; int j; - + sprintf(a,"%s/a",mountpt); yaffs_start_up(); - + for(i = 0; i < nmounts; i++){ int h0; int h1; int len0; int len1; - + static char xx[1000]; - + printf("############### Iteration %d Start\n",i); - if(1 || i == 0 || i == 5) + if(1 || i == 0 || i == 5) yaffs_mount(mountpt); dump_directory_tree(mountpt); - - + + yaffs_mkdir(a,0); - + sprintf(xx,"%s/0",a); h0 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - + sprintf(xx,"%s/1",a); h1 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); -#if 0 +#if 0 for(j = 0; j < 200; j++){ yaffs_write(h0,xx,1000); yaffs_write(h1,xx,1000); } #else while(yaffs_write(h0,xx,1000) > 0){ - + yaffs_write(h1,xx,1000); } #endif len0 = yaffs_lseek(h0,0,SEEK_END); len1 = yaffs_lseek(h1,0,SEEK_END); - + yaffs_lseek(h0,0,SEEK_SET); yaffs_lseek(h1,0,SEEK_SET); @@ -2028,12 +2028,12 @@ void multi_mount_test(const char *mountpt,int nmounts) yaffs_read(h0,xx,1000); yaffs_read(h1,xx,1000); } - - + + // yaffs_truncate(h0,0); yaffs_close(h0); yaffs_close(h1); - + printf("########### %d\n",i); dump_directory_tree(mountpt); @@ -2047,7 +2047,7 @@ void small_mount_test(const char *mountpt,int nmounts) { char a[30]; - + int i; int j; @@ -2056,46 +2056,46 @@ void small_mount_test(const char *mountpt,int nmounts) int len0; int len1; int nread; - + sprintf(a,"%s/a",mountpt); yaffs_start_up(); - - - + + + for(i = 0; i < nmounts; i++){ - + static char xx[1000]; - + printf("############### Iteration %d Start\n",i); - if(1 || i == 0 || i == 5) + if(1 || i == 0 || i == 5) yaffs_mount(mountpt); dump_directory_tree(mountpt); - + yaffs_mkdir(a,0); - + sprintf(xx,"%s/0",a); if(i ==0){ - + h0 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); for(j = 0; j < 130; j++) yaffs_write(h0,xx,1000); yaffs_close(h0); } - + h0 = yaffs_open(xx,O_RDONLY,0); - + sprintf(xx,"%s/1",a); h1 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - + while((nread = yaffs_read(h0,xx,1000)) > 0) yaffs_write(h1,xx,nread); - - + + len0 = yaffs_lseek(h0,0,SEEK_END); len1 = yaffs_lseek(h1,0,SEEK_END); - + yaffs_lseek(h0,0,SEEK_SET); yaffs_lseek(h1,0,SEEK_SET); @@ -2103,10 +2103,10 @@ void small_mount_test(const char *mountpt,int nmounts) yaffs_read(h0,xx,1000); yaffs_read(h1,xx,1000); } - + yaffs_close(h0); yaffs_close(h1); - + printf("########### %d\n",i); dump_directory_tree(mountpt); @@ -2128,42 +2128,42 @@ void small_overwrite_test(const char *mountpt,int nmounts) int h0; int h1; - + sprintf(a,"%s/a",mountpt); yaffs_start_up(); - - - + + + for(i = 0; i < nmounts; i++){ - + static char xx[8000]; - + printf("############### Iteration %d Start\n",i); if(1) yaffs_mount(mountpt); dump_directory_tree(mountpt); - + yaffs_mkdir(a,0); - + sprintf(xx,"%s/0",a); h0 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); sprintf(xx,"%s/1",a); h1 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - + for(j = 0; j < 1000000; j+=1000){ yaffs_ftruncate(h0,j); yaffs_lseek(h0,j,SEEK_SET); yaffs_write(h0,xx,7000); yaffs_write(h1,xx,7000); - + if(early_exit) exit(0); } - + yaffs_close(h0); - + printf("########### %d\n",i); dump_directory_tree(mountpt); @@ -2177,36 +2177,36 @@ void seek_overwrite_test(const char *mountpt,int nmounts) { static char xx[5000]; char a[30]; - + int i; int j; int h0; - + sprintf(a,"%s/f",mountpt); yaffs_start_up(); - + yaffs_mount(mountpt); - - + + for(i = 0; i < nmounts; i++){ - + h0 = yaffs_open(a, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - + for(j = 0; j < 100000; j++){ yaffs_lseek(h0,0,SEEK_SET); yaffs_write(h0,xx,5000); yaffs_lseek(h0,0x100000,SEEK_SET); yaffs_write(h0,xx,5000); - + if(early_exit) exit(0); } - + yaffs_close(h0); - + } } @@ -2222,33 +2222,33 @@ void checkpoint_fill_test(const char *mountpt,int nmounts) char a[50]; char b[50]; char c[50]; - + int i; int j; int h; - + sprintf(a,"%s/a",mountpt); - - - + + + yaffs_start_up(); - + for(i = 0; i < nmounts; i++){ printf("############### Iteration %d Start\n",i); yaffs_mount(mountpt); dump_directory_tree(mountpt); yaffs_mkdir(a,0); - + sprintf(b,"%s/zz",a); - + h = yaffs_open(b,O_CREAT | O_RDWR,S_IREAD |S_IWRITE); - - + + while(yaffs_write(h,c,50) == 50){} - + yaffs_close(h); - + for(j = 0; j < 2; j++){ printf("touch %d\n",j); yaffs_touch(b); @@ -2256,7 +2256,7 @@ void checkpoint_fill_test(const char *mountpt,int nmounts) yaffs_mount(mountpt); } - dump_directory_tree(mountpt); + dump_directory_tree(mountpt); yaffs_unmount(mountpt); } } @@ -2275,7 +2275,7 @@ int make_file2(const char *name1, const char *name2,int syz) h1 = yaffs_open(name1,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); if(name2) h2 = yaffs_open(name2,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); - + while(syz > 0 && n > 0){ i = (syz > 2500) ? 2500 : syz; n = yaffs_write(h1,xx,i); @@ -2299,12 +2299,12 @@ void checkpoint_upgrade_test(const char *mountpt,int nmounts) char d[50]; int j; - + sprintf(a,"%s/a",mountpt); - - - + + + printf("Create start condition\n"); yaffs_start_up(); yaffs_mount(mountpt); @@ -2315,20 +2315,20 @@ void checkpoint_upgrade_test(const char *mountpt,int nmounts) sprintf(d,"%s/aa",a); make_file2(d,NULL,500000000); dump_directory_tree(mountpt); - + printf("Umount/mount attempt full\n"); yaffs_unmount(mountpt); - + yaffs_mount(mountpt); - + printf("unlink small file\n"); yaffs_unlink(c); dump_directory_tree(mountpt); - + printf("Umount/mount attempt\n"); yaffs_unmount(mountpt); yaffs_mount(mountpt); - + for(j = 0; j < 500; j++){ printf("***** touch %d\n",j); dump_directory_tree(mountpt); @@ -2345,26 +2345,26 @@ void checkpoint_upgrade_test(const char *mountpt,int nmounts) yaffs_mount(mountpt); } } - + void huge_array_test(const char *mountpt,int n) { char a[50]; - + int i; int space; - + int fnum; - + sprintf(a,"mount point %s",mountpt); - - + + yaffs_start_up(); yaffs_mount(mountpt); - + while(n>0){ n--; fnum = 0; @@ -2377,9 +2377,9 @@ void huge_array_test(const char *mountpt,int n) printf("verifying file %s\n",a); verify_file_of_size(a,10000000); } - + printf("\n\n verification/deletion\n\n"); - + for(i = 0; i < fnum; i++){ sprintf(a,"%s/file%d",mountpt,i); printf("verifying file %s\n",a); @@ -2388,8 +2388,8 @@ void huge_array_test(const char *mountpt,int n) yaffs_unlink(a); } printf("\n\n done \n\n"); - - + + } } @@ -2398,7 +2398,7 @@ void random_write(int h) { static char buffer[12000]; int n; - + n = random() & 0x1FFF; yaffs_write(h,buffer,n); } @@ -2423,38 +2423,38 @@ void random_truncate(int h, char * name) } -#define NSMALLFILES 10 +#define NSMALLFILES 10 void random_small_file_test(const char *mountpt,int iterations) { char a[NSMALLFILES][50]; - + int i; int n; int h[NSMALLFILES]; int r; - - + + yaffs_start_up(); yaffs_mount(mountpt); - + for(i = 0; i < NSMALLFILES; i++){ h[i]=-1; strcpy(a[i],""); } - + for(n = 0; n < iterations; n++){ - + for(i = 0; i < NSMALLFILES; i++) { r = random(); - + if(strlen(a[i]) == 0){ sprintf(a[i],"%s/%dx%d",mountpt,n,i); h[i] = yaffs_open(a[i],O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); } - + if(h[i] < -1) printf("Could not open yaffs file %d %d error %d\n",n,i,h[i]); else { @@ -2483,12 +2483,12 @@ void random_small_file_test(const char *mountpt,int iterations) } } } - + } - + for(i = 0; i < NSMALLFILES; i++) yaffs_close(h[i]); - + yaffs_unmount(mountpt); } @@ -2496,9 +2496,9 @@ void rmdir_test(const char *mountpt) { char name[100]; yaffs_start_up(); - + yaffs_mount(mountpt); - + strcpy(name,mountpt); strcat(name,"/"); strcat(name,"hello"); @@ -2549,6 +2549,50 @@ static void list_xattr(const char *path) printf("end\n"); } +void basic_utime_test(const char *mountpt) +{ + char name[100]; + int h; + int result; + int val1; + struct yaffs_utimbuf utb; + struct yaffs_stat st; + + yaffs_start_up(); + + yaffs_mount(mountpt); + + strcpy(name,mountpt); + strcat(name,"/"); + strcat(name,"xfile"); + + yaffs_unlink(name); + + printf("created\n"); + h = yaffs_open(name,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE); + + yaffs_fstat(h,&st); printf(" times %u %u %u\n",st.yst_atime, st.yst_ctime, st.yst_mtime); + + utb.actime = 1000; + utb.modtime = 2000; + result = yaffs_futime(h,&utb); + printf("futime to a 1000 m 2000 result %d\n",result); + yaffs_fstat(h,&st); printf(" times %u %u %u\n",st.yst_atime, st.yst_ctime, st.yst_mtime); + + + utb.actime = 5000; + utb.modtime = 8000; + result = yaffs_utime(name, &utb); + printf("utime to a 5000 m 8000 result %d\n",result); + yaffs_fstat(h,&st); printf(" times %u %u %u\n",st.yst_atime, st.yst_ctime, st.yst_mtime); + + result = yaffs_utime(name, NULL); + printf("utime to NULL result %d\n",result); + yaffs_fstat(h,&st); printf(" times %u %u %u\n",st.yst_atime, st.yst_ctime, st.yst_mtime); + + +} + void basic_xattr_test(const char *mountpt) { char name[100]; @@ -2665,7 +2709,7 @@ void test_flash_traffic(const char *mountpt) yaffs_start_up(); yaffs_mount(mountpt); - + dev = yaffs_getdev(mountpt); strcpy(name0,mountpt); @@ -2690,7 +2734,7 @@ void link_follow_test(const char *mountpt) char hn[100]; int result; int h; - + yaffs_trace_mask = 0; yaffs_start_up(); @@ -2700,7 +2744,7 @@ void link_follow_test(const char *mountpt) sprintf(fn,"%s/file",mountpt); sprintf(sn,"%s/sym",mountpt); sprintf(hn,"%s/hl-sym",mountpt); - + h = yaffs_open(fn,O_CREAT| O_RDWR, S_IREAD | S_IWRITE); result = yaffs_close(h); @@ -2718,23 +2762,23 @@ int main(int argc, char *argv[]) { random_seed = time(NULL); //return long_test(argc,argv); - + //return cache_read_test(); - + // resize_stress_test_no_grow("/flash/flash",20); //root_perm_remount("/flash/flash"); - + //huge_directory_test_on_path("/ram2k"); - + //yaffs_backward_scan_test("/flash/flash"); // yaffs_device_flush_test("/flash/flash"); //rename_over_test("//////////////////flash///////////////////yaffs1///////////"); - + //fill_empty_files_test("/yaffs2/"); //resize_stress_test("/yaffs2"); //overwrite_test("/yaffs2"); - + //long_name_test("/yaffs2"); //link_test0("/yaffs2"); //link_test1("yaffs2"); @@ -2752,7 +2796,7 @@ int main(int argc, char *argv[]) // handle_test("yaffs2/"); - + //long_test_on_path("/ram2k"); // long_test_on_path("/flash"); //simple_rw_test("/flash/flash"); @@ -2760,23 +2804,24 @@ int main(int argc, char *argv[]) // rename_over_test("/flash"); //lookup_test("/flash"); //freespace_test("/flash/flash"); - + //link_test("/flash/flash"); - + // cache_bypass_bug_test(); - + //free_space_check(); - + //check_resize_gc_bug("/flash"); - + //basic_xattr_test("/yaffs2"); //big_xattr_test("/yaffs2"); //null_name_test("yaffs2"); - test_flash_traffic("yaffs2"); + //test_flash_traffic("yaffs2"); // link_follow_test("/yaffs2"); + basic_utime_test("/yaffs2"); return 0; - + } diff --git a/direct/basic-test/yaffs_osglue.c b/direct/basic-test/yaffs_osglue.c index 9958713..885fb80 100644 --- a/direct/basic-test/yaffs_osglue.c +++ b/direct/basic-test/yaffs_osglue.c @@ -75,7 +75,7 @@ void yaffsfs_LockInit(void) u32 yaffsfs_CurrentTime(void) { - return 0; + return time(NULL); } diff --git a/direct/python/examples.py b/direct/python/examples.py index 155e770..68fc95c 100644 --- a/direct/python/examples.py +++ b/direct/python/examples.py @@ -30,12 +30,12 @@ def yaffs_ls(dname): isDir = True if st.st_mode & 0x4000 else False if isFile : - print "File ",se.d_ino, hex(perms), st.st_size, fullname + print "File ",se.d_ino, hex(perms), st.st_size, fullname, " times ", st.yst_atime, st.yst_ctime, st.yst_mtime elif isDir : - print "Dir ",se.d_ino, hex(perms), fullname + print "Dir ",se.d_ino, hex(perms), fullname, " times ", st.yst_atime, st.yst_ctime, st.yst_mtime yaffs_ls(fullname) else : - print "Other (",hex(st.st_mode),") ",se.d_ino, hex(perms), fullname + print "Other (",hex(st.st_mode),") ",se.d_ino, hex(perms), fullname, " times ", st.yst_atime, st.yst_ctime, st.yst_mtime sep = yaffs_readdir(dc) yaffs_closedir(dc) @@ -96,4 +96,3 @@ h = yaffs_open(root+"/dd/111",66,0666) yaffs_close(h) yaffs_ls(root) - diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index 17fc502..568fe1e 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -90,7 +90,7 @@ static yaffsfs_Handle yaffsfs_handle[YAFFSFS_N_HANDLES]; static int yaffsfs_handlesInitialised; -unsigned yaffs_set_trace(unsigned tm) +unsigned yaffs_set_trace(unsigned tm) { yaffs_trace_mask = tm; return yaffs_trace_mask; @@ -143,7 +143,7 @@ static yaffsfs_Inode *yaffsfs_HandleToInode(int handle) { yaffsfs_FileDes *fd = yaffsfs_HandleToFileDes(handle); - if(fd && fd->handleCount > 0 && + if(fd && fd->handleCount > 0 && fd->inodeId >= 0 && fd->inodeId < YAFFSFS_N_HANDLES) return &yaffsfs_inode[fd->inodeId]; @@ -169,7 +169,7 @@ static int yaffsfs_FindInodeIdForObject(struct yaffs_obj *obj) { int i; int ret = -1; - + if(obj) obj = yaffs_get_equivalent_obj(obj); @@ -190,7 +190,7 @@ static int yaffsfs_GetInodeIdForObject(struct yaffs_obj *obj) int i; int ret; yaffsfs_Inode *in = NULL; - + if(obj) obj = yaffs_get_equivalent_obj(obj); @@ -208,8 +208,8 @@ static int yaffsfs_GetInodeIdForObject(struct yaffs_obj *obj) in->iObj = obj; in->count++; } - - + + return ret; } @@ -227,12 +227,12 @@ static int yaffsfs_CountHandles(struct yaffs_obj *obj) static void yaffsfs_ReleaseInode(yaffsfs_Inode *in) { struct yaffs_obj *obj; - + obj = in->iObj; if(obj->unlinked) yaffs_del_obj(obj); - + obj->my_inode = NULL; in->iObj = NULL; @@ -247,7 +247,7 @@ static void yaffsfs_PutInode(int inodeId) yaffsfs_ReleaseInode(in); in->count = 0; } - } + } } @@ -307,7 +307,7 @@ static int yaffsfs_GetHandle(int handle) { yaffsfs_Handle *h = yaffsfs_HandleToPointer(handle); - if(h && h->useCount > 0){ + if(h && h->useCount > 0){ h->useCount++; return 0; } @@ -340,7 +340,7 @@ static int yaffsfs_PutHandle(int handle) { yaffsfs_Handle *h = yaffsfs_HandleToPointer(handle); - if(h && h->useCount > 0){ + if(h && h->useCount > 0){ h->useCount--; if(h->useCount < 1){ yaffsfs_PutFileDes(h->fdId); @@ -366,7 +366,7 @@ static void yaffsfs_BreakDeviceHandles(struct yaffs_dev *dev) h->fdId = 0; } if(fd && fd->handleCount>0 && obj && obj->my_dev == dev){ - + fd->handleCount = 0; yaffsfs_PutInode(fd->inodeId); fd->inodeId = -1; @@ -403,10 +403,10 @@ int yaffsfs_IsPathDivider(YCHAR ch) int yaffsfs_CheckNameLength(const char *name) { - int retVal = 0; + int retVal = 0; int nameLength = strnlen(name,YAFFS_MAX_NAME_LENGTH+1); - + if(nameLength == 0){ yaffsfs_SetError(-ENOENT); retVal = -1; @@ -415,7 +415,7 @@ int yaffsfs_CheckNameLength(const char *name) retVal = -1; } - return retVal; + return retVal; } @@ -438,7 +438,7 @@ static int yaffsfs_alt_dir_path(const YCHAR *path, YCHAR **ret_path) * Curveball: Need to handle multiple path dividers: * eg. /foof/sdfse///// -> /foo/sdfse */ - if(path_length > 0 && + if(path_length > 0 && yaffsfs_IsPathDivider(path[path_length-1])){ alt_path = kmalloc(path_length + 1, 0); if(!alt_path) @@ -546,7 +546,7 @@ static int yaffsfs_CheckPath(const YCHAR *path) n++; path++; } - + return (*path) ? -1 : 0; } @@ -659,13 +659,13 @@ static struct yaffs_obj *yaffsfs_DoFindDirectory(struct yaffs_obj *startDir, dir = yaffsfs_FollowLink(dir,symDepth,loop); - if(dir && dir->variant_type != + if(dir && dir->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY){ if(notDir) *notDir = 1; dir = NULL; } - + } } } @@ -712,7 +712,7 @@ static struct yaffs_obj *yaffsfs_FindObject(struct yaffs_obj *relDir, /************************************************************************* - * Start of yaffsfs visible functions. + * Start of yaffsfs visible functions. *************************************************************************/ int yaffs_dup(int handle) @@ -841,7 +841,7 @@ int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int sharing) if( writeRequested && !(obj->yst_mode & S_IWRITE)) openDenied = 1; - if( !errorReported && writeRequested && + if( !errorReported && writeRequested && obj->my_dev->read_only){ openDenied = 1; yaffsfs_SetError(-EROFS); @@ -881,7 +881,7 @@ int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int sharing) - if((!sharedReadAllowed && readRequested)|| + if((!sharedReadAllowed && readRequested)|| (!shareRead && alreadyReading) || (!sharedWriteAllowed && writeRequested) || (!shareWrite && alreadyWriting)){ @@ -936,10 +936,10 @@ int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int sharing) if(inodeId<0) { /* * Todo: Fix any problem if inodes run out, though that - * can't happen if the number of inode items >= number of handles. + * can't happen if the number of inode items >= number of handles. */ } - + fd->inodeId = inodeId; fd->reading = readRequested; fd->writing = writeRequested; @@ -955,7 +955,7 @@ int yaffs_open_sharing(const YCHAR *path, int oflag, int mode, int sharing) yaffs_resize_file(obj,0); } else { yaffsfs_PutHandle(handle); - if(!errorReported) + if(!errorReported) yaffsfs_SetError(0); /* Problem */ handle = -1; } @@ -985,7 +985,7 @@ int yaffs_Dofsync(int handle,int datasync) yaffsfs_SetError(-EBADF); else if(obj->my_dev->read_only) yaffsfs_SetError(-EROFS); - else { + else { yaffs_flush_file(obj,1,datasync); retVal = 0; } @@ -1077,7 +1077,7 @@ int yaffsfs_do_read(int handle, void *vbuf, unsigned int nbyte, int isPread, int startPos = fd->position; pos = startPos; - + if(yaffs_get_obj_length(obj) > pos) maxRead = yaffs_get_obj_length(obj) - pos; else @@ -1103,7 +1103,7 @@ int yaffsfs_do_read(int handle, void *vbuf, unsigned int nbyte, int isPread, int if(nToRead > nbyte) nToRead = nbyte; - /* Tricky bit... + /* Tricky bit... * Need to reverify object in case the device was * unmounted in another thread. */ @@ -1123,8 +1123,8 @@ int yaffsfs_do_read(int handle, void *vbuf, unsigned int nbyte, int isPread, int nbyte-=nRead; else nbyte = 0; /* no more to read */ - - + + if(nbyte > 0){ yaffsfs_Unlock(); yaffsfs_Lock(); @@ -1216,7 +1216,7 @@ int yaffsfs_do_write(int handle, const void *vbuf, unsigned int nbyte, int isPwr if(nToWrite > nbyte) nToWrite = nbyte; - /* Tricky bit... + /* Tricky bit... * Need to reverify object in case the device was * remounted or unmounted in another thread. */ @@ -1373,7 +1373,7 @@ off_t yaffs_lseek(int handle, off_t offset, int whence) fSize = yaffs_get_obj_length(obj); if(fSize >= 0 && (fSize + offset) >= 0) pos = fSize + offset; - } + } if(pos >= 0 && pos <= YAFFS_MAX_FILE_SIZE) fd->position = pos; @@ -1492,7 +1492,7 @@ int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath) obj = yaffsfs_FindObject(NULL,oldPath,0,0,NULL,NULL,NULL); newobj = yaffsfs_FindObject(NULL,newPath,0,0,NULL,NULL,NULL); - /* If the object being renamed is a directory and the + /* If the object being renamed is a directory and the * path ended with a "/" then the olddir == obj. * We pass through NULL for the old name to tell the lower layers * to use olddir as the object. @@ -1527,7 +1527,7 @@ int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath) /* * It is a directory, check that it is not being renamed to * being its own decendent. - * Do this by tracing from the new directory back to the root, + * Do this by tracing from the new directory back to the root, * checking for obj */ @@ -1671,6 +1671,95 @@ int yaffs_fstat(int fd, struct yaffs_stat *buf) return retVal; } +static int yaffsfs_DoUtime(struct yaffs_obj *obj,const struct yaffs_utimbuf *buf) +{ + int retVal = -1; + int result; + + struct yaffs_utimbuf local; + + obj = yaffs_get_equivalent_obj(obj); + + if(obj && obj->my_dev->read_only) { + yaffsfs_SetError(-EROFS); + return -1; + } + + + if(!buf){ + local.actime = Y_CURRENT_TIME; + local.modtime = local.actime; + buf = &local; + } + + if(obj){ + obj->yst_atime = buf->actime; + obj->yst_mtime = buf->modtime; + obj->dirty = 1; + result = yaffs_flush_file(obj,0,0); + retVal = result == YAFFS_OK ? 0 : -1; + } + + return retVal; +} + +int yaffs_utime(const YCHAR *path, const struct yaffs_utimbuf *buf) +{ + struct yaffs_obj *obj=NULL; + struct yaffs_obj *dir=NULL; + int retVal = -1; + int notDir = 0; + int loop = 0; + + if(!path){ + yaffsfs_SetError(-EFAULT); + return -1; + } + + if(yaffsfs_CheckPath(path) < 0){ + yaffsfs_SetError(-ENAMETOOLONG); + return -1; + } + + yaffsfs_Lock(); + + obj = yaffsfs_FindObject(NULL,path,0,1,&dir,¬Dir,&loop); + + if(!dir && notDir) + yaffsfs_SetError(-ENOTDIR); + else if(loop) + yaffsfs_SetError(-ELOOP); + else if(!dir || !obj) + yaffsfs_SetError(-ENOENT); + else + retVal = yaffsfs_DoUtime(obj,buf); + + yaffsfs_Unlock(); + + return retVal; + +} +int yaffs_futime(int fd, const struct yaffs_utimbuf *buf) +{ + struct yaffs_obj *obj; + + int retVal = -1; + + yaffsfs_Lock(); + obj = yaffsfs_HandleToObject(fd); + + if(obj) + retVal = yaffsfs_DoUtime(obj,buf); + else + /* bad handle */ + yaffsfs_SetError(-EBADF); + + yaffsfs_Unlock(); + + return retVal; +} + + #ifndef CONFIG_YAFFS_WINCE /* xattrib functions */ @@ -1702,11 +1791,11 @@ static int yaffs_do_setxattr(const YCHAR *path, const char *name, if(follow) obj = yaffsfs_FollowLink(obj,0,&loop); - if(!dir && notDir) + if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); - else if(loop) + else if(loop) yaffsfs_SetError(-ELOOP); - else if(!dir || !obj) + else if(!dir || !obj) yaffsfs_SetError(-ENOENT); else { retVal = yaffs_set_xattrib(obj,name,data,size,flags); @@ -1748,7 +1837,7 @@ int yaffs_fsetxattr(int fd, const char *name, const void *data, int size, int fl yaffsfs_Lock(); obj = yaffsfs_HandleToObject(fd); - if(!obj) + if(!obj) yaffsfs_SetError(-EBADF); else { retVal = yaffs_set_xattrib(obj,name,data,size,flags); @@ -1788,11 +1877,11 @@ static int yaffs_do_getxattr(const YCHAR *path, const char *name, void *data, in if(follow) obj = yaffsfs_FollowLink(obj,0,&loop); - if(!dir && notDir) + if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); - else if(loop) + else if(loop) yaffsfs_SetError(-ELOOP); - else if(!dir || !obj) + else if(!dir || !obj) yaffsfs_SetError(-ENOENT); else { retVal = yaffs_get_xattrib(obj,name,data,size); @@ -1872,11 +1961,11 @@ static int yaffs_do_listxattr(const YCHAR *path, char *data, int size, int follo if(follow) obj = yaffsfs_FollowLink(obj,0,&loop); - if(!dir && notDir) + if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); - else if(loop) + else if(loop) yaffsfs_SetError(-ELOOP); - else if(!dir || !obj) + else if(!dir || !obj) yaffsfs_SetError(-ENOENT); else { retVal = yaffs_list_xattrib(obj, data,size); @@ -1956,11 +2045,11 @@ static int yaffs_do_removexattr(const YCHAR *path, const char *name, int follow) if(follow) obj = yaffsfs_FollowLink(obj,0,&loop); - if(!dir && notDir) + if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); - else if(loop) + else if(loop) yaffsfs_SetError(-ELOOP); - else if(!dir || !obj) + else if(!dir || !obj) yaffsfs_SetError(-ENOENT); else { retVal = yaffs_remove_xattrib(obj,name); @@ -2045,17 +2134,17 @@ int yaffs_get_wince_times(int fd, unsigned *wctime, unsigned *watime, unsigned * retVal = 0; } else /* bad handle */ - yaffsfs_SetError(-EBADF); - + yaffsfs_SetError(-EBADF); + yaffsfs_Unlock(); - + return retVal; } -int yaffs_set_wince_times(int fd, - const unsigned *wctime, - const unsigned *watime, +int yaffs_set_wince_times(int fd, + const unsigned *wctime, + const unsigned *watime, const unsigned *wmtime) { struct yaffs_obj *obj; @@ -2140,11 +2229,11 @@ int yaffs_access(const YCHAR *path, int amode) obj = yaffsfs_FindObject(NULL,path,0,1, &dir,¬Dir,&loop); obj = yaffsfs_FollowLink(obj,0,&loop); - if(!dir && notDir) + if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); - else if(loop) + else if(loop) yaffsfs_SetError(-ELOOP); - else if(!dir || !obj) + else if(!dir || !obj) yaffsfs_SetError(-ENOENT); else if((amode & W_OK) && obj->my_dev->read_only) yaffsfs_SetError(-EROFS); @@ -2199,11 +2288,11 @@ int yaffs_chmod(const YCHAR *path, mode_t mode) obj = yaffsfs_FindObject(NULL,path,0,1, &dir, ¬Dir,&loop); obj = yaffsfs_FollowLink(obj,0,&loop); - if(!dir && notDir) + if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); - else if(loop) + else if(loop) yaffsfs_SetError(-ELOOP); - else if(!dir || !obj) + else if(!dir || !obj) yaffsfs_SetError(-ENOENT); else if(obj->my_dev->read_only) yaffsfs_SetError(-EROFS); @@ -2268,7 +2357,7 @@ int yaffs_mkdir(const YCHAR *path, mode_t mode) } if(alt_path) path = alt_path; - + yaffsfs_Lock(); parent = yaffsfs_FindDirectory(NULL,path,&name,0,¬Dir,&loop); if(!parent && notDir) @@ -2398,7 +2487,7 @@ int yaffs_sync(const YCHAR *path) yaffsfs_SetError(-ENAMETOOLONG); return -1; } - + yaffsfs_Lock(); dev = yaffsfs_FindDevice(path,&dummy); if(dev){ @@ -2407,17 +2496,17 @@ int yaffs_sync(const YCHAR *path) else if(dev->read_only) yaffsfs_SetError(-EROFS); else { - + yaffs_flush_whole_cache(dev); yaffs_checkpoint_save(dev); retVal = 0; - - } + + } }else yaffsfs_SetError(-ENODEV); yaffsfs_Unlock(); - return retVal; + return retVal; } @@ -2572,7 +2661,7 @@ loff_t yaffs_totalspace(const YCHAR *path) yaffsfs_Lock(); dev = yaffsfs_FindDevice(path,&dummy); if(dev && dev->is_mounted){ - retVal = (dev->param.end_block - dev->param.start_block + 1) - + retVal = (dev->param.end_block - dev->param.start_block + 1) - dev->param.n_reserved_blocks; retVal *= dev->param.chunks_per_block; retVal *= dev->data_bytes_per_chunk; @@ -2607,12 +2696,12 @@ int yaffs_inodecount(const YCHAR *path) if(n_obj > dev->n_hardlinks) retVal = n_obj - dev->n_hardlinks; } - + if(retVal < 0) yaffsfs_SetError(-EINVAL); - + yaffsfs_Unlock(); - return retVal; + return retVal; } @@ -2652,7 +2741,7 @@ typedef struct struct yaffs_obj *dirObj; /* ptr to directory being searched */ struct yaffs_obj *nextReturn; /* obj to be returned by next readddir */ int offset; - struct list_head others; + struct list_head others; } yaffsfs_DirectorySearchContext; @@ -2769,7 +2858,7 @@ yaffs_DIR *yaffs_opendir(const YCHAR *dirname) if(!search_contexts.next) INIT_LIST_HEAD(&search_contexts); - list_add(&dsc->others,&search_contexts); + list_add(&dsc->others,&search_contexts); yaffsfs_SetDirRewound(dsc); } @@ -2910,11 +2999,11 @@ int yaffs_readlink(const YCHAR *path, YCHAR *buf, int bufsiz) obj = yaffsfs_FindObject(NULL,path,0,1, &dir,¬Dir,&loop); - if(!dir && notDir) + if(!dir && notDir) yaffsfs_SetError(-ENOTDIR); - else if(loop) + else if(loop) yaffsfs_SetError(-ELOOP); - else if(!dir || !obj) + else if(!dir || !obj) yaffsfs_SetError(-ENOENT); else if(obj->variant_type != YAFFS_OBJECT_TYPE_SYMLINK) yaffsfs_SetError(-EINVAL); @@ -2971,9 +3060,9 @@ int yaffs_link(const YCHAR *oldpath, const YCHAR *linkpath) yaffsfs_SetError(-EEXIST); else if(lnk_dir->my_dev != obj->my_dev) yaffsfs_SetError(-EXDEV); - else { + else { retVal = yaffsfs_CheckNameLength(newname); - + if(retVal == 0) { lnk = yaffs_link_obj(lnk_dir,newname,obj); if(lnk) @@ -3003,7 +3092,7 @@ int yaffs_mknod(const YCHAR *pathname, mode_t mode, dev_t dev) /* * D E B U G F U N C T I O N S */ - + /* * yaffs_n_handles() * Returns number of handles attached to the object diff --git a/direct/yaffsfs.h b/direct/yaffsfs.h index fbf6ad5..6b6b328 100644 --- a/direct/yaffsfs.h +++ b/direct/yaffsfs.h @@ -1,5 +1,5 @@ /* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. * * Copyright (C) 2002-2011 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering @@ -77,6 +77,13 @@ struct yaffs_stat{ #endif }; + +struct yaffs_utimbuf { + unsigned long actime; + unsigned long modtime; +}; + + int yaffs_open(const YCHAR *path, int oflag, int mode) ; int yaffs_close(int fd) ; @@ -106,6 +113,10 @@ int yaffs_stat(const YCHAR *path, struct yaffs_stat *buf) ; int yaffs_lstat(const YCHAR *path, struct yaffs_stat *buf) ; int yaffs_fstat(int fd, struct yaffs_stat *buf) ; +int yaffs_utime(const YCHAR *path, const struct yaffs_utimbuf *buf); +int yaffs_futime(int fd, const struct yaffs_utimbuf *buf); + + int yaffs_setxattr(const char *path, const char *name, const void *data, int size, int flags); int yaffs_lsetxattr(const char *path, const char *name, const void *data, int size, int flags); int yaffs_fsetxattr(int fd, const char *name, const void *data, int size, int flags); @@ -130,8 +141,8 @@ int yaffs_get_wince_times(int fd, unsigned *wctime, unsigned *watime, unsigned * #endif -int yaffs_chmod(const YCHAR *path, mode_t mode); -int yaffs_fchmod(int fd, mode_t mode); +int yaffs_chmod(const YCHAR *path, mode_t mode); +int yaffs_fchmod(int fd, mode_t mode); int yaffs_mkdir(const YCHAR *path, mode_t mode) ; int yaffs_rmdir(const YCHAR *path) ; @@ -150,10 +161,10 @@ int yaffs_remount(const YCHAR *path, int force, int read_only); int yaffs_sync(const YCHAR *path) ; -int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath); -int yaffs_readlink(const YCHAR *path, YCHAR *buf, int bufsiz); +int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath); +int yaffs_readlink(const YCHAR *path, YCHAR *buf, int bufsiz); -int yaffs_link(const YCHAR *oldpath, const YCHAR *newpath); +int yaffs_link(const YCHAR *oldpath, const YCHAR *newpath); int yaffs_mknod(const YCHAR *pathname, mode_t mode, dev_t dev); loff_t yaffs_freespace(const YCHAR *path); @@ -190,7 +201,7 @@ unsigned yaffs_get_trace(void); /* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. * * Copyright (C) 2002-2011 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering -- cgit v1.2.3 From a7b5dcf904ba6f7890e4b77ce1f56388b855d0f6 Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Mon, 15 Aug 2011 11:40:30 +1200 Subject: Mods for Linux 3.0 and fix a typo Roll in NCB's patch and some other changes for Linux 3.0. Also fix a dumb type retired_writes->retried_writes Signed-off-by: Charles Manning --- patch-ker.sh | 2 +- yaffs_guts.c | 4 ++-- yaffs_guts.h | 2 +- yaffs_vfs_multi.c | 46 ++++++++++++++++++++++++++++++++++++---------- yaffs_vfs_single.c | 2 +- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/patch-ker.sh b/patch-ker.sh index 44152c8..ed54d53 100755 --- a/patch-ker.sh +++ b/patch-ker.sh @@ -92,7 +92,7 @@ PATCHLEVEL=`grep -s PATCHLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'PATCHLEV SUBLEVEL=`grep -s SUBLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'SUBLEVEL = '//` # Can we handle this version? -if [ $VERSION -ne 2 -o $PATCHLEVEL -lt 6 ] +if [ $VERSION$PATCHLEVEL -lt 26 ] then echo "Cannot patch kernel version $VERSION.$PATCHLEVEL.$SUBLEVEL, must be 2.6.x or higher" exit 1; diff --git a/yaffs_guts.c b/yaffs_guts.c index d72aa5b..9ade09b 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -598,7 +598,7 @@ static int yaffs_write_new_chunk(struct yaffs_dev *dev, yaffs_trace(YAFFS_TRACE_ERROR, "**>> yaffs write required %d attempts", attempts); - dev->n_retired_writes += (attempts - 1); + dev->n_retried_writes += (attempts - 1); } return chunk; @@ -4878,7 +4878,7 @@ int yaffs_guts_initialise(struct yaffs_dev *dev) dev->n_page_writes = 0; dev->n_erasures = 0; dev->n_gc_copies = 0; - dev->n_retired_writes = 0; + dev->n_retried_writes = 0; dev->n_retired_blocks = 0; diff --git a/yaffs_guts.h b/yaffs_guts.h index 6ec8a47..490122a 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -744,7 +744,7 @@ struct yaffs_dev { u32 oldest_dirty_gc_count; u32 n_gc_blocks; u32 bg_gcs; - u32 n_retired_writes; + u32 n_retried_writes; u32 n_retired_blocks; u32 n_ecc_fixed; u32 n_ecc_unfixed; diff --git a/yaffs_vfs_multi.c b/yaffs_vfs_multi.c index 966df48..b8e5124 100644 --- a/yaffs_vfs_multi.c +++ b/yaffs_vfs_multi.c @@ -72,7 +72,9 @@ #include #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39)) #include +#endif #include #include #include @@ -237,7 +239,9 @@ static int yaffs_file_flush(struct file *file, fl_owner_t id); static int yaffs_file_flush(struct file *file); #endif -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) +static int yaffs_sync_object(struct file *file, loff_t start, loff_t end, int datasync); +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)) static int yaffs_sync_object(struct file *file, int datasync); #else static int yaffs_sync_object(struct file *file, struct dentry *dentry, @@ -1826,7 +1830,9 @@ static int yaffs_symlink(struct inode *dir, struct dentry *dentry, return -ENOMEM; } -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) +static int yaffs_sync_object(struct file *file, loff_t start, loff_t end, int datasync) +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)) static int yaffs_sync_object(struct file *file, int datasync) #else static int yaffs_sync_object(struct file *file, struct dentry *dentry, @@ -2973,7 +2979,13 @@ static int yaffs_internal_read_super_mtd(struct super_block *sb, void *data, return yaffs_internal_read_super(1, sb, data, silent) ? 0 : -EINVAL; } -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) +static struct dentry *yaffs_mount(struct file_system_type *fs_type, int flags, + const char *dev_name, void *data) +{ + return mount_bdev(fs_type, flags, dev_name, data, yaffs_internal_read_super_mtd); +} +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) static int yaffs_read_super(struct file_system_type *fs, int flags, const char *dev_name, void *data, struct vfsmount *mnt) @@ -2996,8 +3008,12 @@ static struct super_block *yaffs_read_super(struct file_system_type *fs, static struct file_system_type yaffs_fs_type = { .owner = THIS_MODULE, .name = "yaffs", - .get_sb = yaffs_read_super, - .kill_sb = kill_block_super, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) + .mount = yaffs_mount, +#else + .get_sb = yaffs_read_super, +#endif + .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; #else @@ -3019,7 +3035,13 @@ static int yaffs2_internal_read_super_mtd(struct super_block *sb, void *data, return yaffs_internal_read_super(2, sb, data, silent) ? 0 : -EINVAL; } -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) +static struct dentry *yaffs2_mount(struct file_system_type *fs_type, int flags, + const char *dev_name, void *data) +{ + return mount_bdev(fs_type, flags, dev_name, data, yaffs2_internal_read_super_mtd); +} +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) static int yaffs2_read_super(struct file_system_type *fs, int flags, const char *dev_name, void *data, struct vfsmount *mnt) @@ -3041,8 +3063,12 @@ static struct super_block *yaffs2_read_super(struct file_system_type *fs, static struct file_system_type yaffs2_fs_type = { .owner = THIS_MODULE, .name = "yaffs2", - .get_sb = yaffs2_read_super, - .kill_sb = kill_block_super, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) + .mount = yaffs2_mount, +#else + .get_sb = yaffs2_read_super, +#endif + .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; #else @@ -3112,8 +3138,8 @@ static char *yaffs_dump_dev_part1(char *buf, struct yaffs_dev *dev) dev->oldest_dirty_gc_count); buf += sprintf(buf, "n_gc_blocks.......... %u\n", dev->n_gc_blocks); buf += sprintf(buf, "bg_gcs............... %u\n", dev->bg_gcs); - buf += sprintf(buf, "n_retired_writes..... %u\n", - dev->n_retired_writes); + buf += sprintf(buf, "n_retried_writes..... %u\n", + dev->n_retried_writes); buf += sprintf(buf, "n_retired_blocks..... %u\n", dev->n_retired_blocks); buf += sprintf(buf, "n_ecc_fixed.......... %u\n", dev->n_ecc_fixed); diff --git a/yaffs_vfs_single.c b/yaffs_vfs_single.c index 64e590c..f822845 100644 --- a/yaffs_vfs_single.c +++ b/yaffs_vfs_single.c @@ -2391,7 +2391,7 @@ static char *yaffs_dump_dev_part1(char *buf, struct yaffs_dev *dev) buf += sprintf(buf, "n_gc_blocks........... %u\n", dev->n_gc_blocks); buf += sprintf(buf, "bg_gcs................ %u\n", dev->bg_gcs); buf += - sprintf(buf, "n_retired_writes...... %u\n", dev->n_retired_writes); + sprintf(buf, "n_retried_writes...... %u\n", dev->n_retried_writes); buf += sprintf(buf, "n_retired_blocks...... %u\n", dev->n_retired_blocks); buf += sprintf(buf, "n_ecc_fixed........... %u\n", dev->n_ecc_fixed); -- cgit v1.2.3 From e68d2bde85a54e27f0463662619411c5fe20cc4b Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Mon, 15 Aug 2011 15:48:01 +1200 Subject: Fix python wrapper pointer types c_int instead of pointers and returning c_int instead of void caused problems on 64 bits. Signed-off-by: Charles Manning --- direct/python/yaffsfs.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/direct/python/yaffsfs.py b/direct/python/yaffsfs.py index 1da25fd..79b6adb 100644 --- a/direct/python/yaffsfs.py +++ b/direct/python/yaffsfs.py @@ -171,21 +171,21 @@ class yaffs_dirent_struct(Structure): #yaffs_DIR *yaffs_opendir(const YCHAR *dirname) ; yaffs_opendir = ylib.yaffs_opendir yaffs_opendir.argtypes = [c_char_p] -yaffs_opendir.restype = c_int +yaffs_opendir.restype = c_void_p #struct yaffs_dirent *yaffs_readdir(yaffs_DIR *dirp) ; yaffs_readdir= ylib.yaffs_readdir -yaffs_readdir.argtypes=[c_int] +yaffs_readdir.argtypes=[c_void_p] yaffs_readdir.restype=POINTER(yaffs_dirent_struct) #void yaffs_rewinddir(yaffs_DIR *dirp) ; yaffs_rewinddir = ylib.yaffs_rewinddir -yaffs_rewinddir.argtypes = [c_int] -yaffs_rewinddir.restype = c_int ###### Should be void +yaffs_rewinddir.argtypes = [c_void_p] +yaffs_rewinddir.restype = None # void #int yaffs_closedir(yaffs_DIR *dirp) ; yaffs_closedir = ylib.yaffs_closedir -yaffs_closedir.argtypes = [c_int] +yaffs_closedir.argtypes = [c_void_p] yaffs_closedir.restype = c_int -- cgit v1.2.3 From d43e901b5bf74d8d40dda18f0d5da15c76245510 Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Wed, 21 Sep 2011 17:00:00 +1200 Subject: Remove dependencies on sys/stat.h when yaffs provides values. Signed-off-by: Charles Manning --- direct/yportenv.h | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/direct/yportenv.h b/direct/yportenv.h index 939cd3a..0d0d0fa 100644 --- a/direct/yportenv.h +++ b/direct/yportenv.h @@ -24,11 +24,6 @@ typedef unsigned short u16; typedef unsigned u32; -#ifndef WIN32 -#include -#endif - - #ifdef CONFIG_YAFFS_PROVIDE_DEFS /* File types */ @@ -44,10 +39,6 @@ typedef unsigned u32; #define DT_WHT 14 -#ifndef WIN32 -#include -#endif - /* * Attribute flags. * These are or-ed together to select what has been changed. @@ -227,6 +218,22 @@ struct iattr { #define S_IFMT 0170000 #endif +#ifndef S_IFSOCK +#define S_IFSOCK 0140000 +#endif + +#ifndef S_IFIFO +#define S_IFIFO 0010000 +#endif + +#ifndef S_IFCHR +#define S_IFCHR 0020000 +#endif + +#ifndef S_IFBLK +#define S_IFBLK 0060000 +#endif + #ifndef S_IFLNK #define S_IFLNK 0120000 #endif @@ -239,6 +246,15 @@ struct iattr { #define S_IFREG 0100000 #endif +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) + + #ifndef S_IREAD #define S_IREAD 0000400 #endif -- cgit v1.2.3 From 121c055437f23d9d6bc7b57d36ecf128b447013f Mon Sep 17 00:00:00 2001 From: Timothy Manning Date: Fri, 16 Dec 2011 13:28:52 +1300 Subject: Have updated yaffs direct tests and added README files to the tests. Signed-off-by: Timothy Manning --- direct/timothy_tests/dev/Makefile | 120 ---- direct/timothy_tests/dev/error_handler.c | 84 --- direct/timothy_tests/dev/error_handler.h | 23 - direct/timothy_tests/dev/message_buffer.c | 112 ---- direct/timothy_tests/dev/message_buffer.h | 49 -- direct/timothy_tests/dev/yaffs_tester.c | 375 ------------- direct/timothy_tests/dev/yaffs_tester.h | 48 -- direct/timothy_tests/handle_tests/Makefile | 6 +- direct/timothy_tests/handle_tests/README.txt | 7 + .../timothy_tests/is_yaffs_working_tests/Makefile | 115 ++++ .../is_yaffs_working_tests/README.txt | 11 + .../is_yaffs_working_tests/test_1_yaffs_mount.c | 97 ++++ direct/timothy_tests/linux_tests/Makefile | 15 +- direct/timothy_tests/linux_tests/README.txt | 26 +- direct/timothy_tests/linux_tests/linux_test.c | 4 + direct/timothy_tests/mirror_tests/Makefile | 117 ---- direct/timothy_tests/mirror_tests/README.txt | 24 - direct/timothy_tests/mirror_tests/current_bugs.txt | 5 - direct/timothy_tests/mirror_tests/lib.c | 141 ----- direct/timothy_tests/mirror_tests/lib.h | 53 -- .../timothy_tests/mirror_tests/linux_test_open.c | 38 -- .../timothy_tests/mirror_tests/linux_test_open.h | 24 - .../mirror_tests/linux_test_truncate.c | 27 - .../mirror_tests/linux_test_truncate.h | 27 - .../timothy_tests/mirror_tests/linux_test_unlink.c | 33 -- .../timothy_tests/mirror_tests/linux_test_unlink.h | 26 - .../timothy_tests/mirror_tests/linux_test_write.c | 37 -- .../timothy_tests/mirror_tests/linux_test_write.h | 27 - direct/timothy_tests/mirror_tests/mirror_tests.c | 601 --------------------- direct/timothy_tests/mirror_tests/mirror_tests.h | 61 --- .../timothy_tests/mirror_tests/yaffs_test_open.c | 38 -- .../timothy_tests/mirror_tests/yaffs_test_open.h | 26 - .../mirror_tests/yaffs_test_truncate.c | 27 - .../mirror_tests/yaffs_test_truncate.h | 26 - .../timothy_tests/mirror_tests/yaffs_test_unlink.c | 34 -- .../timothy_tests/mirror_tests/yaffs_test_unlink.h | 26 - .../timothy_tests/mirror_tests/yaffs_test_write.c | 85 --- .../timothy_tests/mirror_tests/yaffs_test_write.h | 27 - direct/timothy_tests/quick_tests/Makefile | 10 +- direct/timothy_tests/quick_tests/README.txt | 16 +- direct/timothy_tests/quick_tests/current_bugs.txt | 28 - direct/timothy_tests/stress_tester/Makefile | 122 +++++ direct/timothy_tests/stress_tester/README.txt | 8 + direct/timothy_tests/stress_tester/error_handler.c | 84 +++ direct/timothy_tests/stress_tester/error_handler.h | 23 + .../timothy_tests/stress_tester/message_buffer.c | 112 ++++ .../timothy_tests/stress_tester/message_buffer.h | 49 ++ direct/timothy_tests/stress_tester/yaffs_tester.c | 384 +++++++++++++ direct/timothy_tests/stress_tester/yaffs_tester.h | 48 ++ direct/timothy_tests/threading/Makefile | 6 +- direct/timothy_tests/threading/README.txt | 12 + .../yaffs_and_linux_mirror_tests/Makefile | 119 ++++ .../yaffs_and_linux_mirror_tests/README.txt | 27 + .../yaffs_and_linux_mirror_tests/lib.c | 141 +++++ .../yaffs_and_linux_mirror_tests/lib.h | 53 ++ .../yaffs_and_linux_mirror_tests/linux_test_open.c | 38 ++ .../yaffs_and_linux_mirror_tests/linux_test_open.h | 24 + .../linux_test_truncate.c | 27 + .../linux_test_truncate.h | 27 + .../linux_test_unlink.c | 33 ++ .../linux_test_unlink.h | 26 + .../linux_test_write.c | 37 ++ .../linux_test_write.h | 27 + .../yaffs_and_linux_mirror_tests/mirror_tests.c | 601 +++++++++++++++++++++ .../yaffs_and_linux_mirror_tests/mirror_tests.h | 61 +++ .../yaffs_and_linux_mirror_tests/yaffs_test_open.c | 38 ++ .../yaffs_and_linux_mirror_tests/yaffs_test_open.h | 26 + .../yaffs_test_truncate.c | 27 + .../yaffs_test_truncate.h | 26 + .../yaffs_test_unlink.c | 34 ++ .../yaffs_test_unlink.h | 26 + .../yaffs_test_write.c | 85 +++ .../yaffs_test_write.h | 27 + 73 files changed, 2666 insertions(+), 2388 deletions(-) delete mode 100644 direct/timothy_tests/dev/Makefile delete mode 100644 direct/timothy_tests/dev/error_handler.c delete mode 100644 direct/timothy_tests/dev/error_handler.h delete mode 100644 direct/timothy_tests/dev/message_buffer.c delete mode 100644 direct/timothy_tests/dev/message_buffer.h delete mode 100644 direct/timothy_tests/dev/yaffs_tester.c delete mode 100644 direct/timothy_tests/dev/yaffs_tester.h create mode 100644 direct/timothy_tests/handle_tests/README.txt create mode 100644 direct/timothy_tests/is_yaffs_working_tests/Makefile create mode 100644 direct/timothy_tests/is_yaffs_working_tests/README.txt create mode 100644 direct/timothy_tests/is_yaffs_working_tests/test_1_yaffs_mount.c delete mode 100644 direct/timothy_tests/mirror_tests/Makefile delete mode 100644 direct/timothy_tests/mirror_tests/README.txt delete mode 100644 direct/timothy_tests/mirror_tests/current_bugs.txt delete mode 100644 direct/timothy_tests/mirror_tests/lib.c delete mode 100644 direct/timothy_tests/mirror_tests/lib.h delete mode 100644 direct/timothy_tests/mirror_tests/linux_test_open.c delete mode 100644 direct/timothy_tests/mirror_tests/linux_test_open.h delete mode 100644 direct/timothy_tests/mirror_tests/linux_test_truncate.c delete mode 100644 direct/timothy_tests/mirror_tests/linux_test_truncate.h delete mode 100644 direct/timothy_tests/mirror_tests/linux_test_unlink.c delete mode 100644 direct/timothy_tests/mirror_tests/linux_test_unlink.h delete mode 100644 direct/timothy_tests/mirror_tests/linux_test_write.c delete mode 100644 direct/timothy_tests/mirror_tests/linux_test_write.h delete mode 100644 direct/timothy_tests/mirror_tests/mirror_tests.c delete mode 100644 direct/timothy_tests/mirror_tests/mirror_tests.h delete mode 100644 direct/timothy_tests/mirror_tests/yaffs_test_open.c delete mode 100644 direct/timothy_tests/mirror_tests/yaffs_test_open.h delete mode 100644 direct/timothy_tests/mirror_tests/yaffs_test_truncate.c delete mode 100644 direct/timothy_tests/mirror_tests/yaffs_test_truncate.h delete mode 100644 direct/timothy_tests/mirror_tests/yaffs_test_unlink.c delete mode 100644 direct/timothy_tests/mirror_tests/yaffs_test_unlink.h delete mode 100644 direct/timothy_tests/mirror_tests/yaffs_test_write.c delete mode 100644 direct/timothy_tests/mirror_tests/yaffs_test_write.h delete mode 100644 direct/timothy_tests/quick_tests/current_bugs.txt create mode 100644 direct/timothy_tests/stress_tester/Makefile create mode 100644 direct/timothy_tests/stress_tester/README.txt create mode 100644 direct/timothy_tests/stress_tester/error_handler.c create mode 100644 direct/timothy_tests/stress_tester/error_handler.h create mode 100644 direct/timothy_tests/stress_tester/message_buffer.c create mode 100644 direct/timothy_tests/stress_tester/message_buffer.h create mode 100644 direct/timothy_tests/stress_tester/yaffs_tester.c create mode 100644 direct/timothy_tests/stress_tester/yaffs_tester.h create mode 100644 direct/timothy_tests/threading/README.txt create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/Makefile create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/README.txt create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/lib.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/lib.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_open.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_open.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_truncate.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_truncate.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_unlink.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_unlink.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_write.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_write.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/mirror_tests.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/mirror_tests.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_open.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_open.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_truncate.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_truncate.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_unlink.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_unlink.h create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_write.c create mode 100644 direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_write.h diff --git a/direct/timothy_tests/dev/Makefile b/direct/timothy_tests/dev/Makefile deleted file mode 100644 index 6e774ab..0000000 --- a/direct/timothy_tests/dev/Makefile +++ /dev/null @@ -1,120 +0,0 @@ -# Makefile for YAFFS direct stress tests -# -# -# YAFFS: Yet another Flash File System. A NAND-flash specific file system. -# -# Copyright (C) 2003-2010 Aleph One Ltd. -# -# -# Created by Charles Manning -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# NB Warning this Makefile does not include header dependencies. -# -# $Id: Makefile,v 1.7 2010-02-25 22:34:47 charles Exp $ - -#EXTRA_COMPILE_FLAGS = -DYAFFS_IGNORE_TAGS_ECC - -CFLAGS = -DCONFIG_YAFFS_DIRECT -DCONFIG_YAFFS_SHORT_NAMES_IN_RAM -DCONFIG_YAFFS_YAFFS2 -CFLAGS += -DCONFIG_YAFFS_PROVIDE_DEFS -DCONFIG_YAFFSFS_PROVIDE_VALUES -CFLAGS += -Wall -g $(EXTRA_COMPILE_FLAGS) -Wstrict-aliasing -#CFLAGS += -fno-strict-aliasing -CFLAGS += -O0 -CFLAGS += -Wextra -Wpointer-arith -#CFLAGS += -DCONFIG_YAFFS_VALGRIND_TEST - -#CFLAGS+= -Wshadow -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wmissing-declarations -#CFLAGS+= -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline - -COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o\ - yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ - yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ - yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ - yaffs_checkptrw.o yaffs_qsort.o\ - yaffs_nameval.o yaffs_attribs.o \ - yaffs_norif1.o ynorsim.o \ - yaffs_allocator.o \ - yaffs_bitmap.o \ - yaffs_yaffs1.o \ - yaffs_yaffs2.o \ - yaffs_verify.o - - -SSCOMMONTESTOBJS = yaffscfg2k.o yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ - yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ - yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ - yaffs_attribs.o yaffs_allocator.o \ - yaffs_checkptrw.o yaffs_qsort.o\ - yaffs_nameval.o \ - yaffs_norif1.o ynorsim.o \ - yaffs_allocator.o \ - yaffs_bitmap.o \ - yaffs_yaffs1.o \ - yaffs_yaffs2.o \ - yaffs_verify.o - -# yaffs_checkptrwtest.o\ - -YAFFSTESTOBJS = $(COMMONTESTOBJS) yaffs_tester.o message_buffer.o error_handler.o - - -ALLOBJS = $(sort $(YAFFSTESTOBJS)) - -YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ - yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ - yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ - yaffs_checkptrw.h yaffs_checkptrw.c \ - yaffs_nameval.c yaffs_nameval.h \ - yaffs_trace.h yaffs_attribs.h \ - yaffs_allocator.c yaffs_allocator.h \ - yaffs_yaffs1.c yaffs_yaffs1.h \ - yaffs_yaffs2.c yaffs_yaffs2.h \ - yaffs_bitmap.c yaffs_bitmap.h \ - yaffs_verify.c yaffs_verify.h - -YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ - yaffsfs.h yaffs_osglue.h ydirectenv.h \ - yaffs_flashif.c yaffscfg.h yaffs_qsort.c \ - yaffs_nandemul2k.h yaffs_list.h \ - yaffs_attribs.c \ - yaffs_nandif.c yaffs_nandif.h yportenv.h \ - yaffs_hweight.c yaffs_hweight.h - - -DIRECTEXTRASYMLINKS = yaffscfg2k.c yaffs_fileem2k.c yaffs_fileem2k.h\ - yaffs_fileem.c yaffs_norif1.c yaffs_norif1.h \ - yaffs_ramdisk.c yaffs_ramdisk.h yaffs_ramem2k.c \ - ynorsim.h ynorsim.c yaffs_osglue.c - -SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS) $(DIRECTEXTRASYMLINKS) -#all: directtest2k boottest - -all: yaffs_tester - -$(ALLOBJS): %.o: %.c - gcc -c $(CFLAGS) -o $@ $< - - -$(YAFFSSYMLINKS): - ln -s ../../../$@ $@ - -$(YAFFSDIRECTSYMLINKS): - ln -s ../../$@ $@ - -$(DIRECTEXTRASYMLINKS): - ln -s ../../basic-test/$@ $@ - - -yaffs_tester: $(SYMLINKS) $(YAFFSTESTOBJS) - gcc $(CFLLAG) -o $@ $(YAFFSTESTOBJS) - - - - - - -clean: - rm -f yaffs_tester $(ALLOBJS) core $(SYMLINKS) log.txt diff --git a/direct/timothy_tests/dev/error_handler.c b/direct/timothy_tests/dev/error_handler.c deleted file mode 100644 index a9152f3..0000000 --- a/direct/timothy_tests/dev/error_handler.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -/* - * error_handler.c contains code for checking yaffs function calls for errors. - */ -#include "error_handler.h" - - -typedef struct error_codes_template { - int code; - char * text; -}error_entry; - -const error_entry error_list[] = { - { ENOMEM , "ENOMEM" }, - { EBUSY , "EBUSY"}, - { ENODEV , "ENODEV"}, - { EINVAL , "EINVAL"}, - { EBADF , "EBADF"}, - { EACCES , "EACCES"}, - { EXDEV , "EXDEV" }, - { ENOENT , "ENOENT"}, - { ENOSPC , "ENOSPC"}, - { ERANGE , "ERANGE"}, - { ENODATA, "ENODATA"}, - { ENOTEMPTY, "ENOTEMPTY"}, - { ENAMETOOLONG,"ENAMETOOLONG"}, - { ENOMEM , "ENOMEM"}, - { EEXIST , "EEXIST"}, - { ENOTDIR , "ENOTDIR"}, - { EISDIR , "EISDIR"}, - { 0, NULL } -}; - -const char * error_to_str(int err) -{ - error_entry *e = error_list; - if (err < 0) - err = -err; - while(e->code && e->text){ - if(err == e->code) - return e->text; - e++; - } - return "Unknown error code"; -} - -void yaffs_check_for_errors(char output, buffer *message_buffer,char error_message[],char success_message[]){ - char dummy[10]; - unsigned int x=0; - int yaffs_error=-1; - char error_found=0; - if (output==-1) - { - add_to_buffer(message_buffer, "\nerror##########",MESSAGE_LEVEL_ERROR,PRINT); - add_to_buffer(message_buffer, error_message,MESSAGE_LEVEL_ERROR,PRINT); - add_to_buffer(message_buffer, "error_code: ",MESSAGE_LEVEL_ERROR,NPRINT); - yaffs_error=yaffs_get_error(); - append_int_to_buffer(message_buffer, yaffs_error,MESSAGE_LEVEL_ERROR,PRINT); - - add_to_buffer(message_buffer, error_to_str(yaffs_error),MESSAGE_LEVEL_ERROR,NPRINT); - append_to_buffer(message_buffer, "\n\n",MESSAGE_LEVEL_ERROR,PRINT); - quit_program(); - //scanf("%c",dummy); /*this line causes a segmentation fault. Need a better way of waiting for a key press*/ - //print_buffer(message_buffer,PRINT_ALL); - - } - else{ - add_to_buffer(message_buffer, success_message,MESSAGE_LEVEL_BASIC_TASKS,PRINT); - } -} - - diff --git a/direct/timothy_tests/dev/error_handler.h b/direct/timothy_tests/dev/error_handler.h deleted file mode 100644 index 979f020..0000000 --- a/direct/timothy_tests/dev/error_handler.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __error_handler_h__ -#define __error_handler_h__ -#include -#include "message_buffer.h" -#include "yaffsfs.h" -#define DEBUG_LEVEL 5 /*set the debug level. this is used to display the relevent debug messages*/ -void yaffs_check_for_errors(char output, buffer *message_buffer, char error_message[], char success_message[]); -#endif diff --git a/direct/timothy_tests/dev/message_buffer.c b/direct/timothy_tests/dev/message_buffer.c deleted file mode 100644 index adefbf8..0000000 --- a/direct/timothy_tests/dev/message_buffer.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -/* - * message_buffer.c contains code for a message buffer . - */ - -#include "message_buffer.h" - -void append_to_buffer(buffer *p_Buffer, char *message,char message_level,char print){ - /*wrapper function for add_to_buffer_root_function*/ - add_to_buffer_root_function(p_Buffer,message, message_level,APPEND_MESSAGE,print); -} - -void add_to_buffer(buffer *p_Buffer, char *message,char message_level,char print){ - /*wrapper function for add_to_buffer_root_function*/ - add_to_buffer_root_function(p_Buffer,message, message_level,DO_NOT_APPEND_MESSAGE,print); -} - -void add_int_to_buffer(buffer *p_Buffer, int num,char message_level,char print){ - char message[20]; - sprintf(message, "%d",num); - add_to_buffer_root_function(p_Buffer,message, message_level,DO_NOT_APPEND_MESSAGE,print); -} - -void append_int_to_buffer(buffer *p_Buffer, int num,char message_level,char print){ - char message[20]; - sprintf(message, "%d",num); - add_to_buffer_root_function(p_Buffer,message, message_level,APPEND_MESSAGE,print); -} - - -void add_to_buffer_root_function(buffer *p_Buffer, char *message,char message_level,char append,char print){ - FILE *log_handle; - - if (append==APPEND_MESSAGE){ /* append current message*/ - strncat(p_Buffer->message[p_Buffer->head],message,BUFFER_MESSAGE_LENGTH); - } - else { - - /*move the head up one. the head always points at the last written data*/ - p_Buffer->head++; - - /*printf("p_Buffer->tail=%d\n",p_Buffer->tail);*/ - /*printf("p_Buffer->head=%d\n",p_Buffer->head);*/ - if (p_Buffer->head >=BUFFER_SIZE-1) { - /*printf("buffer overflow\n");*/ - p_Buffer->head -= (BUFFER_SIZE-1); /*wrap the head around the buffer*/ - /*printf("new p_Buffer->head=%d\n",p_Buffer->head);*/ - } - /*if the buffer is full then delete last entry by moving the tail*/ - if (p_Buffer->head==p_Buffer->tail){ - /*printf("moving buffer tail from %d to ",p_Buffer->tail);*/ - p_Buffer->tail++; - if (p_Buffer->tail >=BUFFER_SIZE) p_Buffer->tail -= BUFFER_SIZE;/*wrap the tail around the buffer*/ - /*printf("%d\n",p_Buffer->tail);*/ - - } - - p_Buffer->message_level[p_Buffer->head]=message_level; /*copy the message level*/ - strncpy(p_Buffer->message[p_Buffer->head],message,BUFFER_MESSAGE_LENGTH); /*copy the message*/ - /*printf("copied %s into p_Buffer->message[p_Buffer->head]: %s\n",message,p_Buffer->message[p_Buffer->head]); - printf("extra %s\n",p_Buffer->message[p_Buffer->head]);*/ - } - if ((p_Buffer->message_level[p_Buffer->head]<=DEBUG_LEVEL)&& (print==PRINT)){ - /*printf("printing buffer 1\n"); - // the print buffer function is not working this is just a quick fix - print_buffer(p_Buffer,1); //if the debug level is higher enough then print the new message - */ - printf("%s\n",p_Buffer->message[p_Buffer->head]); - log_handle=fopen(LOG_FILE,"a"); - if (log_handle!=NULL){ - fputs(p_Buffer->message[p_Buffer->head],log_handle); - fputs("\n",log_handle); - fclose(log_handle); - } - } -} - - - -void print_buffer(buffer *p_Buffer, int number_of_messages_to_print){ - int x=0; - int i=0; - printf("print buffer\n"); - printf("buffer head:%d\n",p_Buffer->head); - printf("buffer tail:%d\n",p_Buffer->tail); - - if (number_of_messages_to_print==PRINT_ALL) number_of_messages_to_print=BUFFER_SIZE; -// printf("number_of_messages_to_print=%d\n",number_of_messages_to_print); - for (i=0,x=0; (x>=p_Buffer->tail) && (imessage[p_Buffer->head]); - printf("printed buffer\n"); - } - -} - - - diff --git a/direct/timothy_tests/dev/message_buffer.h b/direct/timothy_tests/dev/message_buffer.h deleted file mode 100644 index 55f9e10..0000000 --- a/direct/timothy_tests/dev/message_buffer.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __message_buffer__ -#define __message_buffer__ - -#include -#include -#define PRINT 1 -#define NPRINT 0 -#define APPEND_MESSAGE 1 -#define DO_NOT_APPEND_MESSAGE 0 -#define PRINT_ALL -1 /*this is used to print all of the messages in a buffer*/ -#define BUFFER_MESSAGE_LENGTH 60 /*number of char in message*/ -#define BUFFER_SIZE 50 /*number of messages in buffer*/ -#define MESSAGE_LEVEL_ERROR 0 -#define MESSAGE_LEVEL_BASIC_TASKS 1 - -#define LOG_FILE "log.txt" -typedef struct buffer_template{ - char message[BUFFER_SIZE][BUFFER_MESSAGE_LENGTH]; - int head; - int tail; - char message_level[BUFFER_SIZE]; -}buffer; -#include "error_handler.h" /*include this for the debug level*/ - - -void print_buffer(buffer *p_Buffer,int number_of_messages_to_print); /*print messages in the buffer*/ -/*wrapper functions for add_to_buffer_root_function*/ -void add_to_buffer(buffer *p_Buffer, char *message,char message_level,char print); -void append_to_buffer(buffer *p_Buffer, char *message,char message_level,char print); -void add_int_to_buffer(buffer *p_Buffer, int num,char message_level,char print); -void append_int_to_buffer(buffer *p_Buffer, int num,char message_level,char print); - -void add_to_buffer_root_function(buffer *p_Buffer, char *message,char message_level,char append,char print); -#endif diff --git a/direct/timothy_tests/dev/yaffs_tester.c b/direct/timothy_tests/dev/yaffs_tester.c deleted file mode 100644 index 65d2d17..0000000 --- a/direct/timothy_tests/dev/yaffs_tester.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -/* - * yaffs_tester.c designed to stress test yaffs2 direct. - */ - - -#include "yaffs_tester.h" - - - -int random_seed; -int simulate_power_failure = 0; - - -buffer message_buffer; /*create message_buffer */ - -char yaffs_test_dir[] ="/yaffs2/test_dir"; /*the path to the directory where all of the testing will take place*/ -char yaffs_mount_dir[]="/yaffs2/"; /*the path to the mount point which yaffs will mount*/ - - -int main(int argc, char *argv[]){ - - - init(yaffs_test_dir,yaffs_mount_dir,argc,argv); - test(yaffs_test_dir); - yaffs_unmount(yaffs_mount_dir); - return 0; -} - - - -void init(char *yaffs_test_dir,char *yaffs_mount_dir,int argc, char *argv[]){ - char output=0; - int x=0; - int seed=-1; - FILE *log_handle; - /*these variables are already set to zero, but it is better not to take chances*/ - message_buffer.head=0; - message_buffer.tail=0; - - - log_handle=fopen(LOG_FILE,"w"); - if (log_handle!=NULL){ - fputs("log file for yaffs tester\n",log_handle); - fclose(log_handle); - } - add_to_buffer(&message_buffer,"welcome to the yaffs tester",MESSAGE_LEVEL_BASIC_TASKS,PRINT);/* print boot up message*/ - yaffs_start_up(); - yaffs_mount(yaffs_mount_dir); - for (x=0;xnumber_of_open_handles,MESSAGE_LEVEL_BASIC_TASKS,PRINT); - if (P_open_handles_array->number_of_open_handleshandle[x]!=-3 && xhandle[x]=output; - P_open_handles_array->path[x][0]='\0'; - strcat(P_open_handles_array->path[x],path); - add_to_buffer(&message_buffer,"yaffs handle: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_int_to_buffer(&message_buffer,output,MESSAGE_LEVEL_BASIC_TASKS,PRINT); - add_to_buffer(&message_buffer,"stored handle: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - - //yaffs_open will return a null pointer if it cannot open a file. check for errors will not work. - yaffs_check_for_errors(output, &message_buffer,"failed to open file","opened file"); - - P_open_handles_array->number_of_open_handles++; - } - else close_random_file(P_open_handles_array); - -} - -void write_to_random_file(handle_regster *P_open_handles_array){ - int number_of_lines_of_text=0; - int length=100; - char text[length+1]; - text[0]='\0'; - int seek=0; - int x=0; - int output=0; - if (P_open_handles_array->number_of_open_handles>0){ - - while (P_open_handles_array->handle[x]==-3){ /*find a random open handle*/ - x=rand() % (MAX_NUMBER_OF_OPENED_HANDLES-1); - } - add_to_buffer(&message_buffer,"\n\ntrying to write to ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_to_buffer(&message_buffer,P_open_handles_array->path[x],MESSAGE_LEVEL_BASIC_TASKS,PRINT); - - stat_file(P_open_handles_array->path[x]); - number_of_lines_of_text=rand() %1000; - add_to_buffer(&message_buffer,"writing ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_int_to_buffer(&message_buffer,number_of_lines_of_text,MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_to_buffer(&message_buffer," lines of text",MESSAGE_LEVEL_BASIC_TASKS,PRINT); - - - for (;number_of_lines_of_text>0;number_of_lines_of_text--) - { - generate_random_string(text,length); - seek=rand()%1000; - add_to_buffer(&message_buffer,"trying to seek to ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_int_to_buffer(&message_buffer,seek,MESSAGE_LEVEL_BASIC_TASKS,PRINT); - output=yaffs_lseek(P_open_handles_array->handle[x],seek,SEEK_SET); - yaffs_check_for_errors(output, &message_buffer,"failed to seek","seeked file"); - add_to_buffer(&message_buffer,"trying to write to file",MESSAGE_LEVEL_BASIC_TASKS,PRINT); - output=yaffs_write(P_open_handles_array->handle[x], text, strlen(text)); - yaffs_check_for_errors(output, &message_buffer,"failed to write text","wrote text"); - - } - } -} - -void truncate_random_file(handle_regster *P_open_handles_array){ - int x=0; - int truncate_size=0; - int output=0; - - if (P_open_handles_array->number_of_open_handles>0){ - add_to_buffer(&message_buffer,"\n\ntruncate function ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - while (P_open_handles_array->handle[x]==-3){ /*find a random open handle*/ - x=rand() % (MAX_NUMBER_OF_OPENED_HANDLES-1); - } - add_to_buffer(&message_buffer,"trying to truncate ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_to_buffer(&message_buffer,P_open_handles_array->path[x],MESSAGE_LEVEL_BASIC_TASKS,PRINT); - - stat_file(P_open_handles_array->path[x]); - truncate_size=rand() %10000; - output=yaffs_ftruncate(P_open_handles_array->handle[x], truncate_size); - yaffs_check_for_errors(output, &message_buffer,"failed to truncate file","truncated file"); - } -} - -void close_random_file(handle_regster *P_open_handles_array){ - /*run out of space on the handle pointer array*/ - /*make space*/ - int x=0; - int output=0; - int start=0; - if (P_open_handles_array->number_of_open_handles>0){ - start=rand() % (MAX_NUMBER_OF_OPENED_HANDLES-1); - for (x=start;P_open_handles_array->handle[x] !=-3 &&(x+1>start ||xMAX_NUMBER_OF_OPENED_HANDLES-1) x=0; - - } - if (P_open_handles_array->handle[x]!=-3) - { - add_to_buffer(&message_buffer,"\n\ntrying to close file: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_to_buffer(&message_buffer,P_open_handles_array->path[x],MESSAGE_LEVEL_BASIC_TASKS,PRINT); - add_to_buffer(&message_buffer,"file handle: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_int_to_buffer(&message_buffer,P_open_handles_array->handle[x],MESSAGE_LEVEL_BASIC_TASKS,PRINT); - - stat_file(P_open_handles_array->path[x]); - output=yaffs_close(P_open_handles_array->handle[x]); - - if (output==-1) yaffs_check_for_errors(output, &message_buffer,"failed to close file","closed file"); - else { - yaffs_check_for_errors(output, &message_buffer,"failed to close file","closed file"); - P_open_handles_array->handle[x]=-3; - P_open_handles_array->path[x][0]='\0'; - P_open_handles_array->number_of_open_handles--; - } - } - else { - add_to_buffer(&message_buffer,"\n\ntried to close file but could not find a open file ",MESSAGE_LEVEL_BASIC_TASKS,PRINT); - } - } -} - -void stat_file(char *path){ - int output=0; - struct yaffs_stat stat; - if (yaffs_access(path,0)==0){ - add_to_buffer(&message_buffer,"file exists, trying to stat: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - add_to_buffer(&message_buffer,path,MESSAGE_LEVEL_BASIC_TASKS,PRINT); - output=yaffs_lstat(path,&stat); - yaffs_check_for_errors(output, &message_buffer,"failed to stat file","statted file"); - //stat.st_ino,(int)stat.st_size,stat.st_mode - add_to_buffer(&message_buffer,"yaffs inode: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_int_to_buffer(&message_buffer,stat.st_ino,MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_to_buffer(&message_buffer," file size: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_int_to_buffer(&message_buffer,(int)stat.st_size,MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_to_buffer(&message_buffer," file mode: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_int_to_buffer(&message_buffer,stat.st_mode,MESSAGE_LEVEL_BASIC_TASKS,PRINT); - } - else{ - add_to_buffer(&message_buffer,path,MESSAGE_LEVEL_BASIC_TASKS,NPRINT); - append_to_buffer(&message_buffer," does not exist,could not stat",MESSAGE_LEVEL_BASIC_TASKS,PRINT); - } -} - -void test(char*yaffs_test_dir){ - struct yaffs_stat stat; - int output=0; - //char name[MAX_FILE_NAME_SIZE+3 ]="apple\0"; - //char path[MAX_FILE_NAME_SIZE]; - handle_regster open_handles_array; - //int handle_pointers[MAX_NUMBER_OF_OPENED_HANDLES]; - //int number_of_opened_handles=0; - int x=0; - - - open_handles_array.number_of_open_handles=0; - for (x=0;x2 ; x++) - { - //printf("x=%d\n",x); - /* keep generating a charecter until the charecter is legal*/ - while((letter=='\0' )||(letter=='/')||(letter=='\\')){ - letter=(rand() % 126-32)+32; /*generate a number between 32 and 126 and uses it as a charecter (letter) */ - } - ptr[x]=letter; - //printf("charecter generated is %c\n",ptr[x]); - } - ptr[x+1]='\0'; /*adds NULL charecter to turn it into a string*/ - -} - diff --git a/direct/timothy_tests/dev/yaffs_tester.h b/direct/timothy_tests/dev/yaffs_tester.h deleted file mode 100644 index a703175..0000000 --- a/direct/timothy_tests/dev/yaffs_tester.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __YAFFS_TESTER_H__ - #define __YAFFS_TESTER_H__ - -#include -#include -#include -#include - -#include "yaffsfs.h" /* it is in "yaffs2/direct/" link it in the Makefile */ -#include "message_buffer.h" -#include "error_handler.h" - -#define MAX_NUMBER_OF_OPENED_HANDLES 50 -#define MAX_FILE_NAME_SIZE 51 - -typedef struct handle_regster_template{ - int handle[MAX_NUMBER_OF_OPENED_HANDLES]; - char path[MAX_NUMBER_OF_OPENED_HANDLES][100]; - int number_of_open_handles; -}handle_regster; - - -void init(char *yaffs_test_dir,char *yaffs_mount_dir,int argc, char *argv[]); /*sets up yaffs and mounts yaffs */ -void test(char *yaffs_test_dir); /*contains the test code*/ -void generate_random_string(char *ptr,int length_of_str); /*generates a random string of letters to be used for a name*/ -void join_paths(char *path1,char *path2,char *newpath ); -void copy_array(char *from,char *to, unsigned int from_offset,unsigned int to_offset); -void stat_file(char *path); -void write_to_random_file(handle_regster *P_open_handles_array); -void close_random_file(handle_regster *P_open_handles_array); -void quit_program(); -void truncate_random_file(handle_regster *P_open_handles_array); -#endif diff --git a/direct/timothy_tests/handle_tests/Makefile b/direct/timothy_tests/handle_tests/Makefile index 8ca9c1d..a2e9a5e 100644 --- a/direct/timothy_tests/handle_tests/Makefile +++ b/direct/timothy_tests/handle_tests/Makefile @@ -42,7 +42,8 @@ COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ yaffs_yaffs1.o \ yaffs_yaffs2.o \ yaffs_verify.o \ - yaffs_error.o + yaffs_error.o \ + yaffs_summary.o # yaffs_checkptrwtest.o\ @@ -66,7 +67,8 @@ YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscomp yaffs_yaffs1.c yaffs_yaffs1.h \ yaffs_yaffs2.c yaffs_yaffs2.h \ yaffs_bitmap.c yaffs_bitmap.h \ - yaffs_verify.c yaffs_verify.h + yaffs_verify.c yaffs_verify.h \ + yaffs_summary.c yaffs_summary.h YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ yaffsfs.h ydirectenv.h \ diff --git a/direct/timothy_tests/handle_tests/README.txt b/direct/timothy_tests/handle_tests/README.txt new file mode 100644 index 0000000..bce7a6c --- /dev/null +++ b/direct/timothy_tests/handle_tests/README.txt @@ -0,0 +1,7 @@ +handle_tests.c opens and closes random handles, in an effot to stress test yaffs. + +Command line options: + No commands. + +compile command: make +run command: ./handle_test diff --git a/direct/timothy_tests/is_yaffs_working_tests/Makefile b/direct/timothy_tests/is_yaffs_working_tests/Makefile new file mode 100644 index 0000000..8cc1f44 --- /dev/null +++ b/direct/timothy_tests/is_yaffs_working_tests/Makefile @@ -0,0 +1,115 @@ +# Makefile for YAFFS direct stress tests +# +# +# YAFFS: Yet another Flash File System. A NAND-flash specific file system. +# +# Copyright (C) 2003-2010 Aleph One Ltd. +# +# +# Created by Charles Manning +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# NB Warning this Makefile does not include header dependencies. +# +# $Id: Makefile,v 1.7 2010-02-25 22:34:47 charles Exp $ + +#EXTRA_COMPILE_FLAGS = -DYAFFS_IGNORE_TAGS_ECC + +CFLAGS = -DCONFIG_YAFFS_DIRECT -DCONFIG_YAFFS_YAFFS2 +CFLAGS += -DCONFIG_YAFFS_PROVIDE_DEFS -DCONFIG_YAFFSFS_PROVIDE_VALUES +CFLAGS += -Wall -g $(EXTRA_COMPILE_FLAGS) -Wstrict-aliasing +#CFLAGS += -fno-strict-aliasing +CFLAGS += -O0 +CFLAGS += -Wextra -Wpointer-arith +#CFLAGS += -DCONFIG_YAFFS_VALGRIND_TEST + +#CFLAGS+= -Wshadow -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wmissing-declarations +#CFLAGS+= -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline + + +COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ + yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ + yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ + yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ + yaffs_checkptrw.o yaffs_qsort.o\ + yaffs_nameval.o yaffs_attribs.o \ + yaffs_norif1.o ynorsim.o \ + yaffs_allocator.o \ + yaffs_bitmap.o \ + yaffs_yaffs1.o \ + yaffs_yaffs2.o \ + yaffs_verify.o \ + yaffs_error.o \ + yaffs_summary.o + +# yaffs_checkptrwtest.o\ + +TESTFILES = test_1_yaffs_mount.o + + + + +YAFFSTESTOBJS = $(COMMONTESTOBJS) $(TESTFILES) + + +ALLOBJS = $(sort $(YAFFSTESTOBJS)) $(PYTHONOBJS) + +YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ + yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ + yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ + yaffs_checkptrw.h yaffs_checkptrw.c \ + yaffs_nameval.c yaffs_nameval.h \ + yaffs_trace.h yaffs_attribs.h \ + yaffs_allocator.c yaffs_allocator.h \ + yaffs_yaffs1.c yaffs_yaffs1.h \ + yaffs_yaffs2.c yaffs_yaffs2.h \ + yaffs_bitmap.c yaffs_bitmap.h \ + yaffs_verify.c yaffs_verify.h \ + yaffs_summary.c yaffs_summary.h + +YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ + yaffsfs.h ydirectenv.h \ + yaffs_flashif.c yaffscfg.h yaffs_qsort.c \ + yaffs_nandemul2k.h yaffs_list.h \ + yaffs_attribs.c yaffs_osglue.h \ + yaffs_nandif.c yaffs_nandif.h yportenv.h \ + yaffs_hweight.h yaffs_hweight.c \ + yaffs_error.c + + +DIRECTEXTRASYMLINKS = yaffscfg2k.c yaffs_fileem2k.c yaffs_fileem2k.h\ + yaffs_fileem.c yaffs_norif1.c yaffs_norif1.h \ + yaffs_ramdisk.c yaffs_ramdisk.h yaffs_ramem2k.c \ + ynorsim.h ynorsim.c yaffs_osglue.c + +SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS) $(DIRECTEXTRASYMLINKS) $(PYTONOSYMLINKS) +#all: directtest2k boottest + +all: test_1_yaffs_mount + +$(ALLOBJS): %.o: %.c + gcc -c $(CFLAGS) -o $@ $< + +$(PYTONOSYMLINKS): + ln -s ../../python/$@ $@ + +$(YAFFSSYMLINKS): + ln -s ../../../$@ $@ + +$(YAFFSDIRECTSYMLINKS): + ln -s ../../$@ $@ + +$(DIRECTEXTRASYMLINKS): + ln -s ../../basic-test/$@ $@ + + +test_1_yaffs_mount: $(SYMLINKS) $(ALLOBJS) + gcc $(CFLLAG) -o $@ $(ALLOBJS) + + + +clean: + rm -f test_1_yaffs_mount $(ALLOBJS) core $(SYMLINKS) diff --git a/direct/timothy_tests/is_yaffs_working_tests/README.txt b/direct/timothy_tests/is_yaffs_working_tests/README.txt new file mode 100644 index 0000000..0cdddbd --- /dev/null +++ b/direct/timothy_tests/is_yaffs_working_tests/README.txt @@ -0,0 +1,11 @@ +is_yaffs_working_tests folder contains the very simple tests to check that yaffs has been installed properly. + +test_1_yaffs_mount.c mounts yaffs, creates a file, unmounts and then mounts yaffs and checks that the file is still there. + + + +compile command: make +run command: ./test_1_yaffs_mount + +command line options: + No commands. diff --git a/direct/timothy_tests/is_yaffs_working_tests/test_1_yaffs_mount.c b/direct/timothy_tests/is_yaffs_working_tests/test_1_yaffs_mount.c new file mode 100644 index 0000000..b7726ba --- /dev/null +++ b/direct/timothy_tests/is_yaffs_working_tests/test_1_yaffs_mount.c @@ -0,0 +1,97 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + + +#include "yaffsfs.h" +#define YAFFS_MOUNT_POINT "/yaffs2/" +#define FILE_PATH "/yaffs2/foo.txt" + +int random_seed; +int simulate_power_failure = 0; + + +int main() +{ + int output = 0; + int output2 = 0; + yaffs_start_up(); + + printf("\n\n starting test\n"); + yaffs_set_trace(0); + output = yaffs_mount(YAFFS_MOUNT_POINT); + + if (output>=0){ + printf("yaffs mounted: %s\n",YAFFS_MOUNT_POINT); + } else { + printf("error\n yaffs failed to mount: %s\nerror\n",YAFFS_MOUNT_POINT); + return (0); + } + //now create a file. + output = yaffs_open(FILE_PATH,O_CREAT | O_RDWR, S_IREAD | S_IWRITE); + if (output>=0){ + printf("file created: %s\n",FILE_PATH); + } else { + printf("error\n yaffs failed to create the file: %s\nerror\n",FILE_PATH); + return (0); + } + output2 = yaffs_close(output); + if (output2>=0){ + printf("file closed: %s\n",FILE_PATH); + } else { + printf("error\n yaffs failed to close the file: %s\nerror\n",FILE_PATH); + return (0); + } + //unmount and remount the mount point. + output = yaffs_unmount(YAFFS_MOUNT_POINT); + if (output>=0){ + printf("yaffs unmounted: %s\n",YAFFS_MOUNT_POINT); + } else { + printf("error\n yaffs failed to unmount: %s\nerror\n",YAFFS_MOUNT_POINT); + return (0); + } + output = yaffs_mount(YAFFS_MOUNT_POINT); + if (output>=0){ + printf("yaffs mounted: %s\n",YAFFS_MOUNT_POINT); + } else { + printf("error\n yaffs failed to mount: %s\nerror\n",YAFFS_MOUNT_POINT); + return (0); + } + //now open the existing file. + output = yaffs_open(FILE_PATH, O_RDWR, S_IREAD | S_IWRITE); + if (output>=0){ + printf("file created: %s\n",FILE_PATH); + } else { + printf("error\n yaffs failed to create the file: %s\nerror\n",FILE_PATH); + return (0); + } + //close the file. + output2 = yaffs_close(output); + if (output2>=0){ + printf("file closed: %s\n",FILE_PATH); + } else { + printf("error\n yaffs failed to close the file: %s\nerror\n",FILE_PATH); + return (0); + } + + //unmount the mount point. + output = yaffs_unmount(YAFFS_MOUNT_POINT); + if (output>=0){ + printf("yaffs unmounted: %s\n",YAFFS_MOUNT_POINT); + } else { + printf("error\n yaffs failed to unmount: %s\nerror\n",YAFFS_MOUNT_POINT); + return (0); + } + + printf("test passed. yay!\n"); + +} diff --git a/direct/timothy_tests/linux_tests/Makefile b/direct/timothy_tests/linux_tests/Makefile index 6910788..c80ef4d 100644 --- a/direct/timothy_tests/linux_tests/Makefile +++ b/direct/timothy_tests/linux_tests/Makefile @@ -33,8 +33,8 @@ CFLAGS += -Wextra -Wpointer-arith COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ - yaffs_tagscompat.o yaffs_packedtags2.o yaffs_tagsvalidity.o yaffs_nand.o \ - yaffs_checkptrw.o yaffs_qsort.o\ + yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ + yaffs_checkptrw.o yaffs_qsort.o \ yaffs_nameval.o yaffs_attribs.o \ yaffs_norif1.o ynorsim.o \ yaffs_allocator.o \ @@ -42,8 +42,9 @@ COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ yaffs_yaffs1.o \ yaffs_yaffs2.o \ yaffs_verify.o \ - yaffs_error.o - + yaffs_error.o \ + yaffs_summary.o +# yaffs_tagsvalidity.o # yaffs_checkptrwtest.o\ TESTFILES = linux_test.o lib.o @@ -59,14 +60,16 @@ ALLOBJS = $(sort $(YAFFSTESTOBJS)) $(PYTHONOBJS) YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ - yaffs_tagsvalidity.c yaffs_tagsvalidity.h yaffs_checkptrw.h yaffs_checkptrw.c \ + yaffs_checkptrw.h yaffs_checkptrw.c \ yaffs_nameval.c yaffs_nameval.h \ yaffs_trace.h yaffs_attribs.h \ yaffs_allocator.c yaffs_allocator.h \ yaffs_yaffs1.c yaffs_yaffs1.h \ yaffs_yaffs2.c yaffs_yaffs2.h \ yaffs_bitmap.c yaffs_bitmap.h \ - yaffs_verify.c yaffs_verify.h + yaffs_verify.c yaffs_verify.h \ + yaffs_summary.c yaffs_summary.h +#yaffs_tagsvalidity.c yaffs_tagsvalidity.h YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ yaffsfs.h ydirectenv.h \ diff --git a/direct/timothy_tests/linux_tests/README.txt b/direct/timothy_tests/linux_tests/README.txt index 0c3fa84..be8b831 100644 --- a/direct/timothy_tests/linux_tests/README.txt +++ b/direct/timothy_tests/linux_tests/README.txt @@ -1,11 +1,17 @@ +linux_test.c tests yaffs running under linux using the nandsim generator. + + +If a segmentation fault happens during the test then check that +the nandsim has been initilised properly. + How to initilise the nandsim $ make $ sudo -s ...password.. -# now have a root shell +# now you have a root shell $ ./linux-tests/initnandsim 128MiB-2048 $ insmod yaffs2multi.ko $ mkdir /mnt/y @@ -24,7 +30,19 @@ How to clean the folder $ rm -rf /mnt/y -The test must be run in sudo to work +The test must be run in sudo to work to allow the files to be +created in the root folders. -$ make -$ sudo ./linux_test +compile command: make +run command: sudo ./linux_test + +command line options: + -h display the command line options. + -s [number] seeds the rand with the number. + -p [number] sets the print level to the number. + the higher the number the more low level commands are printed. + the number should be between 0 and 5. + -v verbose mode. everything is printed. + -q quite mode. nothing is printed. + + diff --git a/direct/timothy_tests/linux_tests/linux_test.c b/direct/timothy_tests/linux_tests/linux_test.c index 429e74f..e450236 100644 --- a/direct/timothy_tests/linux_tests/linux_test.c +++ b/direct/timothy_tests/linux_tests/linux_test.c @@ -149,6 +149,10 @@ dir_struct * scan_dir(void) open_dir=opendir(ROOT_PATH); + if (open_dir < 0){ + sprintf(message,"failed to find the directory: %s",ROOT_PATH); + print_message(1,message); + } dir_data=readdir(open_dir); while(dir_data){ dir->path_list=linked_list_add_node(HEAD,dir->path_list); diff --git a/direct/timothy_tests/mirror_tests/Makefile b/direct/timothy_tests/mirror_tests/Makefile deleted file mode 100644 index 05e41f4..0000000 --- a/direct/timothy_tests/mirror_tests/Makefile +++ /dev/null @@ -1,117 +0,0 @@ -# Makefile for YAFFS direct stress tests -# -# -# YAFFS: Yet another Flash File System. A NAND-flash specific file system. -# -# Copyright (C) 2003-2010 Aleph One Ltd. -# -# -# Created by Charles Manning -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# NB Warning this Makefile does not include header dependencies. -# -# $Id: Makefile,v 1.7 2010-02-25 22:34:47 charles Exp $ - -#EXTRA_COMPILE_FLAGS = -DYAFFS_IGNORE_TAGS_ECC - -CFLAGS = -DCONFIG_YAFFS_DIRECT -DCONFIG_YAFFS_YAFFS2 -CFLAGS += -DCONFIG_YAFFS_PROVIDE_DEFS -DCONFIG_YAFFSFS_PROVIDE_VALUES -CFLAGS += -Wall -g $(EXTRA_COMPILE_FLAGS) -Wstrict-aliasing -#CFLAGS += -fno-strict-aliasing -CFLAGS += -O0 -CFLAGS += -Wextra -Wpointer-arith -#CFLAGS += -DCONFIG_YAFFS_VALGRIND_TEST - -#CFLAGS+= -Wshadow -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wmissing-declarations -#CFLAGS+= -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline - - -COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ - yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ - yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ - yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ - yaffs_checkptrw.o yaffs_qsort.o\ - yaffs_nameval.o yaffs_attribs.o \ - yaffs_norif1.o ynorsim.o \ - yaffs_allocator.o \ - yaffs_bitmap.o \ - yaffs_yaffs1.o \ - yaffs_yaffs2.o \ - yaffs_verify.o \ - yaffs_error.o - -# yaffs_checkptrwtest.o\ - -TESTFILES = mirror_tests.o lib.o\ - linux_test_open.o yaffs_test_open.o\ - linux_test_truncate.o yaffs_test_truncate.o \ - linux_test_unlink.o yaffs_test_unlink.o \ - linux_test_write.o yaffs_test_write.o - - - - -YAFFSTESTOBJS = $(COMMONTESTOBJS) $(TESTFILES) - - -ALLOBJS = $(sort $(YAFFSTESTOBJS)) $(PYTHONOBJS) - -YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ - yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ - yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ - yaffs_checkptrw.h yaffs_checkptrw.c \ - yaffs_nameval.c yaffs_nameval.h \ - yaffs_trace.h yaffs_attribs.h \ - yaffs_allocator.c yaffs_allocator.h \ - yaffs_yaffs1.c yaffs_yaffs1.h \ - yaffs_yaffs2.c yaffs_yaffs2.h \ - yaffs_bitmap.c yaffs_bitmap.h \ - yaffs_verify.c yaffs_verify.h - -YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ - yaffsfs.h ydirectenv.h \ - yaffs_flashif.c yaffscfg.h yaffs_qsort.c \ - yaffs_nandemul2k.h yaffs_list.h \ - yaffs_attribs.c yaffs_osglue.h \ - yaffs_nandif.c yaffs_nandif.h yportenv.h \ - yaffs_hweight.h yaffs_hweight.c \ - yaffs_error.c - - -DIRECTEXTRASYMLINKS = yaffscfg2k.c yaffs_fileem2k.c yaffs_fileem2k.h\ - yaffs_fileem.c yaffs_norif1.c yaffs_norif1.h \ - yaffs_ramdisk.c yaffs_ramdisk.h yaffs_ramem2k.c \ - ynorsim.h ynorsim.c yaffs_osglue.c - -SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS) $(DIRECTEXTRASYMLINKS) $(PYTONOSYMLINKS) -#all: directtest2k boottest - -all: mirror_tests - -$(ALLOBJS): %.o: %.c - gcc -c $(CFLAGS) -o $@ $< - -$(PYTONOSYMLINKS): - ln -s ../../python/$@ $@ - -$(YAFFSSYMLINKS): - ln -s ../../../$@ $@ - -$(YAFFSDIRECTSYMLINKS): - ln -s ../../$@ $@ - -$(DIRECTEXTRASYMLINKS): - ln -s ../../basic-test/$@ $@ - - -mirror_tests: $(SYMLINKS) $(ALLOBJS) - gcc $(CFLLAG) -o $@ $(ALLOBJS) - - - -clean: - rm -f mirror_tests $(ALLOBJS) core $(SYMLINKS) diff --git a/direct/timothy_tests/mirror_tests/README.txt b/direct/timothy_tests/mirror_tests/README.txt deleted file mode 100644 index 1edc620..0000000 --- a/direct/timothy_tests/mirror_tests/README.txt +++ /dev/null @@ -1,24 +0,0 @@ -Made by Timothy Manning on 24/12/10 - - - mirror_tests is designed to check that yaffs behaves the same way as linux. - This is done by applying the same command to both linux and yaffs and - then checking the output of the functions. - The default place for creating linux files is direct/timothy_tests/mirror_tests/tests/ - This directory is removed and is recreated at the beginning of each test, - However some of the files may be read only and cannot be deleted. - It is much better to remove this directory via the command line. - - rm test/*;rmdir test/;./mirror_tests -n 100 -v - -Command line arguments - -yaffs_path [PATH] //sets the path for yaffs. - -linux_path [PATH] //sets the path for linux. - -p [NUMBER] //sets the print level for mirror_tests. - -v //verbose mode everything is printed - -q //quiet mode nothing is printed. - -n [number] //sets the number of random tests to run. - -s [number] //seeds rand with the number - -t [number] //sets yaffs_trace to the number - -clean //removes emfile and test dir - diff --git a/direct/timothy_tests/mirror_tests/current_bugs.txt b/direct/timothy_tests/mirror_tests/current_bugs.txt deleted file mode 100644 index 8e3251a..0000000 --- a/direct/timothy_tests/mirror_tests/current_bugs.txt +++ /dev/null @@ -1,5 +0,0 @@ - -BUGS - NO Bugs. - - diff --git a/direct/timothy_tests/mirror_tests/lib.c b/direct/timothy_tests/mirror_tests/lib.c deleted file mode 100644 index 079ed25..0000000 --- a/direct/timothy_tests/mirror_tests/lib.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "lib.h" - -static int EXIT_ON_ERROR = 1; -static int PRINT_LEVEL = 2; //This sets the level of detail which is printed. There are 3 levels 0,1,2 and 3 - //0 just prints the number of tests passed and failed. - //1 is the basic print level. it will print the details of a failed test. - //2 will print if a test passes and cleans. -void set_print_level(int new_level) -{ - PRINT_LEVEL=new_level; -} -int get_print_level(void) -{ - return PRINT_LEVEL; -} - -void set_exit_on_error(int num) -{ - EXIT_ON_ERROR=num; -} - -int get_exit_on_error(void) -{ - return EXIT_ON_ERROR; -} - -void display_error(void) -{ - -} - -void get_error_yaffs(void) -{ - int error_code=0; - char message[30]; - message[0]='\0'; - - error_code=yaffs_get_error(); - sprintf(message,"yaffs_error code %d\n",error_code); - print_message(1,message); - sprintf(message,"error is : %s\n",yaffs_error_to_str(error_code)); - print_message(1,message); -} - -void get_error_linux(void) -{ - int error_code=0; - char message[30]; - message[0]='\0'; - - error_code=errno; - sprintf(message,"linux_error code %d\n",error_code); - print_message(1,message); - strcpy(message,"error code"); - sprintf(message,"error is : %s\n",yaffs_error_to_str(error_code)); - //perror(message); - print_message(1,message); -} -void generate_random_string(char *ptr,int length_of_str){ - unsigned int x; - unsigned int length=((rand() %(length_of_str-3))+3); /*creates a int with the number of charecters been between 1 and 51*/ - char letter='\0'; - strcpy(ptr,""); - //printf("generating string\n"); - //printf("string length is %d\n",length); - for (x=0; x <= (length-2) &&length>2 ; x++) - { - //printf("x=%d\n",x); - /* keep generating a charecter until the charecter is legal*/ - while((letter=='\0' )||(letter=='/')||(letter=='\\')){ - letter=(rand() % 125-59)+58; /*generate a number between 32 and 126 and uses it as a charecter (letter) */ - } - ptr[x]=letter; - //printf("charecter generated is %c\n",ptr[x]); - } - ptr[x+1]='\0'; /*adds NULL charecter to turn it into a string*/ - -} - -void join_paths(char *path1,char *path2,char *new_path ) -{ - char message[100]; - print_message(3,"joining paths\n"); - sprintf(message,"path1: %s\n",path1); - print_message(3,message); - sprintf(message,"path2: %s\n",path2); - print_message(3,message); - strcpy(new_path,""); - //strcat(new_path,path1); /*since all functions have this then pull it out*/ - if ( (path1[(sizeof(path1)/sizeof(char))-2]=='/') && path2[0]!='/') { - /*paths are compatiable. concatanate them. note -2 is because of \0*/ - strcat(new_path,path1); - strcat(new_path,path2); - //char new_path[(sizeof(path1)/sizeof(char))+(sizeof(path2)/sizeof(char))]; - //strcpy(new_path,strcat(path1,path2)); - //return new_path; - } else if ((path1[(sizeof(path1)/sizeof(char))-2]!='/') && path2[0]=='/') { - /*paths are compatiable. concatanate them*/ - strcat(new_path,path1); - strcat(new_path,path2); - - } else if ((path1[(sizeof(path1)/sizeof(char))-2]!='/') && path2[0]!='/') { - /*need to add a "/". */ - strcat(new_path,path1); - strcat(new_path,"/"); - strcat(new_path,path2); - - } else if ((path1[(sizeof(path1)/sizeof(char))-2]=='/') && path2[0]=='/') { - /*need to remove a "/". */ - /*yaffs does not mind the extra slash. */ - strcat(new_path,path1); - strcat(new_path,path2); - - } else { - //error - //return -1; - } -} - -void print_message(char print_level,char *message) -{ - if (print_level <= PRINT_LEVEL){ - printf(message); - } -} - - - diff --git a/direct/timothy_tests/mirror_tests/lib.h b/direct/timothy_tests/mirror_tests/lib.h deleted file mode 100644 index 0b33479..0000000 --- a/direct/timothy_tests/mirror_tests/lib.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef _lib_h__ -#define _lib_h__ - -#include -#include -#include "yaffsfs.h" -#include - -typedef struct arg_temp2{ - char char1; - char char2; - char string1[100]; - char string2[100]; - int int1; - int int2; -} arg_temp; - - -typedef struct test_dir_temp -{ - int type_of_test; //used to tell if it is LINUX of YAFFS - char root_path[200]; -} test_dir; -test_dir yaffs_struct,linux_struct; - - - -void generate_random_string(char *ptr,int length_of_str); -void join_paths(char *path1,char *path2,char *new_path ); -void print_message(char print_level, char *message); -void set_print_level(int new_level); -int get_print_level(void); -void set_exit_on_error(int num); -int get_exit_on_error(void); -void display_error(void); -void get_error_yaffs(void); -void get_error_linux(void); -#endif diff --git a/direct/timothy_tests/mirror_tests/linux_test_open.c b/direct/timothy_tests/mirror_tests/linux_test_open.c deleted file mode 100644 index 871dc56..0000000 --- a/direct/timothy_tests/mirror_tests/linux_test_open.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "linux_test_open.h" - -int linux_test_open(arg_temp *args_struct) -{ - char path[250]; - char message[150]; - int output; - join_paths(linux_struct.root_path,args_struct->string1, path ); - sprintf(message,"file path: %s\n",path); - print_message(3,message); - - output= open(path,args_struct->char1 & (O_TRUNC|O_EXCL|O_CREAT|O_APPEND) ,args_struct->char2& (S_IREAD|S_IWRITE)); - if (output>=0){ - output=close(output); - if (output<0) { - print_message(3,"failed to close handle\n"); - return -1; - } else { - return 1; - } - } else { - print_message(3,"failed to open file\n"); - return -1; - } -} diff --git a/direct/timothy_tests/mirror_tests/linux_test_open.h b/direct/timothy_tests/mirror_tests/linux_test_open.h deleted file mode 100644 index 6274934..0000000 --- a/direct/timothy_tests/mirror_tests/linux_test_open.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __linux_test_open_h__ -#define __linux_test_open_h__ -#include -#include -#include -#include "lib.h" - -int linux_test_open(arg_temp *args_struct); -#endif diff --git a/direct/timothy_tests/mirror_tests/linux_test_truncate.c b/direct/timothy_tests/mirror_tests/linux_test_truncate.c deleted file mode 100644 index 94e8959..0000000 --- a/direct/timothy_tests/mirror_tests/linux_test_truncate.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "linux_test_truncate.h" - -int linux_test_truncate(arg_temp *args_struct) -{ - char path[200]; - char message[200]; - int output=0; - join_paths(linux_struct.root_path,args_struct->string1, path ); - sprintf(message,"file path: %s\n",path); - print_message(3,message); - - output=truncate(path,args_struct->int1); - return output; -} diff --git a/direct/timothy_tests/mirror_tests/linux_test_truncate.h b/direct/timothy_tests/mirror_tests/linux_test_truncate.h deleted file mode 100644 index 7ef91d0..0000000 --- a/direct/timothy_tests/mirror_tests/linux_test_truncate.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __linux_test_truncate_h__ -#define __linux_test_truncate_h__ -#include -#include -#include -#include -#include "yaffsfs.h" -#include "lib.h" - -int linux_test_truncate(arg_temp *args_struct); - -#endif diff --git a/direct/timothy_tests/mirror_tests/linux_test_unlink.c b/direct/timothy_tests/mirror_tests/linux_test_unlink.c deleted file mode 100644 index 575e7ae..0000000 --- a/direct/timothy_tests/mirror_tests/linux_test_unlink.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "linux_test_unlink.h" - -int linux_test_unlink(arg_temp *args_struct) -{ - char path[250]; - char message[150]; - int output; - join_paths(linux_struct.root_path,args_struct->string1, path ); - sprintf(message,"file path: %s\n",path); - print_message(3,message); - - output= unlink(path); - - if (output<0) { - print_message(3,"failed to unlink file\n"); - return -1; - } else { - return 1; - } -} diff --git a/direct/timothy_tests/mirror_tests/linux_test_unlink.h b/direct/timothy_tests/mirror_tests/linux_test_unlink.h deleted file mode 100644 index 7572aa8..0000000 --- a/direct/timothy_tests/mirror_tests/linux_test_unlink.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __linux_test_unlink_h__ -#define __linux_test_unlink_h__ -#include -#include -#include -#include "yaffsfs.h" -#include "lib.h" - -int linux_test_unlink(arg_temp *args_struct); - -#endif diff --git a/direct/timothy_tests/mirror_tests/linux_test_write.c b/direct/timothy_tests/mirror_tests/linux_test_write.c deleted file mode 100644 index b46c211..0000000 --- a/direct/timothy_tests/mirror_tests/linux_test_write.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "linux_test_write.h" - -int linux_test_write(arg_temp *args_struct) -{ - char path[200]; - char message[200]; - int output=0; - int handle=-1; - join_paths(linux_struct.root_path,args_struct->string1, path ); - sprintf(message,"trying to write to: %s\nwith mode set to %o \n",path,args_struct->char1 ); - print_message(3,message); - printf("mode S_IREAD %d S_IWRITE %d\n",(args_struct->char2 & S_IREAD),(args_struct->char2 & S_IWRITE)); - handle=open(path,((args_struct->char1 &(O_TRUNC|O_EXCL|O_CREAT|O_APPEND))|O_RDWR),(args_struct->char2&(S_IREAD|S_IWRITE))); - printf("handle %d\n",handle); - if (handle<0){ - print_message(3,"failed to open a handle\n"); - return -1; //handle failed to open - } - sprintf(message,"trying to write: %d bytes into the file\n",strlen(args_struct->string2)); - print_message(3,message); - output=write(handle,args_struct->string2,strlen(args_struct->string2)); - close(handle); - return output; -} diff --git a/direct/timothy_tests/mirror_tests/linux_test_write.h b/direct/timothy_tests/mirror_tests/linux_test_write.h deleted file mode 100644 index 611fe7d..0000000 --- a/direct/timothy_tests/mirror_tests/linux_test_write.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __linux_test_write_h__ -#define __linux_test_write_h__ -#include -#include -#include -#include -#include "yaffsfs.h" -#include "lib.h" - -int linux_test_write(arg_temp *args_struct); - -#endif diff --git a/direct/timothy_tests/mirror_tests/mirror_tests.c b/direct/timothy_tests/mirror_tests/mirror_tests.c deleted file mode 100644 index cd4e5f2..0000000 --- a/direct/timothy_tests/mirror_tests/mirror_tests.c +++ /dev/null @@ -1,601 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "mirror_tests.h" - -int random_seed; -int simulate_power_failure = 0; - -int num_of_random_tests=1; - - - -typedef struct test_list_temp2{ - char *test_name; - int (*test_pointer)(arg_temp *args_struct); -}test_list_temp; - -typedef struct test_temp2 { - int num_of_tests; - test_list_temp test_list[]; -}test_temp; - -test_temp yaffs_tests={ - 4, - {{"yaffs_test_open",yaffs_test_open}, - {"yaffs_test_truncate",yaffs_test_truncate}, - {"yaffs_test_unlink",yaffs_test_unlink}, - {"yaffs_test_write",yaffs_test_write} - } -}; - -test_temp linux_tests={ - 4, - {{"linux_test_open",linux_test_open}, - {"linux_test_truncate",linux_test_truncate}, - {"linux_test_unlink",linux_test_unlink}, - {"linux_test_write",linux_test_write} - } -}; - -const struct option long_options[]={ - {"help", 0,NULL,'h'}, - {"yaffs_path", 1,NULL,'y'}, - {"linux_path", 1,NULL,'l'}, - {"print_level", 1,NULL,'p'}, - {"quiet", 0,NULL,'q'}, - {"number", 1,NULL,'n'}, - {"seed", 1,NULL,'s'}, - {"trace", 1,NULL,'t'}, - {"clean", 0,NULL,'c'}, - {"verbose", 0,NULL,'v'} -}; - -const char short_options[]="hy:l:p:qn:s:t:cv"; - - -int main(int argc, char *argv[]) -{ - char message[100]; - -// yaffs_tests.num_of_tests=(sizeof(yaffs_tests)/sizeof(test_temp)); -// linux_tests.num_of_tests=(sizeof(linux_tests)/sizeof(test_temp)); - - init(argc,argv); - print_message(1,"running mirror_tests\n"); - sprintf(message,"linux_root_path: %s\n",linux_struct.root_path); - print_message(3,message); - sprintf(message,"yaffs_root_path: %s\n",yaffs_struct.root_path); - print_message(3,message); - sprintf(message,"linux_num_of_tests: %d\n",linux_tests.num_of_tests); - print_message(3,message); - sprintf(message,"yaffs_num_of_tests: %d\n",yaffs_tests.num_of_tests); - print_message(3,message); - - run_random_test(num_of_random_tests); - //compare_linux_and_yaffs(); - yaffs_unmount("yaffs2"); - return 0; -} - -void init(int argc, char *argv[]) -{ - char dir[200]; - dir[0]='\0'; - int x=-1; - char message[100]; - int new_option; - - x=(unsigned)time(NULL); - sprintf(message,"seeding srand with: %d\n",x); - print_message(2,message); - srand(x); - yaffs_set_trace(0); - linux_struct.type_of_test =LINUX; - yaffs_struct.type_of_test =YAFFS; - - sprintf(message,"current absolute path is: %s\n",getcwd(dir,200)); - print_message(3,message); - strcpy(dir,getcwd(dir,200)); - - strcat(dir,"/test/"); - printf("dir: %s\n",dir); - strcpy(linux_struct.root_path,dir); - strcpy(yaffs_struct.root_path,"yaffs2/test/"); - - - do { - new_option=getopt_long(argc,argv,short_options,long_options,NULL); - if (new_option=='h'){ - printf("mirror_tests help\n"); - printf("arguments:\n"); - printf("\t-yaffs_path [PATH] //sets the path for yaffs.\n"); - printf("\t-linux_path [PATH] //sets the path for linux.\n"); - printf("\t-p [NUMBER] //sets the print level for mirror_tests.\n"); - printf("\t-v //verbose mode everything is printed\n"); - printf("\t-q //quiet mode nothing is printed.\n"); - printf("\t-n [number] //sets the number of random tests to run.\n"); - printf("\t-s [number] //seeds rand with the number\n"); - printf("\t-t [number] //sets yaffs_trace to the number\n"); - printf("\t-clean //removes emfile and test dir\n"); - exit(0); - } else if (new_option=='y'){ - strcpy(yaffs_struct.root_path, optarg); - } else if (new_option=='l'){ - strcpy(linux_struct.root_path, optarg); - } else if (new_option=='p'){ - set_print_level(atoi(optarg)); - } else if (new_option=='v'){ - set_print_level(5); - } else if (new_option=='q'){ - set_print_level(-1); - } else if (new_option=='n'){ - num_of_random_tests=atoi(optarg); - } else if (new_option=='s'){ - srand(atoi(argv[x+1])); - } else if (new_option=='t'){ - yaffs_set_trace(atoi(optarg)); - } else if (new_option=='c'){ - clean_dir(); - exit(0); - } else if (new_option==-1){ - - } else if (new_option=='?') { - printf("bad argument\n"); - exit(0); - } - - } while(new_option!=-1); - clean_dir(); - yaffs_start_up(); - print_message(2,"\nmounting yaffs\n"); - x=yaffs_mount("yaffs2"); - if (x<0) { - print_message(3,"failed to mount yaffs\n"); - get_error_yaffs(); - } else { - print_message(3,"mounted yaffs\n"); - } - - - print_message(3,"\nmaking linux test dir\n"); - x=mkdir(linux_struct.root_path,0777); - if (x<0) { - print_message(1,"failed to make dir\n"); - get_error_linux(); - } else { - print_message(3,"made dir\n"); - } - - print_message(3,"\nmaking yaffs test dir\n"); - x=yaffs_mkdir(yaffs_struct.root_path,0777); - if (x<0) { - print_message(1,"failed to make dir\n"); - get_error_yaffs(); - } else { - print_message(3,"made dir\n"); - } -} - -int run_random_test(int num_of_random_tests) -{ - int y=0; - int x=-1; - int id=0; - int test_id=-1; - int num_of_tests_before_check=1; - char message[200]; - arg_temp args_struct; - for (y=0;(y*num_of_tests_before_check)=4){ - get_error_yaffs(); - get_error_linux(); - } - - if ((abs(yaffs_get_error())!=abs(errno)) && - (abs(yaffs_get_error())!=EISDIR && abs(errno) != 0) && - (abs(yaffs_get_error())!=ENOENT && abs(errno) != EACCES)&& - (abs(yaffs_get_error())!=EINVAL && abs(errno) != EBADF) - ){ - print_message(2,"\ndifference in returned errors######################################\n"); - get_error_yaffs(); - get_error_linux(); - if (get_exit_on_error()){ - exit(0); - } - } - } - //check_mode(&args_struct); - compare_linux_and_yaffs(&args_struct); - //check_mode(&args_struct); - - } - compare_linux_and_yaffs(&args_struct); -} - -int select_test_id(int test_len) -{ - int id=0; - //printf("test_len = %d\n",test_len); - id=(rand() % test_len ); - //printf("id %d\n",id); - return id; - -} - -int check_mode(arg_temp *args_struct) -{ - char path[200]; - char message[200]; - int output=0; - - struct yaffs_stat yaffs_stat_struct; - join_paths(yaffs_struct.root_path,args_struct->string1, path ); - sprintf(message,"\ntrying to stat to: %s\n",path); - print_message(3,message); - output=yaffs_stat(path,&yaffs_stat_struct); - if (output < 0){ - sprintf(message,"failed to stat the file\n"); - print_message(3,message); - get_error_yaffs(); - } else { - sprintf(message,"stated the file\n"); - print_message(3,message); - sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); - print_message(3,message); - sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); - print_message(3,message); - } - return 1; -} - -int check_mode_file(char *path) -{ - char message[200]; - int output=0; - - struct yaffs_stat yaffs_stat_struct; - - sprintf(message,"\ntrying to stat to: %s\n",path); - print_message(3,message); - output=yaffs_stat(path,&yaffs_stat_struct); - if (output < 0){ - sprintf(message,"failed to stat the file\n"); - print_message(3,message); - get_error_yaffs(); - } else { - sprintf(message,"stated the file\n"); - print_message(3,message); - sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); - print_message(3,message); - sprintf(message,"mode S_IREAD %d S_IWRITE %d\n\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); - print_message(3,message); - } - return 1; -} - -int compare_linux_and_yaffs(arg_temp *args_struct) -{ - int x=0,y=0; - char l_path[200]; - char y_path[200]; - char file_name[200]; - int exit_bool=0; - int number_of_files_in_yaffs=0; - int number_of_files_in_linux=0; - char message[200]; - char **yaffs_file_list=NULL; - char **linux_file_list=NULL; - - struct yaffs_stat yaffs_stat_struct; - struct stat linux_stat_struct; - yaffs_DIR *yaffs_open_dir; - yaffs_dirent *yaffs_current_file; - - DIR *linux_open_dir; - struct dirent *linux_current_file; - - l_path[0]='\0'; - y_path[0]='\0'; - file_name[0]='\0'; - message[0]='\0'; - print_message(2,"\n\n\n comparing folders\n"); -// check_mode_file("yaffs2/test/YY"); - //find out the number of files in the directory - yaffs_open_dir = yaffs_opendir(yaffs_struct.root_path); - if (yaffs_open_dir) { - for (x=0;yaffs_readdir(yaffs_open_dir);x++){} - number_of_files_in_yaffs=x; - sprintf(message,"number of files in yaffs dir= %d\n",number_of_files_in_yaffs); - print_message(2,message); - yaffs_rewinddir(yaffs_open_dir); - } else { - print_message(3,"failed to open yaffs test dir\n"); - } - //create array - yaffs_file_list= (char **)malloc(x*sizeof(char*)); - for (x=0;xd_name = %s\n",yaffs_current_file->d_name); - if (yaffs_current_file){ - strcpy(yaffs_file_list[x],yaffs_current_file->d_name); - - } - yaffs_current_file =yaffs_readdir(yaffs_open_dir); - } - yaffs_closedir(yaffs_open_dir); - } else { - print_message(3,"failed to populate yaffs test list\n"); - } - - - //find out the number of files in the directory - linux_open_dir = opendir(linux_struct.root_path); - if (linux_open_dir){ - for (x=0;readdir(linux_open_dir);x++){} - number_of_files_in_linux=(x-2); - sprintf(message,"number of files in linux dir= %d\n",(number_of_files_in_linux)); - print_message(2,message); - //the -2 is because linux shows 2 extra files which are automaticly created. - - rewinddir(linux_open_dir); - } else { - print_message(3,"failed to open linux test dir\n"); - } - - //create array - linux_file_list= (char **)malloc(number_of_files_in_linux*sizeof(char*)); - - for (x=0;xd_name); - print_message(7,"opened file: "); - print_message(7,message); - print_message(7,"\n"); - } - if (linux_current_file && - 0!=strcmp(message,".")&& - 0!=strcmp(message,"..")){ - strcpy(file_name,linux_current_file->d_name); - //sprintf("file opened: %s\n",linux_current_file->d_name); - //print_message(3,message); - print_message(7,"added file to list\n"); - strcpy(linux_file_list[y],file_name); - sprintf(message,"file added to list: %s\n",linux_file_list[y]); - print_message(7,message); - y++; - } - linux_current_file =readdir(linux_open_dir); - } - closedir(linux_open_dir); - } else { - print_message(3,"failed to populate linux test dir\n"); - } - - - //match the files in both folders - for (x=0;x=0&& - stat(l_path,&linux_stat_struct)>=0){ - sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); - print_message(3,message); - sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); - print_message(3,message); - sprintf(message," linux file mode is %d\n",(linux_stat_struct.st_mode & (S_IREAD|S_IWRITE))); - print_message(3,message); - sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(linux_stat_struct.st_mode & S_IREAD),(linux_stat_struct.st_mode & S_IWRITE)); - print_message(3,message); - if ((yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))== - ( linux_stat_struct.st_mode & (S_IREAD|S_IWRITE))){ - print_message(2,"file modes match\n"); - } else { - print_message(2,"file modes do not match\n"); - exit_bool=1; - } - linux_file_list[y][0]=NULL; - yaffs_file_list[x][0]=NULL; - } else { - print_message(2,"failed to stat one of the files\n"); - get_error_yaffs(); - get_error_linux(); - } - - //read file contents - - - break; - } - } - } - - //print remaining files - for (x=0;xd_name); -// generate_array_of_objects_in_yaffs(); -// generate_array_of_objects_in_linux(); - //first do a check to see if both sides have the same objects on both sides. - //then stat all of the files and compare size and mode - //read the text of each file and compare them. - - //show the diffrences by printing them. - return 1; - -} - -void generate_random_numbers(arg_temp *args_struct) -{ - char string[51]; - args_struct->char1= (rand() % 255); - args_struct->char2= (rand() % 255); - args_struct->int1= (rand() % 100000); - args_struct->int2= (rand() % 100000); - generate_random_string(string,50); - strcpy(args_struct->string1, string); - generate_random_string(string,50); - strcpy(args_struct->string2, string); -} - -void run_yaffs_test(int id,arg_temp *args_struct) -{ - char message[200]; - int output =0; - print_message(3,"\n"); - //printf("id = %d\n",id); - sprintf(message,"running_test %s\n",yaffs_tests.test_list[id].test_name); - print_message(3,message); - output=yaffs_tests.test_list[id].test_pointer(args_struct); - if (output<0) { - sprintf(message,"test_failed %s\n",yaffs_tests.test_list[id].test_name); - print_message(3,message); - } else { - print_message(3,"test_passed\n"); - } -} - -void run_linux_test(int id,arg_temp *args_struct) -{ - char message[200]; - int output =0; - print_message(3,"\n"); - //printf("id = %d\n",id); - sprintf(message,"running_test %s\n",linux_tests.test_list[id].test_name); - print_message(3,message); - output=linux_tests.test_list[id].test_pointer(args_struct); - if (output<0) { - sprintf(message,"test_failed %s\n",linux_tests.test_list[id].test_name); - print_message(3,message); - } else { - print_message(3,"test_passed\n"); - } -} - - -void clean_dir(void) -{ - char string[200]; - char file[200]; - char message[200]; - DIR *linux_open_dir; - struct dirent *linux_current_file; - int x=0,output=0; - - getcwd(string,200); - strcat(string,"/emfile-2k-0"); - sprintf(message,"\n\nunlinking emfile at this path: %s\n",string); - print_message(3,message); - unlink(string); - - - linux_open_dir = opendir(linux_struct.root_path); - if (linux_open_dir){ - - do - { - - linux_current_file =readdir(linux_open_dir); - if (NULL!=linux_current_file){ - - strcpy(file,linux_struct.root_path); - strcat(file,linux_current_file->d_name); - sprintf(message,"unlinking file %s\n",file); - print_message(3,message); - print_message(3,"chmoding file\n"); - output=chmod(file,(S_IRUSR|S_IWUSR)); - if (output<0) { - get_error_linux(); - } - print_message(3,"unlinking file\n"); - output=unlink(file); - if (output<0) { - get_error_linux(); - } - } - } while(linux_current_file); - closedir(linux_open_dir); - rmdir(linux_struct.root_path); - } - -} diff --git a/direct/timothy_tests/mirror_tests/mirror_tests.h b/direct/timothy_tests/mirror_tests/mirror_tests.h deleted file mode 100644 index 9d30833..0000000 --- a/direct/timothy_tests/mirror_tests/mirror_tests.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __mirror_tests_h__ -#define __mirror_tests_h__ - -#include -#include -#include //used for getting the current directory. -#include -#include -#include "yaffsfs.h" -#include "lib.h" -#include -#include -#include - -#include "linux_test_open.h" -#include "yaffs_test_open.h" -#include "linux_test_truncate.h" -#include "yaffs_test_truncate.h" -#include "linux_test_unlink.h" -#include "yaffs_test_unlink.h" -#include "linux_test_write.h" -#include "yaffs_test_write.h" - -#define LINUX 1 -#define YAFFS 2 - - - - - -void init(int argc, char *argv[]); -int run_random_test(int num_of_random_tests); -int compare_linux_and_yaffs(arg_temp *args_struct); - -int select_test_id(int test_len); -void generate_random_numbers(arg_temp *args_struct); -void run_yaffs_test(int id,arg_temp *args_struct); -void run_linux_test(int id,arg_temp *args_struct); -void clean_dir(void); -int select_test_id(int test_len); -int check_mode(arg_temp *args_struct); -int check_mode_file(char *path); -//void generate_array_of_objects_in_yaffs(void); -//void generate_array_of_objects_in_linux(void); - -#endif diff --git a/direct/timothy_tests/mirror_tests/yaffs_test_open.c b/direct/timothy_tests/mirror_tests/yaffs_test_open.c deleted file mode 100644 index daeb8a4..0000000 --- a/direct/timothy_tests/mirror_tests/yaffs_test_open.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "yaffs_test_open.h" - -int yaffs_test_open(arg_temp *args_struct) -{ - char path[200]; - char message[100]; - int output=0; - join_paths(yaffs_struct.root_path,args_struct->string1, path ); - sprintf(message,"file path: %s\n",path); - print_message(3,message); - - output=yaffs_open(path,args_struct->char1 &(O_TRUNC|O_EXCL|O_CREAT|O_APPEND),args_struct->char2&(S_IREAD|S_IWRITE)); - if (output>=0){ - output= yaffs_close(output); - if (output<0) { - print_message(3,"failed to close handle\n"); - return -1; - } else { - return 1; - } - } else { - print_message(3,"failed to open file\n"); - return -1; - } -} diff --git a/direct/timothy_tests/mirror_tests/yaffs_test_open.h b/direct/timothy_tests/mirror_tests/yaffs_test_open.h deleted file mode 100644 index d64bd29..0000000 --- a/direct/timothy_tests/mirror_tests/yaffs_test_open.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __yaffs_test_open_h__ -#define __yaffs_test_open_h__ -#include -#include -#include -#include "yaffsfs.h" -#include "lib.h" - -int yaffs_test_open(arg_temp *args_struct); - -#endif diff --git a/direct/timothy_tests/mirror_tests/yaffs_test_truncate.c b/direct/timothy_tests/mirror_tests/yaffs_test_truncate.c deleted file mode 100644 index 9e99590..0000000 --- a/direct/timothy_tests/mirror_tests/yaffs_test_truncate.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "yaffs_test_truncate.h" - -int yaffs_test_truncate(arg_temp *args_struct) -{ - char path[200]; - char message[200]; - int output=0; - join_paths(yaffs_struct.root_path,args_struct->string1, path ); - sprintf(message,"file path: %s\n",path); - print_message(3,message); - - output=yaffs_truncate(path,args_struct->int1); - return output; -} diff --git a/direct/timothy_tests/mirror_tests/yaffs_test_truncate.h b/direct/timothy_tests/mirror_tests/yaffs_test_truncate.h deleted file mode 100644 index 02517cb..0000000 --- a/direct/timothy_tests/mirror_tests/yaffs_test_truncate.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __yaffs_test_truncate_h__ -#define __yaffs_test_truncate_h__ -#include -#include -#include -#include "yaffsfs.h" -#include "lib.h" - -int yaffs_test_truncate(arg_temp *args_struct); - -#endif diff --git a/direct/timothy_tests/mirror_tests/yaffs_test_unlink.c b/direct/timothy_tests/mirror_tests/yaffs_test_unlink.c deleted file mode 100644 index 6982e77..0000000 --- a/direct/timothy_tests/mirror_tests/yaffs_test_unlink.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "yaffs_test_unlink.h" - -int yaffs_test_unlink(arg_temp *args_struct) -{ - char path[250]; - char message[150]; - int output; - join_paths(yaffs_struct.root_path,args_struct->string1, path ); - sprintf(message,"file path: %s\n",path); - print_message(3,message); - - output= yaffs_unlink(path); - - if (output<0) { - print_message(3,"failed to unlink file\n"); - return -1; - } else { - return 1; - } - -} diff --git a/direct/timothy_tests/mirror_tests/yaffs_test_unlink.h b/direct/timothy_tests/mirror_tests/yaffs_test_unlink.h deleted file mode 100644 index cb8fdf2..0000000 --- a/direct/timothy_tests/mirror_tests/yaffs_test_unlink.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __yaffs_test_unlink_h__ -#define __yaffs_test_unlink_h__ -#include -#include -#include -#include "yaffsfs.h" -#include "lib.h" - -int yaffs_test_unlink(arg_temp *args_struct); - -#endif diff --git a/direct/timothy_tests/mirror_tests/yaffs_test_write.c b/direct/timothy_tests/mirror_tests/yaffs_test_write.c deleted file mode 100644 index 2820d68..0000000 --- a/direct/timothy_tests/mirror_tests/yaffs_test_write.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "yaffs_test_write.h" - -int yaffs_test_write(arg_temp *args_struct) -{ - char path[200]; - char message[200]; - int output=0,output2=0; - int handle; - struct yaffs_stat yaffs_stat_struct; - join_paths(yaffs_struct.root_path,args_struct->string1, path ); - sprintf(message,"trying to write to: %s\nwith mode set to %o \n",path,args_struct->char1); - print_message(3,message); - printf("mode S_IREAD %d S_IWRITE %d\n",(args_struct->char2 & S_IREAD),(args_struct->char2 & S_IWRITE)); - handle=yaffs_open(path,((args_struct->char1 &(O_TRUNC|O_EXCL|O_CREAT|O_APPEND))|O_RDWR),(args_struct->char2&(S_IREAD|S_IWRITE))); - printf("handle %d\n",handle); - if (handle<0){ - print_message(3,"failed to open a handle\n"); - return -1; //handle failed to open - } - -/* output=yaffs_fstat(handle,&yaffs_stat_struct); - if (output < 0){ - sprintf(message,"failed to stat the file\n"); - print_message(3,message); - get_error_yaffs(); - } else { - sprintf(message,"stated the file\n"); - print_message(3,message); - sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); - print_message(3,message); - sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); - print_message(3,message); - } - - sprintf(message,"trying to write: %d bytes into the file\n",strlen(args_struct->string2)); - print_message(3,message); -*/ - output=yaffs_write(handle,&args_struct->string2,strlen(args_struct->string2)); - -/* print_message(3,"\n wrote to the file\n"); - output2=yaffs_fstat(handle,&yaffs_stat_struct); - if (output2 < 0){ - sprintf(message,"failed to stat the file\n"); - print_message(3,message); - get_error_yaffs(); - } else { - sprintf(message,"stated the file\n"); - print_message(3,message); - sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); - print_message(3,message); - sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); - print_message(3,message); - } -*/ yaffs_close(handle); -/* print_message(3,"\n closing the file\n"); - output2=yaffs_stat(path,&yaffs_stat_struct); - if (output2 < 0){ - sprintf(message,"failed to stat the file\n"); - print_message(3,message); - get_error_yaffs(); - } else { - sprintf(message,"stated the file\n"); - print_message(3,message); - sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); - print_message(3,message); - sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); - print_message(3,message); - } -*/ - - return output; -} diff --git a/direct/timothy_tests/mirror_tests/yaffs_test_write.h b/direct/timothy_tests/mirror_tests/yaffs_test_write.h deleted file mode 100644 index 0332f6f..0000000 --- a/direct/timothy_tests/mirror_tests/yaffs_test_write.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * YAFFS: Yet another Flash File System . A NAND-flash specific file system. - * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Timothy Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - */ - -#ifndef __yaffs_test_write_h__ -#define __yaffs_test_write_h__ -#include -#include -#include -#include -#include "yaffsfs.h" -#include "lib.h" - -int yaffs_test_write(arg_temp *args_struct); - -#endif diff --git a/direct/timothy_tests/quick_tests/Makefile b/direct/timothy_tests/quick_tests/Makefile index ef339c5..49ecd7a 100644 --- a/direct/timothy_tests/quick_tests/Makefile +++ b/direct/timothy_tests/quick_tests/Makefile @@ -42,8 +42,8 @@ COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ yaffs_yaffs1.o \ yaffs_yaffs2.o \ yaffs_verify.o \ - yaffs_error.o - + yaffs_error.o \ + yaffs_summary.o # yaffs_checkptrwtest.o\ TESTFILES = quick_tests.o lib.o \ @@ -108,7 +108,8 @@ TESTFILES = quick_tests.o lib.o \ test_yaffs_lstat.o test_yaffs_lstat_ENOENT.o test_yaffs_lstat_ENOTDIR.o test_yaffs_lstat_ENAMETOOLONG.o \ test_yaffs_lstat_NULL.o \ test_yaffs_flush.o test_yaffs_flush_EBADF.o test_yaffs_flush_EROFS.o \ - test_yaffs_dup.o test_yaffs_dup_EBADF.o + test_yaffs_dup.o test_yaffs_dup_EBADF.o + @@ -127,7 +128,8 @@ YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscomp yaffs_yaffs1.c yaffs_yaffs1.h \ yaffs_yaffs2.c yaffs_yaffs2.h \ yaffs_bitmap.c yaffs_bitmap.h \ - yaffs_verify.c yaffs_verify.h + yaffs_verify.c yaffs_verify.h \ + yaffs_summary.c yaffs_summary.h YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ yaffsfs.h ydirectenv.h \ diff --git a/direct/timothy_tests/quick_tests/README.txt b/direct/timothy_tests/quick_tests/README.txt index 1744392..55b670e 100644 --- a/direct/timothy_tests/quick_tests/README.txt +++ b/direct/timothy_tests/quick_tests/README.txt @@ -1,6 +1,20 @@ - Made by Timothy Manning on 04/11/2010 +This test is designed to test the response and error handling of the yaffs functions. + +compile command: make +run command: ./quick_tests + +command line options: + -h prints the available command line options. + -c tests will continue even if a test fails, rather than exiting the test. + -v verbose mode. will print all messages. + -q quiet mode. will not print any messages. + -t [number] sets the yaffs_trace() function to the number. + -n [number] sets the number of randomly selected tests to run after the test has run through + after running all of listed tests. + +############################# development infomation #################################################################### Tests made diff --git a/direct/timothy_tests/quick_tests/current_bugs.txt b/direct/timothy_tests/quick_tests/current_bugs.txt deleted file mode 100644 index a8a88c4..0000000 --- a/direct/timothy_tests/quick_tests/current_bugs.txt +++ /dev/null @@ -1,28 +0,0 @@ - -Made by Timothy Manning on 08/11/2010 - - -Current BUGS - - -Current WARNINGS - - WARNING- If yaffs is unmounted then most of yaffs' functions return ENODIR. - But some function return EBADF instead. - Functions which return ENOTDIR: open, close, access, unlink, lseek, write, read - - Functions which return ENOENT: access, stat - - - - WARNING-the function yaffs_open does not check the mode passed to it. - This means that yaffs open does not return EINVAL if a bad mode is passed to it. - However this causes the error EEXIST to happen instead, because both O_CREAT and O_EXCL flags are set. - - WARNING- yaffs_open will work with either of the two mode set to 255. - However there are only 4 or 5 flags that can be set for each of the modes. - This means that the programmer may not be setting the flags properly. - - WARNING- When mounting a non-existing mount point the error ENODEV is returned. - The quick tests have been altered to accommodate this error code. - With standard access function in linux the error returned is ENOENT. diff --git a/direct/timothy_tests/stress_tester/Makefile b/direct/timothy_tests/stress_tester/Makefile new file mode 100644 index 0000000..b6d8cf8 --- /dev/null +++ b/direct/timothy_tests/stress_tester/Makefile @@ -0,0 +1,122 @@ +# Makefile for YAFFS direct stress tests +# +# +# YAFFS: Yet another Flash File System. A NAND-flash specific file system. +# +# Copyright (C) 2003-2010 Aleph One Ltd. +# +# +# Created by Charles Manning +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# NB Warning this Makefile does not include header dependencies. +# +# $Id: Makefile,v 1.7 2010-02-25 22:34:47 charles Exp $ + +#EXTRA_COMPILE_FLAGS = -DYAFFS_IGNORE_TAGS_ECC + +CFLAGS = -DCONFIG_YAFFS_DIRECT -DCONFIG_YAFFS_SHORT_NAMES_IN_RAM -DCONFIG_YAFFS_YAFFS2 +CFLAGS += -DCONFIG_YAFFS_PROVIDE_DEFS -DCONFIG_YAFFSFS_PROVIDE_VALUES +CFLAGS += -Wall -g $(EXTRA_COMPILE_FLAGS) -Wstrict-aliasing +#CFLAGS += -fno-strict-aliasing +CFLAGS += -O0 +CFLAGS += -Wextra -Wpointer-arith +#CFLAGS += -DCONFIG_YAFFS_VALGRIND_TEST + +#CFLAGS+= -Wshadow -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wmissing-declarations +#CFLAGS+= -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline + +COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o\ + yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ + yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ + yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ + yaffs_checkptrw.o yaffs_qsort.o\ + yaffs_nameval.o yaffs_attribs.o \ + yaffs_norif1.o ynorsim.o \ + yaffs_allocator.o \ + yaffs_bitmap.o \ + yaffs_yaffs1.o \ + yaffs_yaffs2.o \ + yaffs_verify.o \ + yaffs_summary.o + + +SSCOMMONTESTOBJS = yaffscfg2k.o yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ + yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ + yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ + yaffs_attribs.o yaffs_allocator.o \ + yaffs_checkptrw.o yaffs_qsort.o\ + yaffs_nameval.o \ + yaffs_norif1.o ynorsim.o \ + yaffs_allocator.o \ + yaffs_bitmap.o \ + yaffs_yaffs1.o \ + yaffs_yaffs2.o \ + yaffs_verify.o + +# yaffs_checkptrwtest.o\ + +YAFFSTESTOBJS = $(COMMONTESTOBJS) yaffs_tester.o message_buffer.o error_handler.o + + +ALLOBJS = $(sort $(YAFFSTESTOBJS)) + +YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ + yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ + yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ + yaffs_checkptrw.h yaffs_checkptrw.c \ + yaffs_nameval.c yaffs_nameval.h \ + yaffs_trace.h yaffs_attribs.h \ + yaffs_allocator.c yaffs_allocator.h \ + yaffs_yaffs1.c yaffs_yaffs1.h \ + yaffs_yaffs2.c yaffs_yaffs2.h \ + yaffs_bitmap.c yaffs_bitmap.h \ + yaffs_verify.c yaffs_verify.h \ + yaffs_summary.c yaffs_summary.h + +YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ + yaffsfs.h yaffs_osglue.h ydirectenv.h \ + yaffs_flashif.c yaffscfg.h yaffs_qsort.c \ + yaffs_nandemul2k.h yaffs_list.h \ + yaffs_attribs.c \ + yaffs_nandif.c yaffs_nandif.h yportenv.h \ + yaffs_hweight.c yaffs_hweight.h + + +DIRECTEXTRASYMLINKS = yaffscfg2k.c yaffs_fileem2k.c yaffs_fileem2k.h\ + yaffs_fileem.c yaffs_norif1.c yaffs_norif1.h \ + yaffs_ramdisk.c yaffs_ramdisk.h yaffs_ramem2k.c \ + ynorsim.h ynorsim.c yaffs_osglue.c + +SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS) $(DIRECTEXTRASYMLINKS) +#all: directtest2k boottest + +all: yaffs_tester + +$(ALLOBJS): %.o: %.c + gcc -c $(CFLAGS) -o $@ $< + + +$(YAFFSSYMLINKS): + ln -s ../../../$@ $@ + +$(YAFFSDIRECTSYMLINKS): + ln -s ../../$@ $@ + +$(DIRECTEXTRASYMLINKS): + ln -s ../../basic-test/$@ $@ + + +yaffs_tester: $(SYMLINKS) $(YAFFSTESTOBJS) + gcc $(CFLLAG) -o $@ $(YAFFSTESTOBJS) + + + + + + +clean: + rm -f yaffs_tester $(ALLOBJS) core $(SYMLINKS) log.txt diff --git a/direct/timothy_tests/stress_tester/README.txt b/direct/timothy_tests/stress_tester/README.txt new file mode 100644 index 0000000..364d975 --- /dev/null +++ b/direct/timothy_tests/stress_tester/README.txt @@ -0,0 +1,8 @@ +The stress_tester program opens and closes files at random in an effort to break yaffs. + +compile command: make +run command: ./yaffs_tester + +command line options: + -seed [number] sets the random seed generator to the number. + diff --git a/direct/timothy_tests/stress_tester/error_handler.c b/direct/timothy_tests/stress_tester/error_handler.c new file mode 100644 index 0000000..a9152f3 --- /dev/null +++ b/direct/timothy_tests/stress_tester/error_handler.c @@ -0,0 +1,84 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* + * error_handler.c contains code for checking yaffs function calls for errors. + */ +#include "error_handler.h" + + +typedef struct error_codes_template { + int code; + char * text; +}error_entry; + +const error_entry error_list[] = { + { ENOMEM , "ENOMEM" }, + { EBUSY , "EBUSY"}, + { ENODEV , "ENODEV"}, + { EINVAL , "EINVAL"}, + { EBADF , "EBADF"}, + { EACCES , "EACCES"}, + { EXDEV , "EXDEV" }, + { ENOENT , "ENOENT"}, + { ENOSPC , "ENOSPC"}, + { ERANGE , "ERANGE"}, + { ENODATA, "ENODATA"}, + { ENOTEMPTY, "ENOTEMPTY"}, + { ENAMETOOLONG,"ENAMETOOLONG"}, + { ENOMEM , "ENOMEM"}, + { EEXIST , "EEXIST"}, + { ENOTDIR , "ENOTDIR"}, + { EISDIR , "EISDIR"}, + { 0, NULL } +}; + +const char * error_to_str(int err) +{ + error_entry *e = error_list; + if (err < 0) + err = -err; + while(e->code && e->text){ + if(err == e->code) + return e->text; + e++; + } + return "Unknown error code"; +} + +void yaffs_check_for_errors(char output, buffer *message_buffer,char error_message[],char success_message[]){ + char dummy[10]; + unsigned int x=0; + int yaffs_error=-1; + char error_found=0; + if (output==-1) + { + add_to_buffer(message_buffer, "\nerror##########",MESSAGE_LEVEL_ERROR,PRINT); + add_to_buffer(message_buffer, error_message,MESSAGE_LEVEL_ERROR,PRINT); + add_to_buffer(message_buffer, "error_code: ",MESSAGE_LEVEL_ERROR,NPRINT); + yaffs_error=yaffs_get_error(); + append_int_to_buffer(message_buffer, yaffs_error,MESSAGE_LEVEL_ERROR,PRINT); + + add_to_buffer(message_buffer, error_to_str(yaffs_error),MESSAGE_LEVEL_ERROR,NPRINT); + append_to_buffer(message_buffer, "\n\n",MESSAGE_LEVEL_ERROR,PRINT); + quit_program(); + //scanf("%c",dummy); /*this line causes a segmentation fault. Need a better way of waiting for a key press*/ + //print_buffer(message_buffer,PRINT_ALL); + + } + else{ + add_to_buffer(message_buffer, success_message,MESSAGE_LEVEL_BASIC_TASKS,PRINT); + } +} + + diff --git a/direct/timothy_tests/stress_tester/error_handler.h b/direct/timothy_tests/stress_tester/error_handler.h new file mode 100644 index 0000000..979f020 --- /dev/null +++ b/direct/timothy_tests/stress_tester/error_handler.h @@ -0,0 +1,23 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __error_handler_h__ +#define __error_handler_h__ +#include +#include "message_buffer.h" +#include "yaffsfs.h" +#define DEBUG_LEVEL 5 /*set the debug level. this is used to display the relevent debug messages*/ +void yaffs_check_for_errors(char output, buffer *message_buffer, char error_message[], char success_message[]); +#endif diff --git a/direct/timothy_tests/stress_tester/message_buffer.c b/direct/timothy_tests/stress_tester/message_buffer.c new file mode 100644 index 0000000..adefbf8 --- /dev/null +++ b/direct/timothy_tests/stress_tester/message_buffer.c @@ -0,0 +1,112 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* + * message_buffer.c contains code for a message buffer . + */ + +#include "message_buffer.h" + +void append_to_buffer(buffer *p_Buffer, char *message,char message_level,char print){ + /*wrapper function for add_to_buffer_root_function*/ + add_to_buffer_root_function(p_Buffer,message, message_level,APPEND_MESSAGE,print); +} + +void add_to_buffer(buffer *p_Buffer, char *message,char message_level,char print){ + /*wrapper function for add_to_buffer_root_function*/ + add_to_buffer_root_function(p_Buffer,message, message_level,DO_NOT_APPEND_MESSAGE,print); +} + +void add_int_to_buffer(buffer *p_Buffer, int num,char message_level,char print){ + char message[20]; + sprintf(message, "%d",num); + add_to_buffer_root_function(p_Buffer,message, message_level,DO_NOT_APPEND_MESSAGE,print); +} + +void append_int_to_buffer(buffer *p_Buffer, int num,char message_level,char print){ + char message[20]; + sprintf(message, "%d",num); + add_to_buffer_root_function(p_Buffer,message, message_level,APPEND_MESSAGE,print); +} + + +void add_to_buffer_root_function(buffer *p_Buffer, char *message,char message_level,char append,char print){ + FILE *log_handle; + + if (append==APPEND_MESSAGE){ /* append current message*/ + strncat(p_Buffer->message[p_Buffer->head],message,BUFFER_MESSAGE_LENGTH); + } + else { + + /*move the head up one. the head always points at the last written data*/ + p_Buffer->head++; + + /*printf("p_Buffer->tail=%d\n",p_Buffer->tail);*/ + /*printf("p_Buffer->head=%d\n",p_Buffer->head);*/ + if (p_Buffer->head >=BUFFER_SIZE-1) { + /*printf("buffer overflow\n");*/ + p_Buffer->head -= (BUFFER_SIZE-1); /*wrap the head around the buffer*/ + /*printf("new p_Buffer->head=%d\n",p_Buffer->head);*/ + } + /*if the buffer is full then delete last entry by moving the tail*/ + if (p_Buffer->head==p_Buffer->tail){ + /*printf("moving buffer tail from %d to ",p_Buffer->tail);*/ + p_Buffer->tail++; + if (p_Buffer->tail >=BUFFER_SIZE) p_Buffer->tail -= BUFFER_SIZE;/*wrap the tail around the buffer*/ + /*printf("%d\n",p_Buffer->tail);*/ + + } + + p_Buffer->message_level[p_Buffer->head]=message_level; /*copy the message level*/ + strncpy(p_Buffer->message[p_Buffer->head],message,BUFFER_MESSAGE_LENGTH); /*copy the message*/ + /*printf("copied %s into p_Buffer->message[p_Buffer->head]: %s\n",message,p_Buffer->message[p_Buffer->head]); + printf("extra %s\n",p_Buffer->message[p_Buffer->head]);*/ + } + if ((p_Buffer->message_level[p_Buffer->head]<=DEBUG_LEVEL)&& (print==PRINT)){ + /*printf("printing buffer 1\n"); + // the print buffer function is not working this is just a quick fix + print_buffer(p_Buffer,1); //if the debug level is higher enough then print the new message + */ + printf("%s\n",p_Buffer->message[p_Buffer->head]); + log_handle=fopen(LOG_FILE,"a"); + if (log_handle!=NULL){ + fputs(p_Buffer->message[p_Buffer->head],log_handle); + fputs("\n",log_handle); + fclose(log_handle); + } + } +} + + + +void print_buffer(buffer *p_Buffer, int number_of_messages_to_print){ + int x=0; + int i=0; + printf("print buffer\n"); + printf("buffer head:%d\n",p_Buffer->head); + printf("buffer tail:%d\n",p_Buffer->tail); + + if (number_of_messages_to_print==PRINT_ALL) number_of_messages_to_print=BUFFER_SIZE; +// printf("number_of_messages_to_print=%d\n",number_of_messages_to_print); + for (i=0,x=0; (x>=p_Buffer->tail) && (imessage[p_Buffer->head]); + printf("printed buffer\n"); + } + +} + + + diff --git a/direct/timothy_tests/stress_tester/message_buffer.h b/direct/timothy_tests/stress_tester/message_buffer.h new file mode 100644 index 0000000..55f9e10 --- /dev/null +++ b/direct/timothy_tests/stress_tester/message_buffer.h @@ -0,0 +1,49 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __message_buffer__ +#define __message_buffer__ + +#include +#include +#define PRINT 1 +#define NPRINT 0 +#define APPEND_MESSAGE 1 +#define DO_NOT_APPEND_MESSAGE 0 +#define PRINT_ALL -1 /*this is used to print all of the messages in a buffer*/ +#define BUFFER_MESSAGE_LENGTH 60 /*number of char in message*/ +#define BUFFER_SIZE 50 /*number of messages in buffer*/ +#define MESSAGE_LEVEL_ERROR 0 +#define MESSAGE_LEVEL_BASIC_TASKS 1 + +#define LOG_FILE "log.txt" +typedef struct buffer_template{ + char message[BUFFER_SIZE][BUFFER_MESSAGE_LENGTH]; + int head; + int tail; + char message_level[BUFFER_SIZE]; +}buffer; +#include "error_handler.h" /*include this for the debug level*/ + + +void print_buffer(buffer *p_Buffer,int number_of_messages_to_print); /*print messages in the buffer*/ +/*wrapper functions for add_to_buffer_root_function*/ +void add_to_buffer(buffer *p_Buffer, char *message,char message_level,char print); +void append_to_buffer(buffer *p_Buffer, char *message,char message_level,char print); +void add_int_to_buffer(buffer *p_Buffer, int num,char message_level,char print); +void append_int_to_buffer(buffer *p_Buffer, int num,char message_level,char print); + +void add_to_buffer_root_function(buffer *p_Buffer, char *message,char message_level,char append,char print); +#endif diff --git a/direct/timothy_tests/stress_tester/yaffs_tester.c b/direct/timothy_tests/stress_tester/yaffs_tester.c new file mode 100644 index 0000000..86dcf46 --- /dev/null +++ b/direct/timothy_tests/stress_tester/yaffs_tester.c @@ -0,0 +1,384 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* + * yaffs_tester.c designed to stress test yaffs2 direct. + */ + + +#include "yaffs_tester.h" + + + +int random_seed; +int simulate_power_failure = 0; + + +buffer message_buffer; /*create message_buffer */ + +char yaffs_test_dir[] ="/yaffs2/test_dir"; /*the path to the directory where all of the testing will take place*/ +char yaffs_mount_dir[]="/yaffs2/"; /*the path to the mount point which yaffs will mount*/ + + +int main(int argc, char *argv[]){ + + + init(yaffs_test_dir,yaffs_mount_dir,argc,argv); + test(yaffs_test_dir); + yaffs_unmount(yaffs_mount_dir); + return 0; +} + + + +void init(char *yaffs_test_dir,char *yaffs_mount_dir,int argc, char *argv[]){ + char output=0; + int x=0; + int seed=-1; + FILE *log_handle; + /*these variables are already set to zero, but it is better not to take chances*/ + message_buffer.head=0; + message_buffer.tail=0; + + + log_handle=fopen(LOG_FILE,"w"); + if (log_handle!=NULL){ + fputs("log file for yaffs tester\n",log_handle); + fclose(log_handle); + } + add_to_buffer(&message_buffer,"welcome to the yaffs tester",MESSAGE_LEVEL_BASIC_TASKS,PRINT);/* print boot up message*/ + yaffs_start_up(); + yaffs_mount(yaffs_mount_dir); + for (x=0;xnumber_of_open_handles,MESSAGE_LEVEL_BASIC_TASKS,PRINT); + if (P_open_handles_array->number_of_open_handleshandle[x]!=-3 && xhandle[x]=output; + P_open_handles_array->path[x][0]='\0'; + strcat(P_open_handles_array->path[x],path); + add_to_buffer(&message_buffer,"yaffs handle: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_int_to_buffer(&message_buffer,output,MESSAGE_LEVEL_BASIC_TASKS,PRINT); + add_to_buffer(&message_buffer,"stored handle: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + + //yaffs_open will return a null pointer if it cannot open a file. check for errors will not work. + yaffs_check_for_errors(output, &message_buffer,"failed to open file","opened file"); + + P_open_handles_array->number_of_open_handles++; + } + else close_random_file(P_open_handles_array); + +} + +void write_to_random_file(handle_regster *P_open_handles_array){ + int number_of_lines_of_text=0; + int length=100; + char text[length+1]; + text[0]='\0'; + int seek=0; + int x=0; + int output=0; + if (P_open_handles_array->number_of_open_handles>0){ + + while (P_open_handles_array->handle[x]==-3){ /*find a random open handle*/ + x=rand() % (MAX_NUMBER_OF_OPENED_HANDLES-1); + } + add_to_buffer(&message_buffer,"\n\ntrying to write to ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_to_buffer(&message_buffer,P_open_handles_array->path[x],MESSAGE_LEVEL_BASIC_TASKS,PRINT); + + stat_file(P_open_handles_array->path[x]); + number_of_lines_of_text=rand() %1000; + add_to_buffer(&message_buffer,"writing ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_int_to_buffer(&message_buffer,number_of_lines_of_text,MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_to_buffer(&message_buffer," lines of text",MESSAGE_LEVEL_BASIC_TASKS,PRINT); + + + for (;number_of_lines_of_text>0;number_of_lines_of_text--) + { + generate_random_string(text,length); + seek=rand()%1000; + add_to_buffer(&message_buffer,"trying to seek to ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_int_to_buffer(&message_buffer,seek,MESSAGE_LEVEL_BASIC_TASKS,PRINT); + output=yaffs_lseek(P_open_handles_array->handle[x],seek,SEEK_SET); + yaffs_check_for_errors(output, &message_buffer,"failed to seek","seeked file"); + add_to_buffer(&message_buffer,"trying to write to file",MESSAGE_LEVEL_BASIC_TASKS,PRINT); + output=yaffs_write(P_open_handles_array->handle[x], text, strlen(text)); + yaffs_check_for_errors(output, &message_buffer,"failed to write text","wrote text"); + + } + } +} + +void truncate_random_file(handle_regster *P_open_handles_array){ + int x=0; + int truncate_size=0; + int output=0; + + if (P_open_handles_array->number_of_open_handles>0){ + add_to_buffer(&message_buffer,"\n\ntruncate function ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + while (P_open_handles_array->handle[x]==-3){ /*find a random open handle*/ + x=rand() % (MAX_NUMBER_OF_OPENED_HANDLES-1); + } + add_to_buffer(&message_buffer,"trying to truncate ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_to_buffer(&message_buffer,P_open_handles_array->path[x],MESSAGE_LEVEL_BASIC_TASKS,PRINT); + + stat_file(P_open_handles_array->path[x]); + truncate_size=rand() %10000; + output=yaffs_ftruncate(P_open_handles_array->handle[x], truncate_size); + yaffs_check_for_errors(output, &message_buffer,"failed to truncate file","truncated file"); + } +} + +void close_random_file(handle_regster *P_open_handles_array){ + /*run out of space on the handle pointer array*/ + /*make space*/ + int x=0; + int output=0; + int start=0; + printf("trying to clear handle"); + if (P_open_handles_array->number_of_open_handles>0){ + start=rand() % (MAX_NUMBER_OF_OPENED_HANDLES-1); + + for (x=start;(x+1>start ||xMAX_NUMBER_OF_OPENED_HANDLES-1) x=0; + if (P_open_handles_array->handle[x] !=-3 ){ + //the handle is open, so try to close it. + break; + } + + } + if (P_open_handles_array->handle[x]!=-3) + { + add_to_buffer(&message_buffer,"\n\ntrying to close file: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_to_buffer(&message_buffer,P_open_handles_array->path[x],MESSAGE_LEVEL_BASIC_TASKS,PRINT); + add_to_buffer(&message_buffer,"file handle: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_int_to_buffer(&message_buffer,P_open_handles_array->handle[x],MESSAGE_LEVEL_BASIC_TASKS,PRINT); + + stat_file(P_open_handles_array->path[x]); + output=yaffs_close(P_open_handles_array->handle[x]); + + if (output==-1) yaffs_check_for_errors(output, &message_buffer,"failed to close file","closed file"); + else { + yaffs_check_for_errors(output, &message_buffer,"failed to close file","closed file"); + P_open_handles_array->handle[x]=-3; + P_open_handles_array->path[x][0]='\0'; + P_open_handles_array->number_of_open_handles--; + } + } + else { + add_to_buffer(&message_buffer,"\n\ntried to close file but could not find a open file ",MESSAGE_LEVEL_BASIC_TASKS,PRINT); + } + } +} + +void stat_file(char *path){ + int output=0; + struct yaffs_stat stat; + if (yaffs_access(path,0)==0){ + add_to_buffer(&message_buffer,"file exists, trying to stat: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + add_to_buffer(&message_buffer,path,MESSAGE_LEVEL_BASIC_TASKS,PRINT); + output=yaffs_lstat(path,&stat); + yaffs_check_for_errors(output, &message_buffer,"failed to stat file","statted file"); + //stat.st_ino,(int)stat.st_size,stat.st_mode + add_to_buffer(&message_buffer,"yaffs inode: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_int_to_buffer(&message_buffer,stat.st_ino,MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_to_buffer(&message_buffer," file size: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_int_to_buffer(&message_buffer,(int)stat.st_size,MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_to_buffer(&message_buffer," file mode: ",MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_int_to_buffer(&message_buffer,stat.st_mode,MESSAGE_LEVEL_BASIC_TASKS,PRINT); + } + else{ + add_to_buffer(&message_buffer,path,MESSAGE_LEVEL_BASIC_TASKS,NPRINT); + append_to_buffer(&message_buffer," does not exist,could not stat",MESSAGE_LEVEL_BASIC_TASKS,PRINT); + } +} + +void test(char*yaffs_test_dir){ + struct yaffs_stat stat; + int output=0; + //char name[MAX_FILE_NAME_SIZE+3 ]="apple\0"; + //char path[MAX_FILE_NAME_SIZE]; + handle_regster open_handles_array; + //int handle_pointers[MAX_NUMBER_OF_OPENED_HANDLES]; + //int number_of_opened_handles=0; + int x=0; + + + open_handles_array.number_of_open_handles=0; + for (x=0;x2 ; x++) + { + //printf("x=%d\n",x); + /* keep generating a charecter until the charecter is legal*/ + while((letter=='\0' )||(letter=='/')||(letter=='\\')){ + letter=(rand() % 126-32)+32; /*generate a number between 32 and 126 and uses it as a charecter (letter) */ + } + ptr[x]=letter; + //printf("charecter generated is %c\n",ptr[x]); + } + ptr[x+1]='\0'; /*adds NULL charecter to turn it into a string*/ + +} + diff --git a/direct/timothy_tests/stress_tester/yaffs_tester.h b/direct/timothy_tests/stress_tester/yaffs_tester.h new file mode 100644 index 0000000..11a0815 --- /dev/null +++ b/direct/timothy_tests/stress_tester/yaffs_tester.h @@ -0,0 +1,48 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __YAFFS_TESTER_H__ + #define __YAFFS_TESTER_H__ + +#include +#include +#include +#include + +#include "yaffsfs.h" /* it is in "yaffs2/direct/" link it in the Makefile */ +#include "message_buffer.h" +#include "error_handler.h" + +#define MAX_NUMBER_OF_OPENED_HANDLES 70 +#define MAX_FILE_NAME_SIZE 51 + +typedef struct handle_regster_template{ + int handle[MAX_NUMBER_OF_OPENED_HANDLES]; + char path[MAX_NUMBER_OF_OPENED_HANDLES][100]; + int number_of_open_handles; +}handle_regster; + + +void init(char *yaffs_test_dir,char *yaffs_mount_dir,int argc, char *argv[]); /*sets up yaffs and mounts yaffs */ +void test(char *yaffs_test_dir); /*contains the test code*/ +void generate_random_string(char *ptr,int length_of_str); /*generates a random string of letters to be used for a name*/ +void join_paths(char *path1,char *path2,char *newpath ); +void copy_array(char *from,char *to, unsigned int from_offset,unsigned int to_offset); +void stat_file(char *path); +void write_to_random_file(handle_regster *P_open_handles_array); +void close_random_file(handle_regster *P_open_handles_array); +void quit_program(); +void truncate_random_file(handle_regster *P_open_handles_array); +#endif diff --git a/direct/timothy_tests/threading/Makefile b/direct/timothy_tests/threading/Makefile index e733471..cb3c1e4 100644 --- a/direct/timothy_tests/threading/Makefile +++ b/direct/timothy_tests/threading/Makefile @@ -42,7 +42,8 @@ COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ yaffs_yaffs1.o \ yaffs_yaffs2.o \ yaffs_verify.o \ - yaffs_error.o + yaffs_error.o \ + yaffs_summary.o # yaffs_checkptrwtest.o\ @@ -65,7 +66,8 @@ YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscomp yaffs_yaffs1.c yaffs_yaffs1.h \ yaffs_yaffs2.c yaffs_yaffs2.h \ yaffs_bitmap.c yaffs_bitmap.h \ - yaffs_verify.c yaffs_verify.h + yaffs_verify.c yaffs_verify.h \ + yaffs_summary.c yaffs_summary.h YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ yaffsfs.h ydirectenv.h \ diff --git a/direct/timothy_tests/threading/README.txt b/direct/timothy_tests/threading/README.txt new file mode 100644 index 0000000..68c1a61 --- /dev/null +++ b/direct/timothy_tests/threading/README.txt @@ -0,0 +1,12 @@ +Created by Timothy Manning on 7/01/11 + +This test is designed to test the locking ability of yaffs functions. + +compile command: make +run command: ./threading + + +command line arguments are: + -h displays the help contents + -t sets the number of threads + diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/Makefile b/direct/timothy_tests/yaffs_and_linux_mirror_tests/Makefile new file mode 100644 index 0000000..0ba8539 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/Makefile @@ -0,0 +1,119 @@ +# Makefile for YAFFS direct stress tests +# +# +# YAFFS: Yet another Flash File System. A NAND-flash specific file system. +# +# Copyright (C) 2003-2010 Aleph One Ltd. +# +# +# Created by Charles Manning +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# NB Warning this Makefile does not include header dependencies. +# +# $Id: Makefile,v 1.7 2010-02-25 22:34:47 charles Exp $ + +#EXTRA_COMPILE_FLAGS = -DYAFFS_IGNORE_TAGS_ECC + +CFLAGS = -DCONFIG_YAFFS_DIRECT -DCONFIG_YAFFS_YAFFS2 +CFLAGS += -DCONFIG_YAFFS_PROVIDE_DEFS -DCONFIG_YAFFSFS_PROVIDE_VALUES +CFLAGS += -Wall -g $(EXTRA_COMPILE_FLAGS) -Wstrict-aliasing +#CFLAGS += -fno-strict-aliasing +CFLAGS += -O0 +CFLAGS += -Wextra -Wpointer-arith +#CFLAGS += -DCONFIG_YAFFS_VALGRIND_TEST + +#CFLAGS+= -Wshadow -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wmissing-declarations +#CFLAGS+= -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline + + +COMMONTESTOBJS = yaffscfg2k.o yaffs_osglue.o yaffs_hweight.o \ + yaffs_ecc.o yaffs_fileem.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o \ + yaffs_packedtags1.o yaffs_ramdisk.o yaffs_ramem2k.o \ + yaffs_tagscompat.o yaffs_packedtags2.o yaffs_nand.o \ + yaffs_checkptrw.o yaffs_qsort.o\ + yaffs_nameval.o yaffs_attribs.o \ + yaffs_norif1.o ynorsim.o \ + yaffs_allocator.o \ + yaffs_bitmap.o \ + yaffs_yaffs1.o \ + yaffs_yaffs2.o \ + yaffs_verify.o \ + yaffs_error.o \ + yaffs_summary.o + +# yaffs_checkptrwtest.o\ + +TESTFILES = mirror_tests.o lib.o\ + linux_test_open.o yaffs_test_open.o\ + linux_test_truncate.o yaffs_test_truncate.o \ + linux_test_unlink.o yaffs_test_unlink.o \ + linux_test_write.o yaffs_test_write.o + + + + +YAFFSTESTOBJS = $(COMMONTESTOBJS) $(TESTFILES) + + +ALLOBJS = $(sort $(YAFFSTESTOBJS)) $(PYTHONOBJS) + +YAFFSSYMLINKS = yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffs_tagscompat.c yaffs_tagscompat.h \ + yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h \ + yaffs_nand.c yaffs_nand.h yaffs_getblockinfo.h \ + yaffs_checkptrw.h yaffs_checkptrw.c \ + yaffs_nameval.c yaffs_nameval.h \ + yaffs_trace.h yaffs_attribs.h \ + yaffs_allocator.c yaffs_allocator.h \ + yaffs_yaffs1.c yaffs_yaffs1.h \ + yaffs_yaffs2.c yaffs_yaffs2.h \ + yaffs_bitmap.c yaffs_bitmap.h \ + yaffs_verify.c yaffs_verify.h \ + yaffs_summary.c yaffs_summary.h + +YAFFSDIRECTSYMLINKS = yaffsfs.c yaffs_flashif.h yaffs_flashif2.h\ + yaffsfs.h ydirectenv.h \ + yaffs_flashif.c yaffscfg.h yaffs_qsort.c \ + yaffs_nandemul2k.h yaffs_list.h \ + yaffs_attribs.c yaffs_osglue.h \ + yaffs_nandif.c yaffs_nandif.h yportenv.h \ + yaffs_hweight.h yaffs_hweight.c \ + yaffs_error.c + + +DIRECTEXTRASYMLINKS = yaffscfg2k.c yaffs_fileem2k.c yaffs_fileem2k.h\ + yaffs_fileem.c yaffs_norif1.c yaffs_norif1.h \ + yaffs_ramdisk.c yaffs_ramdisk.h yaffs_ramem2k.c \ + ynorsim.h ynorsim.c yaffs_osglue.c + +SYMLINKS = $(YAFFSSYMLINKS) $(YAFFSDIRECTSYMLINKS) $(DIRECTEXTRASYMLINKS) $(PYTONOSYMLINKS) +#all: directtest2k boottest + +all: mirror_tests + +$(ALLOBJS): %.o: %.c + gcc -c $(CFLAGS) -o $@ $< + +$(PYTONOSYMLINKS): + ln -s ../../python/$@ $@ + +$(YAFFSSYMLINKS): + ln -s ../../../$@ $@ + +$(YAFFSDIRECTSYMLINKS): + ln -s ../../$@ $@ + +$(DIRECTEXTRASYMLINKS): + ln -s ../../basic-test/$@ $@ + + +mirror_tests: $(SYMLINKS) $(ALLOBJS) + gcc $(CFLLAG) -o $@ $(ALLOBJS) + + + +clean: + rm -f mirror_tests $(ALLOBJS) core $(SYMLINKS) diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/README.txt b/direct/timothy_tests/yaffs_and_linux_mirror_tests/README.txt new file mode 100644 index 0000000..2c03959 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/README.txt @@ -0,0 +1,27 @@ +Made by Timothy Manning on 24/12/2010 + + + mirror_tests is designed to check that yaffs behaves the same way as linux. + This is done by applying the same command to both linux and yaffs and + then checking the output of the functions. + The default place for creating linux files is direct/timothy_tests/mirror_tests/tests/ + This directory is removed and is recreated at the beginning of each test, + However some of the files may be read only and cannot be deleted. + It is much better to remove this directory via the command line. + + rm test/*;rmdir test/;./mirror_tests -n 100 -v + +compile command: make +run command: mirror_tests + +Command line arguments + -yaffs_path [PATH] sets the path for yaffs. + -linux_path [PATH] sets the path for linux. + -p [NUMBER] sets the print level for mirror_tests. + -v verbose mode everything is printed + -q quiet mode nothing is printed. + -n [number] sets the number of random tests to run. + -s [number] seeds rand with the number + -t [number] sets yaffs_trace to the number + -clean removes emfile and test dir + diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/lib.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/lib.c new file mode 100644 index 0000000..079ed25 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/lib.c @@ -0,0 +1,141 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "lib.h" + +static int EXIT_ON_ERROR = 1; +static int PRINT_LEVEL = 2; //This sets the level of detail which is printed. There are 3 levels 0,1,2 and 3 + //0 just prints the number of tests passed and failed. + //1 is the basic print level. it will print the details of a failed test. + //2 will print if a test passes and cleans. +void set_print_level(int new_level) +{ + PRINT_LEVEL=new_level; +} +int get_print_level(void) +{ + return PRINT_LEVEL; +} + +void set_exit_on_error(int num) +{ + EXIT_ON_ERROR=num; +} + +int get_exit_on_error(void) +{ + return EXIT_ON_ERROR; +} + +void display_error(void) +{ + +} + +void get_error_yaffs(void) +{ + int error_code=0; + char message[30]; + message[0]='\0'; + + error_code=yaffs_get_error(); + sprintf(message,"yaffs_error code %d\n",error_code); + print_message(1,message); + sprintf(message,"error is : %s\n",yaffs_error_to_str(error_code)); + print_message(1,message); +} + +void get_error_linux(void) +{ + int error_code=0; + char message[30]; + message[0]='\0'; + + error_code=errno; + sprintf(message,"linux_error code %d\n",error_code); + print_message(1,message); + strcpy(message,"error code"); + sprintf(message,"error is : %s\n",yaffs_error_to_str(error_code)); + //perror(message); + print_message(1,message); +} +void generate_random_string(char *ptr,int length_of_str){ + unsigned int x; + unsigned int length=((rand() %(length_of_str-3))+3); /*creates a int with the number of charecters been between 1 and 51*/ + char letter='\0'; + strcpy(ptr,""); + //printf("generating string\n"); + //printf("string length is %d\n",length); + for (x=0; x <= (length-2) &&length>2 ; x++) + { + //printf("x=%d\n",x); + /* keep generating a charecter until the charecter is legal*/ + while((letter=='\0' )||(letter=='/')||(letter=='\\')){ + letter=(rand() % 125-59)+58; /*generate a number between 32 and 126 and uses it as a charecter (letter) */ + } + ptr[x]=letter; + //printf("charecter generated is %c\n",ptr[x]); + } + ptr[x+1]='\0'; /*adds NULL charecter to turn it into a string*/ + +} + +void join_paths(char *path1,char *path2,char *new_path ) +{ + char message[100]; + print_message(3,"joining paths\n"); + sprintf(message,"path1: %s\n",path1); + print_message(3,message); + sprintf(message,"path2: %s\n",path2); + print_message(3,message); + strcpy(new_path,""); + //strcat(new_path,path1); /*since all functions have this then pull it out*/ + if ( (path1[(sizeof(path1)/sizeof(char))-2]=='/') && path2[0]!='/') { + /*paths are compatiable. concatanate them. note -2 is because of \0*/ + strcat(new_path,path1); + strcat(new_path,path2); + //char new_path[(sizeof(path1)/sizeof(char))+(sizeof(path2)/sizeof(char))]; + //strcpy(new_path,strcat(path1,path2)); + //return new_path; + } else if ((path1[(sizeof(path1)/sizeof(char))-2]!='/') && path2[0]=='/') { + /*paths are compatiable. concatanate them*/ + strcat(new_path,path1); + strcat(new_path,path2); + + } else if ((path1[(sizeof(path1)/sizeof(char))-2]!='/') && path2[0]!='/') { + /*need to add a "/". */ + strcat(new_path,path1); + strcat(new_path,"/"); + strcat(new_path,path2); + + } else if ((path1[(sizeof(path1)/sizeof(char))-2]=='/') && path2[0]=='/') { + /*need to remove a "/". */ + /*yaffs does not mind the extra slash. */ + strcat(new_path,path1); + strcat(new_path,path2); + + } else { + //error + //return -1; + } +} + +void print_message(char print_level,char *message) +{ + if (print_level <= PRINT_LEVEL){ + printf(message); + } +} + + + diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/lib.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/lib.h new file mode 100644 index 0000000..0b33479 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/lib.h @@ -0,0 +1,53 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef _lib_h__ +#define _lib_h__ + +#include +#include +#include "yaffsfs.h" +#include + +typedef struct arg_temp2{ + char char1; + char char2; + char string1[100]; + char string2[100]; + int int1; + int int2; +} arg_temp; + + +typedef struct test_dir_temp +{ + int type_of_test; //used to tell if it is LINUX of YAFFS + char root_path[200]; +} test_dir; +test_dir yaffs_struct,linux_struct; + + + +void generate_random_string(char *ptr,int length_of_str); +void join_paths(char *path1,char *path2,char *new_path ); +void print_message(char print_level, char *message); +void set_print_level(int new_level); +int get_print_level(void); +void set_exit_on_error(int num); +int get_exit_on_error(void); +void display_error(void); +void get_error_yaffs(void); +void get_error_linux(void); +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_open.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_open.c new file mode 100644 index 0000000..871dc56 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_open.c @@ -0,0 +1,38 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "linux_test_open.h" + +int linux_test_open(arg_temp *args_struct) +{ + char path[250]; + char message[150]; + int output; + join_paths(linux_struct.root_path,args_struct->string1, path ); + sprintf(message,"file path: %s\n",path); + print_message(3,message); + + output= open(path,args_struct->char1 & (O_TRUNC|O_EXCL|O_CREAT|O_APPEND) ,args_struct->char2& (S_IREAD|S_IWRITE)); + if (output>=0){ + output=close(output); + if (output<0) { + print_message(3,"failed to close handle\n"); + return -1; + } else { + return 1; + } + } else { + print_message(3,"failed to open file\n"); + return -1; + } +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_open.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_open.h new file mode 100644 index 0000000..6274934 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_open.h @@ -0,0 +1,24 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __linux_test_open_h__ +#define __linux_test_open_h__ +#include +#include +#include +#include "lib.h" + +int linux_test_open(arg_temp *args_struct); +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_truncate.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_truncate.c new file mode 100644 index 0000000..94e8959 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_truncate.c @@ -0,0 +1,27 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "linux_test_truncate.h" + +int linux_test_truncate(arg_temp *args_struct) +{ + char path[200]; + char message[200]; + int output=0; + join_paths(linux_struct.root_path,args_struct->string1, path ); + sprintf(message,"file path: %s\n",path); + print_message(3,message); + + output=truncate(path,args_struct->int1); + return output; +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_truncate.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_truncate.h new file mode 100644 index 0000000..7ef91d0 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_truncate.h @@ -0,0 +1,27 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __linux_test_truncate_h__ +#define __linux_test_truncate_h__ +#include +#include +#include +#include +#include "yaffsfs.h" +#include "lib.h" + +int linux_test_truncate(arg_temp *args_struct); + +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_unlink.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_unlink.c new file mode 100644 index 0000000..575e7ae --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_unlink.c @@ -0,0 +1,33 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "linux_test_unlink.h" + +int linux_test_unlink(arg_temp *args_struct) +{ + char path[250]; + char message[150]; + int output; + join_paths(linux_struct.root_path,args_struct->string1, path ); + sprintf(message,"file path: %s\n",path); + print_message(3,message); + + output= unlink(path); + + if (output<0) { + print_message(3,"failed to unlink file\n"); + return -1; + } else { + return 1; + } +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_unlink.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_unlink.h new file mode 100644 index 0000000..7572aa8 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_unlink.h @@ -0,0 +1,26 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __linux_test_unlink_h__ +#define __linux_test_unlink_h__ +#include +#include +#include +#include "yaffsfs.h" +#include "lib.h" + +int linux_test_unlink(arg_temp *args_struct); + +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_write.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_write.c new file mode 100644 index 0000000..b46c211 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_write.c @@ -0,0 +1,37 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "linux_test_write.h" + +int linux_test_write(arg_temp *args_struct) +{ + char path[200]; + char message[200]; + int output=0; + int handle=-1; + join_paths(linux_struct.root_path,args_struct->string1, path ); + sprintf(message,"trying to write to: %s\nwith mode set to %o \n",path,args_struct->char1 ); + print_message(3,message); + printf("mode S_IREAD %d S_IWRITE %d\n",(args_struct->char2 & S_IREAD),(args_struct->char2 & S_IWRITE)); + handle=open(path,((args_struct->char1 &(O_TRUNC|O_EXCL|O_CREAT|O_APPEND))|O_RDWR),(args_struct->char2&(S_IREAD|S_IWRITE))); + printf("handle %d\n",handle); + if (handle<0){ + print_message(3,"failed to open a handle\n"); + return -1; //handle failed to open + } + sprintf(message,"trying to write: %d bytes into the file\n",strlen(args_struct->string2)); + print_message(3,message); + output=write(handle,args_struct->string2,strlen(args_struct->string2)); + close(handle); + return output; +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_write.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_write.h new file mode 100644 index 0000000..611fe7d --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/linux_test_write.h @@ -0,0 +1,27 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __linux_test_write_h__ +#define __linux_test_write_h__ +#include +#include +#include +#include +#include "yaffsfs.h" +#include "lib.h" + +int linux_test_write(arg_temp *args_struct); + +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/mirror_tests.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/mirror_tests.c new file mode 100644 index 0000000..cd4e5f2 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/mirror_tests.c @@ -0,0 +1,601 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "mirror_tests.h" + +int random_seed; +int simulate_power_failure = 0; + +int num_of_random_tests=1; + + + +typedef struct test_list_temp2{ + char *test_name; + int (*test_pointer)(arg_temp *args_struct); +}test_list_temp; + +typedef struct test_temp2 { + int num_of_tests; + test_list_temp test_list[]; +}test_temp; + +test_temp yaffs_tests={ + 4, + {{"yaffs_test_open",yaffs_test_open}, + {"yaffs_test_truncate",yaffs_test_truncate}, + {"yaffs_test_unlink",yaffs_test_unlink}, + {"yaffs_test_write",yaffs_test_write} + } +}; + +test_temp linux_tests={ + 4, + {{"linux_test_open",linux_test_open}, + {"linux_test_truncate",linux_test_truncate}, + {"linux_test_unlink",linux_test_unlink}, + {"linux_test_write",linux_test_write} + } +}; + +const struct option long_options[]={ + {"help", 0,NULL,'h'}, + {"yaffs_path", 1,NULL,'y'}, + {"linux_path", 1,NULL,'l'}, + {"print_level", 1,NULL,'p'}, + {"quiet", 0,NULL,'q'}, + {"number", 1,NULL,'n'}, + {"seed", 1,NULL,'s'}, + {"trace", 1,NULL,'t'}, + {"clean", 0,NULL,'c'}, + {"verbose", 0,NULL,'v'} +}; + +const char short_options[]="hy:l:p:qn:s:t:cv"; + + +int main(int argc, char *argv[]) +{ + char message[100]; + +// yaffs_tests.num_of_tests=(sizeof(yaffs_tests)/sizeof(test_temp)); +// linux_tests.num_of_tests=(sizeof(linux_tests)/sizeof(test_temp)); + + init(argc,argv); + print_message(1,"running mirror_tests\n"); + sprintf(message,"linux_root_path: %s\n",linux_struct.root_path); + print_message(3,message); + sprintf(message,"yaffs_root_path: %s\n",yaffs_struct.root_path); + print_message(3,message); + sprintf(message,"linux_num_of_tests: %d\n",linux_tests.num_of_tests); + print_message(3,message); + sprintf(message,"yaffs_num_of_tests: %d\n",yaffs_tests.num_of_tests); + print_message(3,message); + + run_random_test(num_of_random_tests); + //compare_linux_and_yaffs(); + yaffs_unmount("yaffs2"); + return 0; +} + +void init(int argc, char *argv[]) +{ + char dir[200]; + dir[0]='\0'; + int x=-1; + char message[100]; + int new_option; + + x=(unsigned)time(NULL); + sprintf(message,"seeding srand with: %d\n",x); + print_message(2,message); + srand(x); + yaffs_set_trace(0); + linux_struct.type_of_test =LINUX; + yaffs_struct.type_of_test =YAFFS; + + sprintf(message,"current absolute path is: %s\n",getcwd(dir,200)); + print_message(3,message); + strcpy(dir,getcwd(dir,200)); + + strcat(dir,"/test/"); + printf("dir: %s\n",dir); + strcpy(linux_struct.root_path,dir); + strcpy(yaffs_struct.root_path,"yaffs2/test/"); + + + do { + new_option=getopt_long(argc,argv,short_options,long_options,NULL); + if (new_option=='h'){ + printf("mirror_tests help\n"); + printf("arguments:\n"); + printf("\t-yaffs_path [PATH] //sets the path for yaffs.\n"); + printf("\t-linux_path [PATH] //sets the path for linux.\n"); + printf("\t-p [NUMBER] //sets the print level for mirror_tests.\n"); + printf("\t-v //verbose mode everything is printed\n"); + printf("\t-q //quiet mode nothing is printed.\n"); + printf("\t-n [number] //sets the number of random tests to run.\n"); + printf("\t-s [number] //seeds rand with the number\n"); + printf("\t-t [number] //sets yaffs_trace to the number\n"); + printf("\t-clean //removes emfile and test dir\n"); + exit(0); + } else if (new_option=='y'){ + strcpy(yaffs_struct.root_path, optarg); + } else if (new_option=='l'){ + strcpy(linux_struct.root_path, optarg); + } else if (new_option=='p'){ + set_print_level(atoi(optarg)); + } else if (new_option=='v'){ + set_print_level(5); + } else if (new_option=='q'){ + set_print_level(-1); + } else if (new_option=='n'){ + num_of_random_tests=atoi(optarg); + } else if (new_option=='s'){ + srand(atoi(argv[x+1])); + } else if (new_option=='t'){ + yaffs_set_trace(atoi(optarg)); + } else if (new_option=='c'){ + clean_dir(); + exit(0); + } else if (new_option==-1){ + + } else if (new_option=='?') { + printf("bad argument\n"); + exit(0); + } + + } while(new_option!=-1); + clean_dir(); + yaffs_start_up(); + print_message(2,"\nmounting yaffs\n"); + x=yaffs_mount("yaffs2"); + if (x<0) { + print_message(3,"failed to mount yaffs\n"); + get_error_yaffs(); + } else { + print_message(3,"mounted yaffs\n"); + } + + + print_message(3,"\nmaking linux test dir\n"); + x=mkdir(linux_struct.root_path,0777); + if (x<0) { + print_message(1,"failed to make dir\n"); + get_error_linux(); + } else { + print_message(3,"made dir\n"); + } + + print_message(3,"\nmaking yaffs test dir\n"); + x=yaffs_mkdir(yaffs_struct.root_path,0777); + if (x<0) { + print_message(1,"failed to make dir\n"); + get_error_yaffs(); + } else { + print_message(3,"made dir\n"); + } +} + +int run_random_test(int num_of_random_tests) +{ + int y=0; + int x=-1; + int id=0; + int test_id=-1; + int num_of_tests_before_check=1; + char message[200]; + arg_temp args_struct; + for (y=0;(y*num_of_tests_before_check)=4){ + get_error_yaffs(); + get_error_linux(); + } + + if ((abs(yaffs_get_error())!=abs(errno)) && + (abs(yaffs_get_error())!=EISDIR && abs(errno) != 0) && + (abs(yaffs_get_error())!=ENOENT && abs(errno) != EACCES)&& + (abs(yaffs_get_error())!=EINVAL && abs(errno) != EBADF) + ){ + print_message(2,"\ndifference in returned errors######################################\n"); + get_error_yaffs(); + get_error_linux(); + if (get_exit_on_error()){ + exit(0); + } + } + } + //check_mode(&args_struct); + compare_linux_and_yaffs(&args_struct); + //check_mode(&args_struct); + + } + compare_linux_and_yaffs(&args_struct); +} + +int select_test_id(int test_len) +{ + int id=0; + //printf("test_len = %d\n",test_len); + id=(rand() % test_len ); + //printf("id %d\n",id); + return id; + +} + +int check_mode(arg_temp *args_struct) +{ + char path[200]; + char message[200]; + int output=0; + + struct yaffs_stat yaffs_stat_struct; + join_paths(yaffs_struct.root_path,args_struct->string1, path ); + sprintf(message,"\ntrying to stat to: %s\n",path); + print_message(3,message); + output=yaffs_stat(path,&yaffs_stat_struct); + if (output < 0){ + sprintf(message,"failed to stat the file\n"); + print_message(3,message); + get_error_yaffs(); + } else { + sprintf(message,"stated the file\n"); + print_message(3,message); + sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); + print_message(3,message); + sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); + print_message(3,message); + } + return 1; +} + +int check_mode_file(char *path) +{ + char message[200]; + int output=0; + + struct yaffs_stat yaffs_stat_struct; + + sprintf(message,"\ntrying to stat to: %s\n",path); + print_message(3,message); + output=yaffs_stat(path,&yaffs_stat_struct); + if (output < 0){ + sprintf(message,"failed to stat the file\n"); + print_message(3,message); + get_error_yaffs(); + } else { + sprintf(message,"stated the file\n"); + print_message(3,message); + sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); + print_message(3,message); + sprintf(message,"mode S_IREAD %d S_IWRITE %d\n\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); + print_message(3,message); + } + return 1; +} + +int compare_linux_and_yaffs(arg_temp *args_struct) +{ + int x=0,y=0; + char l_path[200]; + char y_path[200]; + char file_name[200]; + int exit_bool=0; + int number_of_files_in_yaffs=0; + int number_of_files_in_linux=0; + char message[200]; + char **yaffs_file_list=NULL; + char **linux_file_list=NULL; + + struct yaffs_stat yaffs_stat_struct; + struct stat linux_stat_struct; + yaffs_DIR *yaffs_open_dir; + yaffs_dirent *yaffs_current_file; + + DIR *linux_open_dir; + struct dirent *linux_current_file; + + l_path[0]='\0'; + y_path[0]='\0'; + file_name[0]='\0'; + message[0]='\0'; + print_message(2,"\n\n\n comparing folders\n"); +// check_mode_file("yaffs2/test/YY"); + //find out the number of files in the directory + yaffs_open_dir = yaffs_opendir(yaffs_struct.root_path); + if (yaffs_open_dir) { + for (x=0;yaffs_readdir(yaffs_open_dir);x++){} + number_of_files_in_yaffs=x; + sprintf(message,"number of files in yaffs dir= %d\n",number_of_files_in_yaffs); + print_message(2,message); + yaffs_rewinddir(yaffs_open_dir); + } else { + print_message(3,"failed to open yaffs test dir\n"); + } + //create array + yaffs_file_list= (char **)malloc(x*sizeof(char*)); + for (x=0;xd_name = %s\n",yaffs_current_file->d_name); + if (yaffs_current_file){ + strcpy(yaffs_file_list[x],yaffs_current_file->d_name); + + } + yaffs_current_file =yaffs_readdir(yaffs_open_dir); + } + yaffs_closedir(yaffs_open_dir); + } else { + print_message(3,"failed to populate yaffs test list\n"); + } + + + //find out the number of files in the directory + linux_open_dir = opendir(linux_struct.root_path); + if (linux_open_dir){ + for (x=0;readdir(linux_open_dir);x++){} + number_of_files_in_linux=(x-2); + sprintf(message,"number of files in linux dir= %d\n",(number_of_files_in_linux)); + print_message(2,message); + //the -2 is because linux shows 2 extra files which are automaticly created. + + rewinddir(linux_open_dir); + } else { + print_message(3,"failed to open linux test dir\n"); + } + + //create array + linux_file_list= (char **)malloc(number_of_files_in_linux*sizeof(char*)); + + for (x=0;xd_name); + print_message(7,"opened file: "); + print_message(7,message); + print_message(7,"\n"); + } + if (linux_current_file && + 0!=strcmp(message,".")&& + 0!=strcmp(message,"..")){ + strcpy(file_name,linux_current_file->d_name); + //sprintf("file opened: %s\n",linux_current_file->d_name); + //print_message(3,message); + print_message(7,"added file to list\n"); + strcpy(linux_file_list[y],file_name); + sprintf(message,"file added to list: %s\n",linux_file_list[y]); + print_message(7,message); + y++; + } + linux_current_file =readdir(linux_open_dir); + } + closedir(linux_open_dir); + } else { + print_message(3,"failed to populate linux test dir\n"); + } + + + //match the files in both folders + for (x=0;x=0&& + stat(l_path,&linux_stat_struct)>=0){ + sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); + print_message(3,message); + sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); + print_message(3,message); + sprintf(message," linux file mode is %d\n",(linux_stat_struct.st_mode & (S_IREAD|S_IWRITE))); + print_message(3,message); + sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(linux_stat_struct.st_mode & S_IREAD),(linux_stat_struct.st_mode & S_IWRITE)); + print_message(3,message); + if ((yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))== + ( linux_stat_struct.st_mode & (S_IREAD|S_IWRITE))){ + print_message(2,"file modes match\n"); + } else { + print_message(2,"file modes do not match\n"); + exit_bool=1; + } + linux_file_list[y][0]=NULL; + yaffs_file_list[x][0]=NULL; + } else { + print_message(2,"failed to stat one of the files\n"); + get_error_yaffs(); + get_error_linux(); + } + + //read file contents + + + break; + } + } + } + + //print remaining files + for (x=0;xd_name); +// generate_array_of_objects_in_yaffs(); +// generate_array_of_objects_in_linux(); + //first do a check to see if both sides have the same objects on both sides. + //then stat all of the files and compare size and mode + //read the text of each file and compare them. + + //show the diffrences by printing them. + return 1; + +} + +void generate_random_numbers(arg_temp *args_struct) +{ + char string[51]; + args_struct->char1= (rand() % 255); + args_struct->char2= (rand() % 255); + args_struct->int1= (rand() % 100000); + args_struct->int2= (rand() % 100000); + generate_random_string(string,50); + strcpy(args_struct->string1, string); + generate_random_string(string,50); + strcpy(args_struct->string2, string); +} + +void run_yaffs_test(int id,arg_temp *args_struct) +{ + char message[200]; + int output =0; + print_message(3,"\n"); + //printf("id = %d\n",id); + sprintf(message,"running_test %s\n",yaffs_tests.test_list[id].test_name); + print_message(3,message); + output=yaffs_tests.test_list[id].test_pointer(args_struct); + if (output<0) { + sprintf(message,"test_failed %s\n",yaffs_tests.test_list[id].test_name); + print_message(3,message); + } else { + print_message(3,"test_passed\n"); + } +} + +void run_linux_test(int id,arg_temp *args_struct) +{ + char message[200]; + int output =0; + print_message(3,"\n"); + //printf("id = %d\n",id); + sprintf(message,"running_test %s\n",linux_tests.test_list[id].test_name); + print_message(3,message); + output=linux_tests.test_list[id].test_pointer(args_struct); + if (output<0) { + sprintf(message,"test_failed %s\n",linux_tests.test_list[id].test_name); + print_message(3,message); + } else { + print_message(3,"test_passed\n"); + } +} + + +void clean_dir(void) +{ + char string[200]; + char file[200]; + char message[200]; + DIR *linux_open_dir; + struct dirent *linux_current_file; + int x=0,output=0; + + getcwd(string,200); + strcat(string,"/emfile-2k-0"); + sprintf(message,"\n\nunlinking emfile at this path: %s\n",string); + print_message(3,message); + unlink(string); + + + linux_open_dir = opendir(linux_struct.root_path); + if (linux_open_dir){ + + do + { + + linux_current_file =readdir(linux_open_dir); + if (NULL!=linux_current_file){ + + strcpy(file,linux_struct.root_path); + strcat(file,linux_current_file->d_name); + sprintf(message,"unlinking file %s\n",file); + print_message(3,message); + print_message(3,"chmoding file\n"); + output=chmod(file,(S_IRUSR|S_IWUSR)); + if (output<0) { + get_error_linux(); + } + print_message(3,"unlinking file\n"); + output=unlink(file); + if (output<0) { + get_error_linux(); + } + } + } while(linux_current_file); + closedir(linux_open_dir); + rmdir(linux_struct.root_path); + } + +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/mirror_tests.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/mirror_tests.h new file mode 100644 index 0000000..9d30833 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/mirror_tests.h @@ -0,0 +1,61 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __mirror_tests_h__ +#define __mirror_tests_h__ + +#include +#include +#include //used for getting the current directory. +#include +#include +#include "yaffsfs.h" +#include "lib.h" +#include +#include +#include + +#include "linux_test_open.h" +#include "yaffs_test_open.h" +#include "linux_test_truncate.h" +#include "yaffs_test_truncate.h" +#include "linux_test_unlink.h" +#include "yaffs_test_unlink.h" +#include "linux_test_write.h" +#include "yaffs_test_write.h" + +#define LINUX 1 +#define YAFFS 2 + + + + + +void init(int argc, char *argv[]); +int run_random_test(int num_of_random_tests); +int compare_linux_and_yaffs(arg_temp *args_struct); + +int select_test_id(int test_len); +void generate_random_numbers(arg_temp *args_struct); +void run_yaffs_test(int id,arg_temp *args_struct); +void run_linux_test(int id,arg_temp *args_struct); +void clean_dir(void); +int select_test_id(int test_len); +int check_mode(arg_temp *args_struct); +int check_mode_file(char *path); +//void generate_array_of_objects_in_yaffs(void); +//void generate_array_of_objects_in_linux(void); + +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_open.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_open.c new file mode 100644 index 0000000..daeb8a4 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_open.c @@ -0,0 +1,38 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "yaffs_test_open.h" + +int yaffs_test_open(arg_temp *args_struct) +{ + char path[200]; + char message[100]; + int output=0; + join_paths(yaffs_struct.root_path,args_struct->string1, path ); + sprintf(message,"file path: %s\n",path); + print_message(3,message); + + output=yaffs_open(path,args_struct->char1 &(O_TRUNC|O_EXCL|O_CREAT|O_APPEND),args_struct->char2&(S_IREAD|S_IWRITE)); + if (output>=0){ + output= yaffs_close(output); + if (output<0) { + print_message(3,"failed to close handle\n"); + return -1; + } else { + return 1; + } + } else { + print_message(3,"failed to open file\n"); + return -1; + } +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_open.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_open.h new file mode 100644 index 0000000..d64bd29 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_open.h @@ -0,0 +1,26 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __yaffs_test_open_h__ +#define __yaffs_test_open_h__ +#include +#include +#include +#include "yaffsfs.h" +#include "lib.h" + +int yaffs_test_open(arg_temp *args_struct); + +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_truncate.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_truncate.c new file mode 100644 index 0000000..9e99590 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_truncate.c @@ -0,0 +1,27 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "yaffs_test_truncate.h" + +int yaffs_test_truncate(arg_temp *args_struct) +{ + char path[200]; + char message[200]; + int output=0; + join_paths(yaffs_struct.root_path,args_struct->string1, path ); + sprintf(message,"file path: %s\n",path); + print_message(3,message); + + output=yaffs_truncate(path,args_struct->int1); + return output; +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_truncate.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_truncate.h new file mode 100644 index 0000000..02517cb --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_truncate.h @@ -0,0 +1,26 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __yaffs_test_truncate_h__ +#define __yaffs_test_truncate_h__ +#include +#include +#include +#include "yaffsfs.h" +#include "lib.h" + +int yaffs_test_truncate(arg_temp *args_struct); + +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_unlink.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_unlink.c new file mode 100644 index 0000000..6982e77 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_unlink.c @@ -0,0 +1,34 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "yaffs_test_unlink.h" + +int yaffs_test_unlink(arg_temp *args_struct) +{ + char path[250]; + char message[150]; + int output; + join_paths(yaffs_struct.root_path,args_struct->string1, path ); + sprintf(message,"file path: %s\n",path); + print_message(3,message); + + output= yaffs_unlink(path); + + if (output<0) { + print_message(3,"failed to unlink file\n"); + return -1; + } else { + return 1; + } + +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_unlink.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_unlink.h new file mode 100644 index 0000000..cb8fdf2 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_unlink.h @@ -0,0 +1,26 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __yaffs_test_unlink_h__ +#define __yaffs_test_unlink_h__ +#include +#include +#include +#include "yaffsfs.h" +#include "lib.h" + +int yaffs_test_unlink(arg_temp *args_struct); + +#endif diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_write.c b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_write.c new file mode 100644 index 0000000..2820d68 --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_write.c @@ -0,0 +1,85 @@ +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "yaffs_test_write.h" + +int yaffs_test_write(arg_temp *args_struct) +{ + char path[200]; + char message[200]; + int output=0,output2=0; + int handle; + struct yaffs_stat yaffs_stat_struct; + join_paths(yaffs_struct.root_path,args_struct->string1, path ); + sprintf(message,"trying to write to: %s\nwith mode set to %o \n",path,args_struct->char1); + print_message(3,message); + printf("mode S_IREAD %d S_IWRITE %d\n",(args_struct->char2 & S_IREAD),(args_struct->char2 & S_IWRITE)); + handle=yaffs_open(path,((args_struct->char1 &(O_TRUNC|O_EXCL|O_CREAT|O_APPEND))|O_RDWR),(args_struct->char2&(S_IREAD|S_IWRITE))); + printf("handle %d\n",handle); + if (handle<0){ + print_message(3,"failed to open a handle\n"); + return -1; //handle failed to open + } + +/* output=yaffs_fstat(handle,&yaffs_stat_struct); + if (output < 0){ + sprintf(message,"failed to stat the file\n"); + print_message(3,message); + get_error_yaffs(); + } else { + sprintf(message,"stated the file\n"); + print_message(3,message); + sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); + print_message(3,message); + sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); + print_message(3,message); + } + + sprintf(message,"trying to write: %d bytes into the file\n",strlen(args_struct->string2)); + print_message(3,message); +*/ + output=yaffs_write(handle,&args_struct->string2,strlen(args_struct->string2)); + +/* print_message(3,"\n wrote to the file\n"); + output2=yaffs_fstat(handle,&yaffs_stat_struct); + if (output2 < 0){ + sprintf(message,"failed to stat the file\n"); + print_message(3,message); + get_error_yaffs(); + } else { + sprintf(message,"stated the file\n"); + print_message(3,message); + sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); + print_message(3,message); + sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); + print_message(3,message); + } +*/ yaffs_close(handle); +/* print_message(3,"\n closing the file\n"); + output2=yaffs_stat(path,&yaffs_stat_struct); + if (output2 < 0){ + sprintf(message,"failed to stat the file\n"); + print_message(3,message); + get_error_yaffs(); + } else { + sprintf(message,"stated the file\n"); + print_message(3,message); + sprintf(message," yaffs file mode is %d\n",(yaffs_stat_struct.st_mode & (S_IREAD| S_IWRITE))); + print_message(3,message); + sprintf(message,"mode S_IREAD %d S_IWRITE %d\n",(yaffs_stat_struct.st_mode & S_IREAD),(yaffs_stat_struct.st_mode & S_IWRITE)); + print_message(3,message); + } +*/ + + return output; +} diff --git a/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_write.h b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_write.h new file mode 100644 index 0000000..0332f6f --- /dev/null +++ b/direct/timothy_tests/yaffs_and_linux_mirror_tests/yaffs_test_write.h @@ -0,0 +1,27 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. + * + * Copyright (C) 2002-2011 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Timothy Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + */ + +#ifndef __yaffs_test_write_h__ +#define __yaffs_test_write_h__ +#include +#include +#include +#include +#include "yaffsfs.h" +#include "lib.h" + +int yaffs_test_write(arg_temp *args_struct); + +#endif -- cgit v1.2.3