提交 50828d7e 编写于 作者: T Trond Myklebust

NFS: Cache rpc_ops in struct nfs_pageio_descriptor

Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 275acaaf
...@@ -327,6 +327,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc, struct list_head ...@@ -327,6 +327,7 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc, struct list_head
} while(nbytes != 0); } while(nbytes != 0);
atomic_set(&req->wb_complete, requests); atomic_set(&req->wb_complete, requests);
ClearPageError(page); ClearPageError(page);
desc->pg_rpc_callops = &nfs_read_partial_ops;
return ret; return ret;
out_bad: out_bad:
while (!list_empty(res)) { while (!list_empty(res)) {
...@@ -367,6 +368,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc, struct list_head * ...@@ -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); nfs_read_rpcsetup(req, data, desc->pg_count, 0);
list_add(&data->list, res); list_add(&data->list, res);
desc->pg_rpc_callops = &nfs_read_full_ops;
out: out:
return ret; return ret;
} }
...@@ -376,19 +378,14 @@ int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc) ...@@ -376,19 +378,14 @@ int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
LIST_HEAD(head); LIST_HEAD(head);
int ret; int ret;
if (desc->pg_bsize < PAGE_CACHE_SIZE) { if (desc->pg_bsize < PAGE_CACHE_SIZE)
ret = nfs_pagein_multi(desc, &head); ret = nfs_pagein_multi(desc, &head);
if (ret == 0) else
ret = nfs_do_multiple_reads(&head,
&nfs_read_partial_ops,
desc->pg_lseg);
} else {
ret = nfs_pagein_one(desc, &head); ret = nfs_pagein_one(desc, &head);
if (ret == 0)
ret = nfs_do_multiple_reads(&head, if (ret == 0)
&nfs_read_full_ops, ret = nfs_do_multiple_reads(&head, desc->pg_rpc_callops,
desc->pg_lseg); desc->pg_lseg);
}
put_lseg(desc->pg_lseg); put_lseg(desc->pg_lseg);
desc->pg_lseg = NULL; desc->pg_lseg = NULL;
return ret; return ret;
......
...@@ -975,6 +975,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc, struct list_head ...@@ -975,6 +975,7 @@ static int nfs_flush_multi(struct nfs_pageio_descriptor *desc, struct list_head
offset += len; offset += len;
} while (nbytes != 0); } while (nbytes != 0);
atomic_set(&req->wb_complete, requests); atomic_set(&req->wb_complete, requests);
desc->pg_rpc_callops = &nfs_write_partial_ops;
return ret; return ret;
out_bad: out_bad:
...@@ -1031,6 +1032,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc, struct list_head *r ...@@ -1031,6 +1032,7 @@ static int nfs_flush_one(struct nfs_pageio_descriptor *desc, struct list_head *r
/* Set up the argument struct */ /* Set up the argument struct */
nfs_write_rpcsetup(req, data, desc->pg_count, 0, desc->pg_ioflags); nfs_write_rpcsetup(req, data, desc->pg_count, 0, desc->pg_ioflags);
list_add(&data->list, res); list_add(&data->list, res);
desc->pg_rpc_callops = &nfs_write_full_ops;
out: out:
return ret; return ret;
} }
...@@ -1040,21 +1042,13 @@ int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc) ...@@ -1040,21 +1042,13 @@ int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
LIST_HEAD(head); LIST_HEAD(head);
int ret; int ret;
if (desc->pg_bsize < PAGE_CACHE_SIZE) { if (desc->pg_bsize < PAGE_CACHE_SIZE)
ret = nfs_flush_multi(desc, &head); ret = nfs_flush_multi(desc, &head);
if (ret == 0) else
ret = nfs_do_multiple_writes(&head,
&nfs_write_partial_ops,
desc->pg_lseg,
desc->pg_ioflags);
} else {
ret = nfs_flush_one(desc, &head); ret = nfs_flush_one(desc, &head);
if (ret == 0) if (ret == 0)
ret = nfs_do_multiple_writes(&head, ret = nfs_do_multiple_writes(&head, desc->pg_rpc_callops,
&nfs_write_full_ops, desc->pg_lseg, desc->pg_ioflags);
desc->pg_lseg,
desc->pg_ioflags);
}
put_lseg(desc->pg_lseg); put_lseg(desc->pg_lseg);
desc->pg_lseg = NULL; desc->pg_lseg = NULL;
return ret; return ret;
......
...@@ -74,6 +74,7 @@ struct nfs_pageio_descriptor { ...@@ -74,6 +74,7 @@ struct nfs_pageio_descriptor {
const struct nfs_pageio_ops *pg_ops; const struct nfs_pageio_ops *pg_ops;
int pg_ioflags; int pg_ioflags;
int pg_error; int pg_error;
const struct rpc_call_ops *pg_rpc_callops;
struct pnfs_layout_segment *pg_lseg; struct pnfs_layout_segment *pg_lseg;
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册