cvs commit: src/sys/fs/msdosfs msdosfs_conv.c

Adam Gregoire ebola at psychoholics.org
Sat Mar 12 12:19:35 PST 2005


On Fri, 2005-03-11 at 23:27 +0000, Nate Lawson wrote:
> njl         2005-03-11 23:27:46 UTC
> 
>   FreeBSD src repository
> 
>   Modified files:
>     sys/fs/msdosfs       msdosfs_conv.c 
>   Log:
>   The mbnambuf routines combine multiple substrings into a single
>   long filename.  Each substring is indexed by the windows ID, a
>   sequential one-based value.  The previous code was extremely slow,
>   doing a malloc/strcpy/free for each substring.
>   
>   This code optimizes these routines with this in mind, using the ID
>   to index into a single array and concatenating each WIN_CHARS chunk
>   at once.  (The last chunk is variable-length.)
>   
>   This code has been tested as working on an FS with difficult filename
>   sizes (255, 13, 26, etc.)  It gives a 77.1% decrease in profiled
>   time (total across all functions) and a 73.7% decrease in wall time.
>   Test was "ls -laR > /dev/null".
>   
>   Per-function time savings:
>   mbnambuf_init:  -90.7%
>   mbnambuf_write: -18.7%
>   mbnambuf_flush: -67.1%
>   
>   MFC after:      1 month
>   
>   Revision  Changes    Path
>   1.40      +42 -37    src/sys/fs/msdosfs/msdosfs_conv.c
> _______________________________________________
> cvs-src at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/cvs-src
> To unsubscribe, send any mail to "cvs-src-unsubscribe at freebsd.org"

Patch to unbreak compile on amd64, others? Not sure if this is 100%
correct here, yoy will know better then me.

--- /usr/src/sys/fs/msdosfs/msdosfs_conv.c.orig Fri Mar 11 20:47:35 2005
+++ /usr/src/sys/fs/msdosfs/msdosfs_conv.c      Fri Mar 11 20:34:18 2005
@@ -1223,9 +1223,9 @@
	count = WIN_CHARS;
	if (id > nambuf_max_id) {
		count = strlen(name);
-		nambuf_len = id * WIN_CHARS + count;
+		nambuf_len = (size_t)id * WIN_CHARS + count;
		if (nambuf_len > MAXNAMLEN) {
-			printf("msdosfs: file name %d too long\n", nambuf_len);
+			printf("msdosfs: file name %d too long\n", (int)nambuf_len);
			return;
		}
		nambuf_max_id = id;

-------------- next part --------------
--- /usr/src/sys/fs/msdosfs/msdosfs_conv.c.orig	Fri Mar 11 20:47:35 2005
+++ /usr/src/sys/fs/msdosfs/msdosfs_conv.c	Fri Mar 11 20:34:18 2005
@@ -1223,9 +1223,9 @@
 	count = WIN_CHARS;
 	if (id > nambuf_max_id) {
 		count = strlen(name);
-		nambuf_len = id * WIN_CHARS + count;
+		nambuf_len = (size_t)id * WIN_CHARS + count;
 		if (nambuf_len > MAXNAMLEN) {
-			printf("msdosfs: file name %d too long\n", nambuf_len);
+			printf("msdosfs: file name %d too long\n", (int)nambuf_len);
 			return;
 		}
 		nambuf_max_id = id;


More information about the cvs-src mailing list