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