Patch from James Peach <jpeach@sgi.com>. Remove the MAX_CONNECTIONS limit
authorJeremy Allison <jra@samba.org>
Thu, 11 Dec 2003 20:00:16 +0000 (20:00 +0000)
committerJeremy Allison <jra@samba.org>
Thu, 11 Dec 2003 20:00:16 +0000 (20:00 +0000)
by increasing bitmap size. Limited by "max connections" parameter.
Bug #716.
Jeremy.
(This used to be commit fbbeb55b230ffc477f5563af66ab65eb6598e025)

source3/lib/bitmap.c
source3/smbd/conn.c

index 1023dd6541d8ea0f0a7be70d4c1dfce9e17e0474..3fa20cdd112c8429f39b253f6e953ec821001f8c 100644 (file)
@@ -83,6 +83,20 @@ struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n)
        return bm;
 }
 
+/****************************************************************************
+copy as much of the source bitmap as will fit in the destination bitmap.
+****************************************************************************/
+
+int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src)
+{
+        int count = MIN(dst->n, src->n);
+
+        SMB_ASSERT(dst->b != src->b);
+       memcpy(dst->b, src->b, sizeof(dst->b[0])*(count+31)/32);
+
+        return count;
+}
+
 /****************************************************************************
 set a bit in a bitmap
 ****************************************************************************/
index eb2d2bbcbf2da2089b8563ba9f0bd9d00b8794b3..289b7d611d6b927c7a340927507a2a155d8f3fe4 100644 (file)
 
 #include "includes.h"
 
-/* set these to define the limits of the server. NOTE These are on a
-   per-client basis. Thus any one machine can't connect to more than
-   MAX_CONNECTIONS services, but any number of machines may connect at
  one time. */
-#define MAX_CONNECTIONS 128
+/* The connections bitmap is expanded in increments of BITMAP_BLOCK_SZ. The
+ * maximum size of the bitmap is the largest positive integer, but you will hit
+ * the "max connections" limit, looong before that.
+ */
+#define BITMAP_BLOCK_SZ 128
 
 static connection_struct *Connections;
 
@@ -38,7 +38,7 @@ init the conn structures
 ****************************************************************************/
 void conn_init(void)
 {
-       bmap = bitmap_allocate(MAX_CONNECTIONS);
+       bmap = bitmap_allocate(BITMAP_BLOCK_SZ);
 }
 
 /****************************************************************************
@@ -96,12 +96,35 @@ connection_struct *conn_new(void)
        TALLOC_CTX *mem_ctx;
        connection_struct *conn;
        int i;
+        int find_offset = 1;
 
-       i = bitmap_find(bmap, 1);
+find_again:
+       i = bitmap_find(bmap, find_offset);
        
        if (i == -1) {
-               DEBUG(1,("ERROR! Out of connection structures\n"));            
-               return NULL;
+                /* Expand the connections bitmap. */
+                int             oldsz = bmap->n;
+                int             newsz = bmap->n + BITMAP_BLOCK_SZ;
+                struct bitmap * nbmap;
+
+                if (newsz <= 0) {
+                        /* Integer wrap. */
+                       DEBUG(0,("ERROR! Out of connection structures\n"));
+                        return NULL;
+                }
+
+               DEBUG(4,("resizing connections bitmap from %d to %d\n",
+                        oldsz, newsz));
+
+                nbmap = bitmap_allocate(newsz);
+
+                bitmap_copy(nbmap, bmap);
+                bitmap_free(bmap);
+
+                bmap = nbmap;
+                find_offset = oldsz; /* Start next search in the new portion. */
+
+                goto find_again;
        }
 
        if ((mem_ctx=talloc_init("connection_struct"))==NULL) {