From f67d10d7a5a6d1cc7d1cb6eaada2522873ce5e99 Mon Sep 17 00:00:00 2001 From: charles Date: Fri, 7 Oct 2005 03:48:50 +0000 Subject: [PATCH] Improve YDI lookup and device prefic handling --- direct/dtest.c | 138 ++++++++++++++++++++++++++++++++++++++++---- direct/yaffscfg2k.c | 11 +++- direct/yaffsfs.c | 32 +++++++--- direct/ydirectenv.h | 4 +- 4 files changed, 163 insertions(+), 22 deletions(-) diff --git a/direct/dtest.c b/direct/dtest.c index 096ea7e..3679b25 100644 --- a/direct/dtest.c +++ b/direct/dtest.c @@ -855,6 +855,30 @@ int yaffs_scan_test(const char *path) } +void rename_over_test(const char *mountpt) +{ + int i; + char a[100]; + char b[100]; + + sprintf(a,"%s/a",mountpt); + sprintf(b,"%s/b",mountpt); + + yaffs_StartUp(); + + yaffs_mount(mountpt); + i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, 0); + yaffs_close(i); + i = yaffs_open(b,O_CREAT | O_TRUNC | O_RDWR, 0); + 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); + +} int resize_stress_test(const char *path) { @@ -1256,28 +1280,117 @@ void fill_disk_test(const char *mountpt) } -void rename_over_test(const char *mountpt) + + +void lookup_test(const char *mountpt) { int i; + int h; char a[100]; char b[100]; - sprintf(a,"%s/a",mountpt); - sprintf(b,"%s/b",mountpt); + + yaffs_DIR *d; + yaffs_dirent *de; + struct yaffs_stat s; + char str[100]; + + yaffs_StartUp(); + + 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); + yaffs_close(h); + } + + yaffs_rewinddir(d); + 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 freespace_test(const char *mountpt) +{ + int i; + int h; + char a[100]; + char b[100]; + + int f0; + int f1; + int f2; + int f3; + sprintf(a,"%s/aaa",mountpt); yaffs_StartUp(); yaffs_mount(mountpt); - i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, 0); - yaffs_close(i); - i = yaffs_open(b,O_CREAT | O_TRUNC | O_RDWR, 0); - yaffs_close(i); - yaffs_rename(a,b); + 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 scan_deleted_files_test(const char *mountpt) { char fn[100]; @@ -1380,9 +1493,9 @@ void write_200k_file(const char *fn, const char *fdel, const char *fdel1) yaffs_unlink(fdel1); - } + void verify_200k_file(const char *fn) { int h1; @@ -1401,8 +1514,7 @@ void verify_200k_file(const char *fn) } } - yaffs_close(h1); - + yaffs_close(h1); } @@ -1462,7 +1574,9 @@ int main(int argc, char *argv[]) //long_test_on_path("/ram2k"); // long_test_on_path("/flash"); //fill_disk_test("/flash"); - rename_over_test("/flash"); + // rename_over_test("/flash"); + //lookup_test("/flash"); + freespace_test("/flash"); diff --git a/direct/yaffscfg2k.c b/direct/yaffscfg2k.c index 9c45524..e63411a 100644 --- a/direct/yaffscfg2k.c +++ b/direct/yaffscfg2k.c @@ -59,12 +59,19 @@ static yaffs_Device flashDev; static yaffs_Device ram2kDev; static yaffsfs_DeviceConfiguration yaffsfs_config[] = { - +#if 0 { "/ram", &ramDev}, { "/boot", &bootDev}, - { "/flash", &flashDev}, + { "/flash/", &flashDev}, + { "/ram2k", &ram2kDev}, + {(void *)0,(void *)0} +#else + { "/", &ramDev}, + { "/flash/boot", &bootDev}, + { "/flash/", &flashDev}, { "/ram2k", &ram2kDev}, {(void *)0,(void *)0} +#endif }; diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index 956df2c..4f06f9c 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -25,7 +25,7 @@ #endif -const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.6 2005-09-20 05:05:40 charles Exp $"; +const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.7 2005-10-07 03:48:50 charles Exp $"; // configurationList is the list of devices that are supported static yaffsfs_DeviceConfiguration *yaffsfs_configurationList; @@ -144,30 +144,47 @@ int yaffsfs_Match(char a, char b) // yaffsfs_FindDevice // yaffsfs_FindRoot // Scan the configuration list to find the root. +// Curveballs: Should match paths that end in '/' too +// Curveball2 Might have "/x/ and "/x/y". Need to return the longest match static yaffs_Device *yaffsfs_FindDevice(const char *path, char **restOfPath) { yaffsfs_DeviceConfiguration *cfg = yaffsfs_configurationList; const char *leftOver; const char *p; + yaffs_Device *retval = NULL; + int thisMatchLength; + int longestMatch = -1; + // Check all configs, choose the one that: + // 1) Actually matches a prefix (ie /a amd /abc will not match + // 2) Matches the longest. while(cfg && cfg->prefix && cfg->dev) { leftOver = path; p = cfg->prefix; - while(*p && *leftOver && yaffsfs_Match(*p,*leftOver)) + thisMatchLength = 0; + + while(*p && //unmatched part of prefix + strcmp(p,"/") && // the rest of the prefix is not / (to catch / at end) + *leftOver && + yaffsfs_Match(*p,*leftOver)) { p++; leftOver++; + thisMatchLength++; } - if(!*p && (!*leftOver || *leftOver == '/')) + if((!*p || strcmp(p,"/") == 0) && // end of prefix + (!*leftOver || *leftOver == '/') && // no more in this path name part + (thisMatchLength > longestMatch)) { // Matched prefix *restOfPath = (char *)leftOver; - return cfg->dev; + retval = cfg->dev; + longestMatch = thisMatchLength; } cfg++; } - return NULL; + return retval; } static yaffs_Object *yaffsfs_FindRoot(const char *path, char **restOfPath) @@ -1250,8 +1267,9 @@ yaffs_DIR *yaffs_opendir(const char *dirname) dir = (yaffs_DIR *)dsc; if(dsc) { + memset(dsc,0,sizeof(yaffsfs_DirectorySearchContext)); dsc->magic = YAFFS_MAGIC; - memset(dsc->name,0,NAME_MAX+1); + dsc->dirObj = obj; strncpy(dsc->name,dirname,NAME_MAX); INIT_LIST_HEAD(&dsc->others); @@ -1259,7 +1277,7 @@ yaffs_DIR *yaffs_opendir(const char *dirname) INIT_LIST_HEAD(&search_contexts); list_add(&dsc->others,&search_contexts); - } + yaffsfs_SetDirRewound(dsc); } } diff --git a/direct/ydirectenv.h b/direct/ydirectenv.h index 2b39af5..561c8b5 100644 --- a/direct/ydirectenv.h +++ b/direct/ydirectenv.h @@ -14,7 +14,7 @@ * * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. * - * $Id: ydirectenv.h,v 1.1 2005-07-03 05:48:11 charles Exp $ + * $Id: ydirectenv.h,v 1.2 2005-10-07 03:48:50 charles Exp $ * */ @@ -43,6 +43,8 @@ #define YMALLOC(x) malloc(x) #define YFREE(x) free(x) +#define YMALLOC_ALT(x) malloc(x) +#define YFREE_ALT(x) free(x) //#define YINFO(s) YPRINTF(( __FILE__ " %d %s\n",__LINE__,s)) -- 2.30.2