fix
diff --git a/ChangeLog b/ChangeLog
index 947ef87..b0192d7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-10-18  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: optimize buffer reallocation in fill_dir.
+
 2005-10-17  Miklos Szeredi <miklos@szeredi.hu>
 
 	* Released 2.4.1
diff --git a/lib/fuse.c b/lib/fuse.c
index e44b9f2..b0cf553 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -103,6 +103,7 @@
     char *contents;
     int allocated;
     unsigned len;
+    unsigned size;
     unsigned needlen;
     int filled;
     unsigned long fh;
@@ -1261,7 +1262,6 @@
     unsigned namelen = strlen(name);
     unsigned entsize;
     unsigned newlen;
-    char *newptr;
 
     if (statp)
         stbuf = *statp;
@@ -1291,12 +1291,21 @@
             return 1;
     }
 
-    newptr = (char *) realloc(dh->contents, newlen);
-    if (!newptr) {
-        dh->error = -ENOMEM;
-        return 1;
+    if (newlen > dh->size) {
+        char *newptr;
+
+        if (!dh->size)
+            dh->size = 1024;
+        while (newlen > dh->size)
+            dh->size *= 2;
+
+        newptr = (char *) realloc(dh->contents, dh->size);
+        if (!newptr) {
+            dh->error = -ENOMEM;
+            return 1;
+        }
+        dh->contents = newptr;
     }
-    dh->contents = newptr;
     fuse_add_dirent(dh->contents + dh->len, name, &stbuf, off ? off : newlen);
     dh->len = newlen;
     return 0;