summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2011-07-12 13:42:02 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2011-07-15 09:12:20 -0400
commit50828d7e6767a92726708bc0666e2b8b84575808 (patch)
tree80f4a2fd19eb0cf232b6d5232eec28a45230c8e6
parent275acaafd45fbc8ecc3beabd6367e60b3049606a (diff)
NFS: Cache rpc_ops in struct nfs_pageio_descriptor
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/read.c19
-rw-r--r--fs/nfs/write.c20
-rw-r--r--include/linux/nfs_page.h1
3 files changed, 16 insertions, 24 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 0215bac35fc..c14362fbe65 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -327,6 +327,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc, struct list_head
} while(nbytes != 0);
atomic_set(&req->wb_complete, requests);
ClearPageError(page);
+ desc->pg_rpc_callops = &nfs_read_partial_ops;
return ret;
out_bad:
while (!list_empty(res)) {
@@ -367,6 +368,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc, struct list_head *
nfs_read_rpcsetup(req, data, desc->pg_count, 0);
list_add(&data->list, res);
+ desc->pg_rpc_callops = &nfs_read_full_ops;
out:
return ret;
}
@@ -376,19 +378,14 @@ int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
LIST_HEAD(head);
int ret;
- if (desc->pg_bsize < PAGE_CACHE_SIZE) {
+ if (desc->pg_bsize < PAGE_CACHE_SIZE)
ret = nfs_pagein_multi(desc, &head);
- if (ret == 0)
- ret = nfs_do_multiple_reads(&head,
- &nfs_read_partial_ops,
- desc->pg_lseg);
- } else {
+ else
ret = nfs_pagein_one(desc, &head);
- if (ret == 0)
- ret = nfs_do_multiple_reads(&head,
- &nfs_read_full_ops,
- desc->pg_lseg);
- }
+
+ if (ret == 0)
+ ret = nfs_do_multiple_reads(&head, desc->pg_rpc_callops,
+ desc->pg_lseg);
put_lseg(desc->pg_lseg);
desc->pg_lseg = NULL;
return ret;
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index bd4b34e5870..71fbba72ace 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -975,6 +975,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc, struct list_head
offset += len;
} while (nbytes != 0);
atomic_set(&req->wb_complete, requests);
+ desc->pg_rpc_callops = &nfs_write_partial_ops;
return ret;
out_bad:
@@ -1031,6 +1032,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc, struct list_head *r
/* Set up the argument struct */
nfs_write_rpcsetup(req, data, desc->pg_count, 0, desc->pg_ioflags);
list_add(&data->list, res);
+ desc->pg_rpc_callops = &nfs_write_full_ops;
out:
return ret;
}
@@ -1040,21 +1042,13 @@ int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
LIST_HEAD(head);
int ret;
- if (desc->pg_bsize < PAGE_CACHE_SIZE) {
+ if (desc->pg_bsize < PAGE_CACHE_SIZE)
ret = nfs_flush_multi(desc, &head);
- if (ret == 0)
- ret = nfs_do_multiple_writes(&head,
- &nfs_write_partial_ops,
- desc->pg_lseg,
- desc->pg_ioflags);
- } else {
+ else
ret = nfs_flush_one(desc, &head);
- if (ret == 0)
- ret = nfs_do_multiple_writes(&head,
- &nfs_write_full_ops,
- desc->pg_lseg,
- desc->pg_ioflags);
- }
+ if (ret == 0)
+ ret = nfs_do_multiple_writes(&head, desc->pg_rpc_callops,
+ desc->pg_lseg, desc->pg_ioflags);
put_lseg(desc->pg_lseg);
desc->pg_lseg = NULL;
return ret;
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index 9ac2dd158d0..db3194f6347 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -74,6 +74,7 @@ struct nfs_pageio_descriptor {
const struct nfs_pageio_ops *pg_ops;
int pg_ioflags;
int pg_error;
+ const struct rpc_call_ops *pg_rpc_callops;
struct pnfs_layout_segment *pg_lseg;
};