Improve YDI lookup and device prefic handling
authorcharles <charles>
Fri, 7 Oct 2005 03:48:50 +0000 (03:48 +0000)
committercharles <charles>
Fri, 7 Oct 2005 03:48:50 +0000 (03:48 +0000)
direct/dtest.c
direct/yaffscfg2k.c
direct/yaffsfs.c
direct/ydirectenv.h

index 096ea7e1932ed59fe7b629b11bdeb9f5bd49555f..3679b25b86b357f34ef0b3ff5f1fd653cde3f734 100644 (file)
@@ -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)
 {
 
 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 i;
+       int h;
        char a[100];
        char b[100];
        
        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);
        
        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_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];
 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);
    
    
    yaffs_unlink(fdel1);
    
    
-   
 }
 
 }
 
+
 void verify_200k_file(const char *fn)
 {
    int h1;
 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");
        //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");
        
        
        
        
        
        
index 9c45524774993f7097c7821faa58057cebc5455b..e63411ad27f1a94561bf6c99300742bea501f12a 100644 (file)
@@ -59,12 +59,19 @@ static yaffs_Device flashDev;
 static yaffs_Device ram2kDev;
 
 static yaffsfs_DeviceConfiguration yaffsfs_config[] = {
 static yaffs_Device ram2kDev;
 
 static yaffsfs_DeviceConfiguration yaffsfs_config[] = {
-
+#if 0
        { "/ram", &ramDev},
        { "/boot", &bootDev},
        { "/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}
        { "/ram2k", &ram2kDev},
        {(void *)0,(void *)0}
+#endif
 };
 
 
 };
 
 
index 956df2c751bc60eb7cded9d29bed0f580772350c..4f06f9c6ef10e41e390bf0e58bf5b8fe5f007eec 100644 (file)
@@ -25,7 +25,7 @@
 #endif
 
 
 #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;
 
 // 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.
 // 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;
 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(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++;
                {
                        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;
                {
                        // Matched prefix
                        *restOfPath = (char *)leftOver;
-                       return cfg->dev;
+                       retval = cfg->dev;
+                       longestMatch = thisMatchLength;
                }
                cfg++;
        }
                }
                cfg++;
        }
-       return NULL;
+       return retval;
 }
 
 static yaffs_Object *yaffsfs_FindRoot(const char *path, char **restOfPath)
 }
 
 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)
                {
                dir = (yaffs_DIR *)dsc;
                if(dsc)
                {
+                       memset(dsc,0,sizeof(yaffsfs_DirectorySearchContext));
                        dsc->magic = YAFFS_MAGIC;
                        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);
                        
                        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);        
                                INIT_LIST_HEAD(&search_contexts);
                                
                        list_add(&dsc->others,&search_contexts);        
-               }
+                       yaffsfs_SetDirRewound(dsc);             }
        
        }
        
        
        }
        
index 2b39af5f4cb07e7b349fb70d17179344a84bea68..561c8b552c2cd0bd7837a68d53b71e4d2c1fa9e5 100644 (file)
@@ -14,7 +14,7 @@
  *
  * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
  *
  *
  * 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(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))
 
 
 //#define YINFO(s) YPRINTF(( __FILE__ " %d %s\n",__LINE__,s))