summary refs log tree commit diff
path: root/fs/nfs/read.c
diff options
context:
space:
mode:
authorChuck Lever <cel@netapp.com>2006-05-25 01:40:53 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2006-06-09 09:34:07 -0400
commit0d0b5cb36faf7002a11736032313f06d6f3d881c (patch)
treed767ae12fde00b553546aab9f5aa3e23cd86069d /fs/nfs/read.c
parentbf3fcf89552f24657bcfb6a9d73cd167ebb496c6 (diff)
downloadlinux-0d0b5cb36faf7002a11736032313f06d6f3d881c.tar.gz
NFS: Optimize allocation of nfs_read/write_data structures
Clean up use of page_array, and fix an off-by-one error noticed by Tom
Talpey which causes kmalloc calls in cases where using the page_array
is sufficient.

Test plan:
Normal client functional testing with r/wsize=32768.

Signed-off-by: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/read.c')
-rw-r--r--fs/nfs/read.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 4b5f58da5650..fd9018c692bb 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -51,14 +51,11 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
 	if (p) {
 		memset(p, 0, sizeof(*p));
 		INIT_LIST_HEAD(&p->pages);
-		if (pagecount < NFS_PAGEVEC_SIZE)
-			p->pagevec = &p->page_array[0];
+		if (pagecount <= ARRAY_SIZE(p->page_array))
+			p->pagevec = p->page_array;
 		else {
-			size_t size = ++pagecount * sizeof(struct page *);
-			p->pagevec = kmalloc(size, GFP_NOFS);
-			if (p->pagevec) {
-				memset(p->pagevec, 0, size);
-			} else {
+			p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS);
+			if (!p->pagevec) {
 				mempool_free(p, nfs_rdata_mempool);
 				p = NULL;
 			}