aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/vfs.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2006-10-04 05:15:46 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-04 10:55:15 -0400
commit4452435948424e5322c2a2fefbdc2cf3732cc45d (patch)
treed2082c68d33298e85298852cafde7999ccca3364 /fs/nfsd/vfs.c
parent5680c44632053a6c9464bca43083f01776d318da (diff)
[PATCH] knfsd: Replace two page lists in struct svc_rqst with one
We are planning to increase RPCSVC_MAXPAGES from about 8 to about 256. This means we need to be a bit careful about arrays of size RPCSVC_MAXPAGES. struct svc_rqst contains two such arrays. However the there are never more that RPCSVC_MAXPAGES pages in the two arrays together, so only one array is needed. The two arrays are for the pages holding the request, and the pages holding the reply. Instead of two arrays, we can simply keep an index into where the first reply page is. This patch also removes a number of small inline functions that probably server to obscure what is going on rather than clarify it, and opencode the needed functionality. Also remove the 'rq_restailpage' variable as it is *always* 0. i.e. if the response 'xdr' structure has a non-empty tail it is always in the same pages as the head. check counters are initilised and incr properly check for consistant usage of ++ etc maybe extra some inlines for common approach general review Signed-off-by: Neil Brown <neilb@suse.de> Cc: Magnus Maatta <novell@kiruna.se> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/nfsd/vfs.c')
-rw-r--r--fs/nfsd/vfs.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index 443ebc52e382..bfd36e587ec5 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -791,22 +791,26 @@ nfsd_read_actor(read_descriptor_t *desc, struct page *page, unsigned long offset
791{ 791{
792 unsigned long count = desc->count; 792 unsigned long count = desc->count;
793 struct svc_rqst *rqstp = desc->arg.data; 793 struct svc_rqst *rqstp = desc->arg.data;
794 struct page **pp = rqstp->rq_respages + rqstp->rq_resused;
794 795
795 if (size > count) 796 if (size > count)
796 size = count; 797 size = count;
797 798
798 if (rqstp->rq_res.page_len == 0) { 799 if (rqstp->rq_res.page_len == 0) {
799 get_page(page); 800 get_page(page);
800 rqstp->rq_respages[rqstp->rq_resused++] = page; 801 put_page(*pp);
802 *pp = page;
803 rqstp->rq_resused++;
801 rqstp->rq_res.page_base = offset; 804 rqstp->rq_res.page_base = offset;
802 rqstp->rq_res.page_len = size; 805 rqstp->rq_res.page_len = size;
803 } else if (page != rqstp->rq_respages[rqstp->rq_resused-1]) { 806 } else if (page != pp[-1]) {
804 get_page(page); 807 get_page(page);
805 rqstp->rq_respages[rqstp->rq_resused++] = page; 808 put_page(*pp);
809 *pp = page;
810 rqstp->rq_resused++;
806 rqstp->rq_res.page_len += size; 811 rqstp->rq_res.page_len += size;
807 } else { 812 } else
808 rqstp->rq_res.page_len += size; 813 rqstp->rq_res.page_len += size;
809 }
810 814
811 desc->count = count - size; 815 desc->count = count - size;
812 desc->written += size; 816 desc->written += size;
@@ -837,7 +841,7 @@ nfsd_vfs_read(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
837 file->f_ra = ra->p_ra; 841 file->f_ra = ra->p_ra;
838 842
839 if (file->f_op->sendfile && rqstp->rq_sendfile_ok) { 843 if (file->f_op->sendfile && rqstp->rq_sendfile_ok) {
840 svc_pushback_unused_pages(rqstp); 844 rqstp->rq_resused = 1;
841 err = file->f_op->sendfile(file, &offset, *count, 845 err = file->f_op->sendfile(file, &offset, *count,
842 nfsd_read_actor, rqstp); 846 nfsd_read_actor, rqstp);
843 } else { 847 } else {