diff -urp linux-2.6.27-rc6-git4/fs/nfs/client.c linux-2.6.27-rc6-git4-nfs_ra/fs/nfs/client.c --- linux-2.6.27-rc6-git4/fs/nfs/client.c 2008-09-17 11:35:21.000000000 +0200 +++ linux-2.6.27-rc6-git4-nfs_ra/fs/nfs/client.c 2008-09-17 11:55:18.000000000 +0200 @@ -722,6 +722,11 @@ error: } /* + * NFS Client Read-Ahead factor +*/ +unsigned int nfs_ra_factor; + +/* * Load up the server record from information gained in an fsinfo record */ static void nfs_server_set_fsinfo(struct nfs_server *server, struct nfs_fsinfo *fsinfo) @@ -746,7 +751,11 @@ static void nfs_server_set_fsinfo(struct server->rsize = NFS_MAX_FILE_IO_SIZE; server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD; + dprintk("nfs_server_set_fsinfo: rsize, wsize, rpages, \ + nfs_ra_factor, ra_pages: %d %d %d %d %d\n", + server->rsize,server->wsize,server->rpages, + nfs_ra_factor,server->rpages * nfs_ra_factor); + server->backing_dev_info.ra_pages = server->rpages * nfs_ra_factor; if (server->wsize > max_rpc_payload) server->wsize = max_rpc_payload; diff -urp linux-2.6.27-rc6-git4/fs/nfs/inode.c linux-2.6.27-rc6-git4-nfs_ra/fs/nfs/inode.c --- linux-2.6.27-rc6-git4/fs/nfs/inode.c 2008-09-17 11:35:21.000000000 +0200 +++ linux-2.6.27-rc6-git4-nfs_ra/fs/nfs/inode.c 2008-09-17 11:45:09.000000000 +0200 @@ -53,6 +53,8 @@ /* Default is to see 64-bit inode numbers */ static int enable_ino64 = NFS_64_BIT_INODE_NUMBERS_ENABLED; +static unsigned int ra_factor __read_mostly = NFS_MAX_READAHEAD; + static void nfs_invalidate_inode(struct inode *); static int nfs_update_inode(struct inode *, struct nfs_fattr *); @@ -1347,6 +1349,12 @@ static int __init init_nfs_fs(void) #endif if ((err = register_nfs_fs()) != 0) goto out; + + if (ra_factor < 1 || ra_factor > NFS_MAX_READAHEAD) + nfs_ra_factor = NFS_MAX_READAHEAD; + else + nfs_ra_factor = ra_factor; + return 0; out: #ifdef CONFIG_PROC_FS @@ -1388,6 +1396,10 @@ static void __exit exit_nfs_fs(void) MODULE_AUTHOR("Olaf Kirch "); MODULE_LICENSE("GPL"); module_param(enable_ino64, bool, 0644); +MODULE_PARM_DESC(enable_ino64, "Enable 64-bit inode numbers (Default: 1)"); +module_param(ra_factor, uint, 0644); +MODULE_PARM_DESC(ra_factor, + "Number of rsize read-ahead requests (Default/Max: 15, Min: 1)"); module_init(init_nfs_fs) module_exit(exit_nfs_fs) diff -urp linux-2.6.27-rc6-git4/fs/nfs/sysctl.c linux-2.6.27-rc6-git4-nfs_ra/fs/nfs/sysctl.c --- linux-2.6.27-rc6-git4/fs/nfs/sysctl.c 2008-07-13 23:51:29.000000000 +0200 +++ linux-2.6.27-rc6-git4-nfs_ra/fs/nfs/sysctl.c 2008-09-17 11:45:09.000000000 +0200 @@ -14,9 +14,12 @@ #include #include "callback.h" +#include "internal.h" static const int nfs_set_port_min = 0; static const int nfs_set_port_max = 65535; +static const unsigned int min_nfs_ra_factor = 1; +static const unsigned int max_nfs_ra_factor = NFS_MAX_READAHEAD; static struct ctl_table_header *nfs_callback_sysctl_table; static ctl_table nfs_cb_sysctls[] = { @@ -58,6 +61,16 @@ static ctl_table nfs_cb_sysctls[] = { .mode = 0644, .proc_handler = &proc_dointvec, }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "nfs_ra_factor", + .data = &nfs_ra_factor, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = &proc_dointvec_minmax, + .extra1 = (unsigned int *)&min_nfs_ra_factor, + .extra2 = (unsigned int *)&max_nfs_ra_factor, + }, { .ctl_name = 0 } }; diff -urp linux-2.6.27-rc6-git4/include/linux/nfs_fs.h linux-2.6.27-rc6-git4-nfs_ra/include/linux/nfs_fs.h --- linux-2.6.27-rc6-git4/include/linux/nfs_fs.h 2008-09-17 11:35:25.000000000 +0200 +++ linux-2.6.27-rc6-git4-nfs_ra/include/linux/nfs_fs.h 2008-09-17 11:45:09.000000000 +0200 @@ -464,6 +464,11 @@ extern int nfs_writeback_done(struct rpc extern void nfs_writedata_release(void *); /* + * linux/fs/nfs/client.c +*/ +extern unsigned int nfs_ra_factor; + +/* * Try to write back everything synchronously (but check the * return value!) */ diff -urp linux-2.6.27-rc6-git4/Makefile linux-2.6.27-rc6-git4-nfs_ra/Makefile --- linux-2.6.27-rc6-git4/Makefile 2008-09-17 11:35:56.000000000 +0200 +++ linux-2.6.27-rc6-git4-nfs_ra/Makefile 2008-09-17 11:45:09.000000000 +0200 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 27 -EXTRAVERSION = -rc6-git4 +EXTRAVERSION = -rc6-git4-nfs_ra NAME = Rotary Wombat # *DOCUMENTATION*