autofs-5.0.3 - fix ifc buff size fix 2 From: Ian Kent For the case of a large number of interfaces there can be a lot of malloc(3)s for every mount which could slow things down. So we remember the maximum allocation size and use it in subsequent allocations. --- modules/replicated.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/replicated.c b/modules/replicated.c index 35a6675..b435f4b 100644 --- a/modules/replicated.c +++ b/modules/replicated.c @@ -62,7 +62,10 @@ #ifndef MAX_ERR_BUF #define MAX_ERR_BUF 512 #endif + #define MAX_IFC_BUF 2048 +static int volatile ifc_buf_len = MAX_IFC_BUF; +static int volatile ifc_last_len = 0; #define MASK_A 0x7F000000 #define MASK_B 0xBFFF0000 @@ -97,7 +100,7 @@ void seed_random(void) static int alloc_ifreq(struct ifconf *ifc, int sock) { - int ret, lastlen = 0, len = MAX_IFC_BUF; + int ret, lastlen = ifc_last_len, len = ifc_buf_len; char err_buf[MAX_ERR_BUF], *buf; while (1) { @@ -119,7 +122,7 @@ static int alloc_ifreq(struct ifconf *ifc, int sock) return 0; } - if (ifc->ifc_len == lastlen) + if (ifc->ifc_len <= lastlen) break; lastlen = ifc->ifc_len; @@ -127,6 +130,11 @@ static int alloc_ifreq(struct ifconf *ifc, int sock) free(buf); } + if (lastlen != ifc_last_len) { + ifc_last_len = lastlen; + ifc_buf_len = len; + } + return 1; }