|
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 |
|