changeset 94:c53efc2aec17

Improve YDI lookup and device prefic handling
author charles
date Fri, 07 Oct 2005 04:48:50 +0100
parents 2b4deace2c2f
children ed3b54386260
files direct/dtest.c direct/yaffscfg2k.c direct/yaffsfs.c direct/ydirectenv.h
diffstat 4 files changed, 163 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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);
 	
 	
-	yaffs_unmount(mountpt);
-	
 }
+
+
 void scan_deleted_files_test(const char *mountpt)
 {
 	char fn[100];
@@ -1380,9 +1493,9 @@ void write_200k_file(const char *fn, con
    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");
 	
 	
 	
--- 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
 };
 
 
--- a/direct/yaffsfs.c
+++ b/direct/yaffsfs.c
@@ -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 *dir
 		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 *dir
 				INIT_LIST_HEAD(&search_contexts);
 				
 			list_add(&dsc->others,&search_contexts);	
-		}
+			yaffsfs_SetDirRewound(dsc);		}
 	
 	}
 	
--- a/direct/ydirectenv.h
+++ b/direct/ydirectenv.h
@@ -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))