1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-13 13:18:06 +03:00

Patch from James Peach <jpeach@sgi.com>. Remove the MAX_CONNECTIONS limit

by increasing bitmap size. Limited by "max connections" parameter.
Bug #716.
Jeremy.
This commit is contained in:
Jeremy Allison 0001-01-01 00:00:00 +00:00
parent 67d893701f
commit 0be57a2eb0
2 changed files with 46 additions and 9 deletions

View 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
****************************************************************************/

View File

@ -21,11 +21,11 @@
#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) {