Index: linux/fs/nfsd/nfsctl.c
diff -u linux/fs/nfsd/nfsctl.c:1.4 linux/fs/nfsd/nfsctl.c:1.4.8.1
--- linux/fs/nfsd/nfsctl.c:1.4	Sat Oct 24 11:36:37 1998
+++ linux/fs/nfsd/nfsctl.c	Tue Nov 24 10:00:33 1998
@@ -66,7 +66,9 @@
 	nfsd_cache_init();	/* RPC reply cache */
 	nfsd_export_init();	/* Exports table */
 	nfsd_lockd_init();	/* lockd->nfsd callbacks */
+#if 0	/* FIXME moved to nfsd_svc() */
 	nfsd_racache_init();	/* Readahead param cache */
+#endif
 	nfsd_fh_init();		/* FH table */
 	initialized = 1;
 }
Index: linux/fs/nfsd/nfssvc.c
diff -u linux/fs/nfsd/nfssvc.c:1.2 linux/fs/nfsd/nfssvc.c:1.2.8.1
--- linux/fs/nfsd/nfssvc.c:1.2	Sat Nov  7 16:43:38 1998
+++ linux/fs/nfsd/nfssvc.c	Tue Nov 24 10:00:33 1998
@@ -44,6 +44,8 @@
 struct timeval			nfssvc_boot = { 0, 0 };
 static int			nfsd_active = 0;
 
+extern int			nfsd_nservers;
+
 int
 nfsd_svc(unsigned short port, int nrservs)
 {
@@ -52,14 +54,17 @@
 
 	dprintk("nfsd: creating service\n");
 	error = -EINVAL;
-	if (nrservs < 0)
+	if (nrservs <= 0)
 		goto out;
 	if (nrservs > NFSD_MAXSERVS)
 		nrservs = NFSD_MAXSERVS;
+	nfsd_nservers = nrservs;
 
 	error = -ENOMEM;
+	nfsd_racache_init();     /* Readahead param cache */
+	/* FIXME error if no memory */
 	serv = svc_create(&nfsd_program, NFSD_BUFSIZE, NFSSVC_XDRSIZE);
-	if (serv == NULL) 
+	if (serv == NULL)
 		goto out;
 
 	if ((error = svc_makesock(serv, IPPROTO_UDP, port)) < 0
Index: linux/fs/nfsd/vfs.c
diff -u linux/fs/nfsd/vfs.c:1.5 linux/fs/nfsd/vfs.c:1.5.8.3
--- linux/fs/nfsd/vfs.c:1.5	Sat Nov  7 16:43:38 1998
+++ linux/fs/nfsd/vfs.c	Tue Nov 24 15:38:44 1998
@@ -73,10 +73,13 @@
 				p_rawin;
 };
 
-#define FILECACHE_MAX		(2 * NFSD_MAXSERVS)
-static struct raparms		raparms[FILECACHE_MAX];
+int nfsd_nservers = 0;
+#define FILECACHE_MAX		(2 * nfsd_nservers) 
+static struct raparms * 	raparml;
 static struct raparms *		raparm_cache = 0;
 
+
+
 /*
  * Lock a parent directory following the VFS locking protocol.
  */
@@ -1293,9 +1296,17 @@
 
 	if (raparm_cache)
 		return;
-	memset(raparms, 0, sizeof(raparms));
-	for (i = 0; i < FILECACHE_MAX - 1; i++) {
-		raparms[i].p_next = raparms + i + 1;
+	raparml = kmalloc(sizeof(struct raparms) * FILECACHE_MAX, GFP_KERNEL);
+
+	if (raparml != NULL) {
+dprintk("nfsd: allocating %d readahead buffers.\n", FILECACHE_MAX);
+		memset(raparml, 0, sizeof(struct raparms) * FILECACHE_MAX);
+		for (i = 0; i < FILECACHE_MAX - 1; i++) {
+			raparml[i].p_next = raparml + i + 1;
+		}
+	} else {
+		printk(KERN_WARNING
+		       "nfsd: Could not allocate memory read-ahead cache.\n");
 	}
-	raparm_cache = raparms;
+	raparm_cache = raparml;
 }
Index: linux/include/linux/nfsd/nfsd.h
diff -u linux/include/linux/nfsd/nfsd.h:1.1 linux/include/linux/nfsd/nfsd.h:1.1.12.1
--- linux/include/linux/nfsd/nfsd.h:1.1	Fri Oct 16 12:08:09 1998
+++ linux/include/linux/nfsd/nfsd.h	Tue Nov 24 10:00:37 1998
@@ -29,7 +29,7 @@
 /*
  * Maximum number of nfsd processes
  */
-#define NFSD_MAXSERVS		16
+#define NFSD_MAXSERVS		128
 
 #ifdef __KERNEL__
 /*
